fixed cleanup and memory leaks, cosmetics

This commit is contained in:
john30
2014-12-27 12:35:53 +01:00
parent 72eb26805a
commit 259fb11051
2 changed files with 62 additions and 52 deletions
+29 -27
View File
@@ -69,8 +69,8 @@ LevelType calcLevel(const string level)
} }
LogMessage::LogMessage(const int area, const int level, const string text, const bool running) LogMessage::LogMessage(const int area, const int level, const string text)
: m_area(area), m_level(level), m_text(text), m_running(running) : m_area(area), m_level(level), m_text(text)
{ {
char time[24]; char time[24];
struct timeval tv; 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) void LogSink::addMessage(const LogMessage& message)
{ {
LogMessage* tmp = new LogMessage(LogMessage(message)); m_logQueue.add(new LogMessage(LogMessage(message)));
m_logQueue.add((tmp));
} }
void LogSink::run() void LogSink::run()
{ {
while (1) { while (isRunning() == true) {
LogMessage* message = m_logQueue.remove(); LogMessage* message = m_logQueue.remove();
if (message->isRunning() == false) { if (message == NULL)
delete message; break;
while (m_logQueue.size() == true) {
LogMessage* message = m_logQueue.remove();
write(*message);
delete message;
}
return;
}
write(*message); write(*message);
delete message; delete message;
@@ -201,29 +204,23 @@ void Logger::log(const int area, const int level, const string& data, ...)
} }
bool Logger::handleMessage(LogMessage* message) { void Logger::handleMessage(LogMessage* message) {
bool running = true; if (message == NULL)
return;
sinkCI_t iter = m_sinks.begin(); sinkCI_t iter = m_sinks.begin();
for (; iter != m_sinks.end(); ++iter) { for (; iter != m_sinks.end(); ++iter) {
if (*iter != 0) { if (*iter != 0) {
if ((((*iter)->getAreaMask() & (1 << message->getArea())) != 0 if ((((*iter)->getAreaMask() & (1 << message->getArea())) != 0
&& (*iter)->getLevel() >= message->getLevel()) && (*iter)->getLevel() >= message->getLevel())) {
&& message->isRunning() == true) {
(*iter)->addMessage(*message); (*iter)->addMessage(*message);
} }
else if (message->isRunning() == false) {
(*iter)->addMessage(*message);
running = false;
}
} }
} }
delete message; delete message;
return running;
} }
bool Logger::start(const char* name) bool Logger::start(const char* name)
@@ -235,13 +232,18 @@ bool Logger::start(const char* name)
void Logger::run() 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() void Logger::stop()
{ {
m_logQueue.add(new LogMessage(LogMessage(bas, error, "", false))); m_logQueue.add(NULL);
usleep(100000); usleep(100000);
Thread::stop(); Thread::stop();
} }
+33 -25
View File
@@ -76,9 +76,8 @@ public:
* @param area the logging area of the message. * @param area the logging area of the message.
* @param level the logging level of the message. * @param level the logging level of the message.
* @param text the logging 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. * @brief get the logging area.
@@ -98,12 +97,6 @@ public:
*/ */
string getText() const { return m_text.c_str(); } 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. * @brief get the logging timestamp.
* @return the logging timestamp. * @return the logging timestamp.
@@ -120,9 +113,6 @@ private:
/** the logging message. */ /** the logging message. */
string m_text; string m_text;
/** true if this instance is running. */
bool m_running;
/** the logging timestamp. */ /** the logging timestamp. */
string m_time; string m_time;
@@ -142,6 +132,11 @@ public:
*/ */
LogSink(const int areaMask, const int level) : m_areaMask(areaMask), m_level(level) {} 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. * @brief adds the logging message to internal message queue.
* @param message a reference to logging message. * @param message a reference to logging message.
@@ -188,6 +183,8 @@ private:
/** the logging level. */ /** the logging level. */
int m_level; int m_level;
protected:
/** /**
* @brief virtual function for writing the logging message. * @brief virtual function for writing the logging message.
* @param message the logging message. * @param message the logging message.
@@ -212,12 +209,18 @@ public:
LogConsole(const int areaMask, const int level, const char* name) LogConsole(const int areaMask, const int level, const char* name)
: LogSink(areaMask, level) { this->start(name); } : LogSink(areaMask, level) { this->start(name); }
private: /**
* @brief destructor.
*/
virtual ~LogConsole() {}
protected:
/** /**
* @brief write the logging message to stdout. * @brief write the logging message to stdout.
* @param message the logging message. * @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) LogFile(const int areaMask, const int level, const char* name, const char* file)
: LogSink(areaMask, level), m_file(file) { this->start(name); } : LogSink(areaMask, level), m_file(file) { this->start(name); }
/**
* @brief destructor.
*/
virtual ~LogFile() {}
private: private:
/** the logging file */ /** the logging file */
string m_file; string m_file;
protected:
/** /**
* @brief write the logging message to specific log file. * @brief write the logging message to specific log file.
* @param message the logging message. * @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. * @brief destructor.
*/ */
~Logger(); virtual ~Logger();
/** /**
* @brief adds a logging sink and returns the reference to logger. * @brief adds a logging sink and returns the reference to logger.
@@ -301,16 +312,14 @@ public:
//@copydoc //@copydoc
virtual bool start(const char* name); virtual bool start(const char* name);
/** //@copydoc
* @brief endless loop for logger instance.
*/
virtual void run();
/**
* @brief shutdown logger subsystem.
*/
virtual void stop(); virtual void stop();
protected:
//@copydoc
virtual void run();
private: private:
/** /**
* @brief private construtor. * @brief private construtor.
@@ -333,9 +342,8 @@ private:
/** /**
* @brief Distribute the @a LogMessage to all known sinks and delete it afterwards. * @brief Distribute the @a LogMessage to all known sinks and delete it afterwards.
* @param mesage the @a LogMessage to distribute. * @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* */ /** typedefs for a vector of type LogSink* */
typedef vector<LogSink*> sink_t; typedef vector<LogSink*> sink_t;