Browse Source

Improving the Logger

Panagiotis Christopoulos Charitos 14 years ago
parent
commit
9397c1b482
2 changed files with 50 additions and 51 deletions
  1. 7 11
      src/Core/Logger.cpp
  2. 43 40
      src/Core/Logger.h

+ 7 - 11
src/Core/Logger.cpp

@@ -39,11 +39,11 @@ Logger& Logger::operator<<(Logger& (*funcPtr)(Logger&))
 	if(funcPtr == endl)
 	{
 		append("\n", 1);
-		flush();
+		realFlush();
 	}
-	else if(funcPtr == ::flush)
+	else if(funcPtr == flush)
 	{
-		flush();
+		realFlush();
 	}
 
 	return *this;
@@ -71,7 +71,7 @@ void Logger::write(const char* file_, int line_, const char* func_, const char*
 	line = line_;
 	func = func_;
 	append(msg, strlen(msg));
-	flush();
+	realFlush();
 }
 
 
@@ -92,8 +92,6 @@ void Logger::execCommonConstructionCode()
 //======================================================================================================================
 void Logger::append(const char* cstr, int len)
 {
-	mutex.lock();
-
 	if(len > STREAM_SIZE - 1)
 	{
 		const char ERR[] = "**logger buffer overflow**";
@@ -109,22 +107,20 @@ void Logger::append(const char* cstr, int len)
 		// Handle overflow
 		memcpy(sptr, cstr, charsLeft);
 		sptr += charsLeft;
-		flush();
-		mutex.unlock();
+		realFlush();
 		append(cstr + charsLeft, len - charsLeft);
 		return;
 	}
 
 	memcpy(sptr, cstr, len);
 	sptr += len;
-	mutex.unlock();
 }
 
 
 //======================================================================================================================
-// flush                                                                                                               =
+// realFlush                                                                                                           =
 //======================================================================================================================
-void Logger::flush()
+void Logger::realFlush()
 {
 	*sptr = '\0';
 	sig(file, line, func, &streamBuf[0]);

+ 43 - 40
src/Core/Logger.h

@@ -8,13 +8,19 @@
 #include "Singleton.h"
 
 
-struct LoggerSender;
-
-
 /// The logger singleton class. The logger cannot print errors or throw exceptions, it has to recover somehow. Its
 /// thread safe
 class Logger
 {
+	private:
+		/// Record the sender
+		struct LoggerSender
+		{
+			const char* file;
+			int line;
+			const char* func;
+		};
+
 	public:
 		typedef boost::signals2::signal<void (const char*, int, const char*, const char*)> Signal; ///< Signal type
 
@@ -46,9 +52,29 @@ class Logger
 		Logger& operator<<(const LoggerSender& sender);
 		/// @}
 
+		/// @name IO manipulation
+		/// @{
+
+		/// Help the Logger to set the sender
+		static LoggerSender setSender(const char* file, int line, const char* func);
+
+		/// Add a new line and flush the Logger
+		static Logger& endl(Logger& logger) {return logger;}
+
+		/// Flush the Logger
+		static Logger& flush(Logger& logger) {return logger;}
+
+		/// @}
+
 		/// An alternative method to write in the Logger
 		void write(const char* file, int line, const char* func, const char* msg);
 
+		/// Mutex lock
+		void lock() {mutex.lock();}
+
+		/// Mutex unlock
+		void unlock() {mutex.unlock();}
+
 	private:
 		static const int STREAM_SIZE = 2048;
 		boost::array<char, STREAM_SIZE> streamBuf;
@@ -66,7 +92,7 @@ class Logger
 		void append(const char* cstr, int len);
 
 		/// Append finalize streamBuf and send the signal
-		void flush();
+		void realFlush();
 
 		/// Because we are bored to write
 		template<typename Type>
@@ -78,6 +104,13 @@ class Logger
 // Inlines                                                                                                             =
 //======================================================================================================================
 
+inline Logger::LoggerSender Logger::setSender(const char* file, int line, const char* func)
+{
+	LoggerSender sender = {file, line, func};
+	return sender;
+}
+
+
 template<typename Type>
 Logger& Logger::appendUsingLexicalCast(const Type& val)
 {
@@ -95,47 +128,17 @@ Logger& Logger::appendUsingLexicalCast(const Type& val)
 }
 
 
-//======================================================================================================================
-// IO manipulation non-members                                                                                         =
-//======================================================================================================================
-
-/// Add a new line and flush the Logger
-inline Logger& endl(Logger& logger)
-{
-	return logger;
-}
-
-
-/// Flush the Logger
-inline Logger& flush(Logger& logger)
-{
-	return logger;
-}
-
-
-/// Record the sender
-struct LoggerSender
-{
-	const char* file;
-	int line;
-	const char* func;
-};
-
-
-/// Help the Logger to set the sender
-inline LoggerSender setSender(const char* file, int line, const char* func)
-{
-	LoggerSender sender = {file, line, func};
-	return sender;
-}
-
-
 //======================================================================================================================
 // Macros                                                                                                              =
 //======================================================================================================================
 
 #define LOGGER_MESSAGE(x) \
-	LoggerSingleton::getInstance()  << setSender(__FILE__, __LINE__, __func__) << x << endl;
+	do \
+	{ \
+		LoggerSingleton::getInstance().lock(); \
+		LoggerSingleton::getInstance()  << Logger::setSender(__FILE__, __LINE__, __func__) << x << Logger::endl; \
+		LoggerSingleton::getInstance().unlock(); \
+	} while(false);
 
 #define INFO(x) LOGGER_MESSAGE("Info: " << x)