diff --git a/src/lib/utils/logger.cpp b/src/lib/utils/logger.cpp index 4f3bf4e6..807671fb 100644 --- a/src/lib/utils/logger.cpp +++ b/src/lib/utils/logger.cpp @@ -69,8 +69,8 @@ LevelType calcLevel(const string level) } -LogMessage::LogMessage(const int area, const int level, const string text, const bool running) - : m_area(area), m_level(level), m_text(text), m_running(running) +LogMessage::LogMessage(const int area, const int level, const string text) + : m_area(area), m_level(level), m_text(text) { char time[24]; struct timeval tv; @@ -88,26 +88,29 @@ LogMessage::LogMessage(const int area, const int level, const string text, const } +LogSink::~LogSink() +{ + m_logQueue.add(NULL); + + Thread::join(); + + while (m_logQueue.size() > 0) { + LogMessage* message = m_logQueue.remove(false); + delete message; + } +} void LogSink::addMessage(const LogMessage& message) { - LogMessage* tmp = new LogMessage(LogMessage(message)); - m_logQueue.add((tmp)); + m_logQueue.add(new LogMessage(LogMessage(message))); } void LogSink::run() { - while (1) { + while (isRunning() == true) { LogMessage* message = m_logQueue.remove(); - if (message->isRunning() == false) { - delete message; - while (m_logQueue.size() == true) { - LogMessage* message = m_logQueue.remove(); - write(*message); - delete message; - } - return; - } + if (message == NULL) + break; write(*message); delete message; @@ -201,29 +204,23 @@ void Logger::log(const int area, const int level, const string& data, ...) } -bool Logger::handleMessage(LogMessage* message) { - bool running = true; +void Logger::handleMessage(LogMessage* message) { + if (message == NULL) + return; + sinkCI_t iter = m_sinks.begin(); for (; iter != m_sinks.end(); ++iter) { if (*iter != 0) { if ((((*iter)->getAreaMask() & (1 << message->getArea())) != 0 - && (*iter)->getLevel() >= message->getLevel()) - && message->isRunning() == true) { + && (*iter)->getLevel() >= message->getLevel())) { (*iter)->addMessage(*message); } - else if (message->isRunning() == false) { - (*iter)->addMessage(*message); - running = false; - } - } } delete message; - - return running; } bool Logger::start(const char* name) @@ -235,13 +232,18 @@ bool Logger::start(const char* name) void Logger::run() { - while (handleMessage(m_logQueue.remove())); + while (isRunning() == true) { + LogMessage* message = m_logQueue.remove(); + if (message == NULL) + break; + handleMessage(message); + } } void Logger::stop() { - m_logQueue.add(new LogMessage(LogMessage(bas, error, "", false))); + m_logQueue.add(NULL); usleep(100000); Thread::stop(); } diff --git a/src/lib/utils/logger.h b/src/lib/utils/logger.h index c54d450c..813ffa78 100644 --- a/src/lib/utils/logger.h +++ b/src/lib/utils/logger.h @@ -76,9 +76,8 @@ public: * @param area the logging area of the message. * @param level the logging level of the message. * @param text the logging message. - * @param running the status of logging subsystem. */ - LogMessage(const int area, const int level, const string text, const bool running=true); + LogMessage(const int area, const int level, const string text); /** * @brief get the logging area. @@ -98,12 +97,6 @@ public: */ string getText() const { return m_text.c_str(); } - /** - * @brief status of logging subsystem. - * @return false if logging subsystem is going down. - */ - bool isRunning() const { return m_running; } - /** * @brief get the logging timestamp. * @return the logging timestamp. @@ -120,9 +113,6 @@ private: /** the logging message. */ string m_text; - /** true if this instance is running. */ - bool m_running; - /** the logging timestamp. */ string m_time; @@ -142,6 +132,11 @@ public: */ LogSink(const int areaMask, const int level) : m_areaMask(areaMask), m_level(level) {} + /** + * @brief destructor. + */ + virtual ~LogSink(); + /** * @brief adds the logging message to internal message queue. * @param message a reference to logging message. @@ -188,6 +183,8 @@ private: /** the logging level. */ int m_level; +protected: + /** * @brief virtual function for writing the logging message. * @param message the logging message. @@ -212,12 +209,18 @@ public: LogConsole(const int areaMask, const int level, const char* name) : LogSink(areaMask, level) { this->start(name); } -private: + /** + * @brief destructor. + */ + virtual ~LogConsole() {} + +protected: + /** * @brief write the logging message to stdout. * @param message the logging message. */ - void write(const LogMessage& message) const; + virtual void write(const LogMessage& message) const; }; @@ -238,15 +241,23 @@ public: LogFile(const int areaMask, const int level, const char* name, const char* file) : LogSink(areaMask, level), m_file(file) { this->start(name); } + /** + * @brief destructor. + */ + virtual ~LogFile() {} + private: + /** the logging file */ string m_file; +protected: + /** * @brief write the logging message to specific log file. * @param message the logging message. */ - void write(const LogMessage& message) const; + virtual void write(const LogMessage& message) const; }; @@ -266,7 +277,7 @@ public: /** * @brief destructor. */ - ~Logger(); + virtual ~Logger(); /** * @brief adds a logging sink and returns the reference to logger. @@ -301,16 +312,14 @@ public: //@copydoc virtual bool start(const char* name); - /** - * @brief endless loop for logger instance. - */ - virtual void run(); - - /** - * @brief shutdown logger subsystem. - */ + //@copydoc virtual void stop(); +protected: + + //@copydoc + virtual void run(); + private: /** * @brief private construtor. @@ -333,9 +342,8 @@ private: /** * @brief Distribute the @a LogMessage to all known sinks and delete it afterwards. * @param mesage the @a LogMessage to distribute. - * @return true to continue running, false to stop. */ - bool handleMessage(LogMessage* message); + void handleMessage(LogMessage* message); /** typedefs for a vector of type LogSink* */ typedef vector sink_t;