From 6560e584fd6e6909d6bd7359c8887135bb134d14 Mon Sep 17 00:00:00 2001 From: skyjake Date: Thu, 6 Dec 2012 17:13:42 +0200 Subject: [PATCH] Debug|libdeng2: Investigating odd log behavior (invalid freed pointers) --- doomsday/libdeng2/src/core/library.cpp | 2 +- doomsday/libdeng2/src/core/log.cpp | 32 +++++++++++++++----------- 2 files changed, 19 insertions(+), 15 deletions(-) diff --git a/doomsday/libdeng2/src/core/library.cpp b/doomsday/libdeng2/src/core/library.cpp index 64197abca9..068039be2f 100644 --- a/doomsday/libdeng2/src/core/library.cpp +++ b/doomsday/libdeng2/src/core/library.cpp @@ -65,7 +65,7 @@ Library::Library(NativePath const &nativePath) : d(0) { d = new Instance; - LOG_AS("Library::Library"); + LOG_AS("Library"); LOG_TRACE("Loading ") << nativePath.pretty(); #ifndef DENG2_USE_DLOPEN diff --git a/doomsday/libdeng2/src/core/log.cpp b/doomsday/libdeng2/src/core/log.cpp index e2470ea987..a82e8f53cc 100644 --- a/doomsday/libdeng2/src/core/log.cpp +++ b/doomsday/libdeng2/src/core/log.cpp @@ -28,6 +28,7 @@ #include #include #include +#include namespace de { @@ -49,19 +50,18 @@ class Logs : public QMap, public Lockable public: Logs() {} ~Logs() { - lock(); + DENG2_GUARD(this); // The logs are owned by the logs table. foreach(Log *log, values()) { delete log; } - unlock(); } }; } // namespace internal /// The logs table contains the log of each thread that uses logging. -static internal::Logs logs; +static std::auto_ptr logsPtr; LogEntry::LogEntry() : _level(TRACE), _sectionDepth(0), _disabled(true) {} @@ -355,36 +355,40 @@ LogEntry &Log::enter(LogEntry::Level level, String const &format, LogEntry::Args Log &Log::threadLog() { + if(!logsPtr.get()) logsPtr.reset(new internal::Logs); + internal::Logs& logs = *logsPtr; + DENG2_GUARD(logs); + // Each thread has its own log. QThread *thread = QThread::currentThread(); - Log *theLog = 0; - logs.lock(); - internal::Logs::iterator found = logs.find(thread); - if(found == logs.end()) + internal::Logs::const_iterator found = logs.constFind(thread); + if(found == logs.constEnd()) { // Create a new log. - theLog = new Log(); - logs[thread] = theLog; + Log* theLog = new Log; + qDebug() << "Log" << theLog << "created for thread" << thread; + logs.insert(thread, theLog); + return *theLog; } else { - theLog = found.value(); + return *found.value(); } - logs.unlock(); - return *theLog; } void Log::disposeThreadLog() { + if(!logsPtr.get()) logsPtr.reset(new internal::Logs); + internal::Logs& logs = *logsPtr; + DENG2_GUARD(logs); + QThread *thread = QThread::currentThread(); - logs.lock(); internal::Logs::iterator found = logs.find(thread); if(found != logs.end()) { delete found.value(); logs.remove(found.key()); } - logs.unlock(); } LogEntryStager::LogEntryStager(LogEntry::Level level, String const &format) : _level(level)