fixed cleanup and memory leaks, cosmetics
This commit is contained in:
+29
-27
@@ -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();
|
||||
}
|
||||
|
||||
+33
-25
@@ -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<LogSink*> sink_t;
|
||||
|
||||
Reference in New Issue
Block a user