From 4b7ff1d97f55612fa3641dc16f41e2b4bfb21371 Mon Sep 17 00:00:00 2001 From: john30 Date: Thu, 18 Dec 2014 23:05:11 +0100 Subject: [PATCH] directly forward messages to sinks until Thread is started --- src/lib/utils/logger.cpp | 64 ++++++++++++++++++++++++---------------- src/lib/utils/logger.h | 15 +++++++++- 2 files changed, 52 insertions(+), 27 deletions(-) diff --git a/src/lib/utils/logger.cpp b/src/lib/utils/logger.cpp index 6fbb6ddd..4f3bf4e6 100644 --- a/src/lib/utils/logger.cpp +++ b/src/lib/utils/logger.cpp @@ -181,14 +181,18 @@ Logger& Logger::operator-=(const LogSink* sink) void Logger::log(const int area, const int level, const string& data, ...) { - if (isRunning() == true) { + if (m_direct == true || isRunning() == true) { char* tmp; va_list ap; va_start(ap, data); if (vasprintf(&tmp, data.c_str(), ap) != -1) { string buffer(tmp); - m_logQueue.add(new LogMessage(area, level, buffer)); + LogMessage* message = new LogMessage(area, level, buffer); + if (m_direct == true) + handleMessage(message); + else + m_logQueue.add(message); } va_end(ap); @@ -197,34 +201,42 @@ void Logger::log(const int area, const int level, const string& data, ...) } +bool Logger::handleMessage(LogMessage* message) { + bool running = true; + 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)->addMessage(*message); + } + else if (message->isRunning() == false) { + (*iter)->addMessage(*message); + running = false; + } + + } + } + + delete message; + + return running; +} + +bool Logger::start(const char* name) +{ + m_direct = false; + return Thread::start(name); +} + void Logger::run() { - bool running = true; - do { - LogMessage* message = m_logQueue.remove(); + while (handleMessage(m_logQueue.remove())); - 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)->addMessage(*message); - } - else if (message->isRunning() == false) { - (*iter)->addMessage(*message); - running = false; - } - - } - } - - delete message; - - } while (running == true); } void Logger::stop() diff --git a/src/lib/utils/logger.h b/src/lib/utils/logger.h index 125ebe39..c54d450c 100644 --- a/src/lib/utils/logger.h +++ b/src/lib/utils/logger.h @@ -298,6 +298,9 @@ public: */ LogSink* getSink(const int index) const { return(m_sinks[index]); } + //@copydoc + virtual bool start(const char* name); + /** * @brief endless loop for logger instance. */ @@ -312,7 +315,7 @@ private: /** * @brief private construtor. */ - Logger() {} + Logger() : m_direct(true) {} /** * @brief private copy construtor. @@ -327,12 +330,22 @@ private: */ Logger& operator=(const Logger&); + /** + * @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); + /** typedefs for a vector of type LogSink* */ typedef vector sink_t; /** typedefs for a vector of type LogSink* iterator */ typedef vector::iterator sinkCI_t; + /** true to directly log to all sinks, false to buffer via @a m_logQueue. */ + bool m_direct; + /** vector of available logging sinks */ sink_t m_sinks;