diff --git a/simgear/debug/logstream.cxx b/simgear/debug/logstream.cxx index e843a659..0ccb631e 100644 --- a/simgear/debug/logstream.cxx +++ b/simgear/debug/logstream.cxx @@ -139,8 +139,8 @@ public: logTimer.stamp(); } - virtual void operator()(sgDebugClass c, sgDebugPriority p, - const char* file, int line, const std::string& message) + void operator()(sgDebugClass c, sgDebugPriority p, + const char* file, int line, const std::string& message) override { if (!shouldLog(c, p)) return; @@ -448,10 +448,18 @@ public: { std::lock_guard g(m_lock); m_startupLogging = on; - m_startupEntries.clear(); + clearStartupEntriesLocked(); } } + void clearStartupEntriesLocked() + { + std::for_each(m_startupEntries.begin(), m_startupEntries.end(), [](const LogEntry& e) { + if (e.freeFilename) free(const_cast(e.file)); + }); + m_startupEntries.clear(); + } + void run() override { while (1) { @@ -474,11 +482,20 @@ public: (*cb)(entry.debugClass, entry.debugPriority, entry.file, entry.line, entry.message); } - - if (entry.freeFilename) { + + // frrr the filename if required. For startup entries + // we wait and do this later + if (!m_startupLogging && entry.freeFilename) { free(const_cast(entry.file)); } } // of main thread loop + + // house-keeping, avoid leak warnings if we exit before disabling + // startup logging + { + std::lock_guard g(m_lock); + clearStartupEntriesLocked(); + } } bool stop() @@ -536,9 +553,9 @@ public: PauseThread pause(this); m_logPriority = p; m_logClass = c; - for (auto cb : m_consoleCallbacks) { - cb->setLogLevels(c, p); - } + for (auto cb : m_consoleCallbacks) { + cb->setLogLevels(c, p); + } } bool would_log( sgDebugClass c, sgDebugPriority p ) const