From bcf0ddc086b8a34cf602db5c9046cacfbb6c908e Mon Sep 17 00:00:00 2001 From: aramis_acg Date: Sat, 10 Apr 2010 15:00:36 +0000 Subject: [PATCH] - don't delete the null logger. - don't leak LogStreamInfo when detaching streams from DefaultLogger. - detach the stream before deleting it in aiDetachAllLogStreams. Thanks to Bart Botta for the patch. - DefaultLogger does not properly delete log streams if they're still attached to it when the logger is destroyed. This is the behaviour specified in the documentation. - Adapt AssimpView's logger usage, which didn't follow the spec as well. git-svn-id: https://assimp.svn.sourceforge.net/svnroot/assimp/trunk@659 67173fc5-114c-0410-ac8e-9d2fd5bffc1f --- code/Assimp.cpp | 3 +++ code/DefaultLogger.cpp | 11 ++++++++--- include/Logger.h | 4 ++-- tools/assimp_view/LogWindow.h | 4 ++-- tools/assimp_view/MessageProc.cpp | 4 +++- 5 files changed, 18 insertions(+), 8 deletions(-) diff --git a/code/Assimp.cpp b/code/Assimp.cpp index 35256891c..0df4c0fbc 100644 --- a/code/Assimp.cpp +++ b/code/Assimp.cpp @@ -486,7 +486,9 @@ ASSIMP_API aiReturn aiDetachLogStream( const aiLogStream* stream) if( it == gActiveLogStreams.end()) { return AI_FAILURE; } + DefaultLogger::get()->detatchStream( it->second ); delete it->second; + gActiveLogStreams.erase( it); if (gActiveLogStreams.empty()) { @@ -504,6 +506,7 @@ ASSIMP_API void aiDetachAllLogStreams(void) boost::mutex::scoped_lock lock(gLogStreamMutex); #endif for (LogStreamMap::iterator it = gActiveLogStreams.begin(); it != gActiveLogStreams.end(); ++it) { + DefaultLogger::get()->detatchStream( it->second ); delete it->second; } gActiveLogStreams.clear(); diff --git a/code/DefaultLogger.cpp b/code/DefaultLogger.cpp index 9a9b95884..e81339d93 100644 --- a/code/DefaultLogger.cpp +++ b/code/DefaultLogger.cpp @@ -82,7 +82,7 @@ struct LogStreamInfo // Destructor ~LogStreamInfo() { - // empty + delete m_pStream; } }; @@ -237,7 +237,7 @@ void DefaultLogger::kill() boost::mutex::scoped_lock lock(loggerMutex); #endif - if (m_pLogger != &s_pNullLogger)return; + if (m_pLogger == &s_pNullLogger)return; delete m_pLogger; m_pLogger = &s_pNullLogger; } @@ -332,6 +332,9 @@ bool DefaultLogger::detatchStream( LogStream *pStream, unsigned int severity ) (*it)->m_uiErrorSeverity &= ~severity; if ( (*it)->m_uiErrorSeverity == 0 ) { + // don't delete the underlying stream 'cause the caller gains ownership again + (**it).m_pStream = NULL; + delete *it; m_StreamArray.erase( it ); break; } @@ -356,8 +359,10 @@ DefaultLogger::DefaultLogger(LogSeverity severity) // Destructor DefaultLogger::~DefaultLogger() { - for ( StreamIt it = m_StreamArray.begin(); it != m_StreamArray.end(); ++it ) + for ( StreamIt it = m_StreamArray.begin(); it != m_StreamArray.end(); ++it ) { + // also frees the underlying stream, we are its owner. delete *it; + } } // ---------------------------------------------------------------------------------- diff --git a/include/Logger.h b/include/Logger.h index 04b90281e..5fe8863a7 100644 --- a/include/Logger.h +++ b/include/Logger.h @@ -124,8 +124,8 @@ public: /** @brief Attach a new logstream * * The logger takes ownership of the stream and is responsible - * for its destruction (which is done when the logger itself - * is destroyed). Call detachStream to detach a stream and to + * for its destruction (which is done using ::delete when the logger + * itself is destroyed). Call detachStream to detach a stream and to * gain ownership of it again. * @param pStream Logstream to attach * @param severity Message filter, specified which types of log diff --git a/tools/assimp_view/LogWindow.h b/tools/assimp_view/LogWindow.h index 78773ba03..0ca0515d9 100644 --- a/tools/assimp_view/LogWindow.h +++ b/tools/assimp_view/LogWindow.h @@ -48,7 +48,7 @@ OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. * log window. */ //------------------------------------------------------------------------------- -class CMyLogStream : Assimp::LogStream +class CMyLogStream : public Assimp::LogStream { public: /** @brief Implementation of the abstract method */ @@ -122,7 +122,7 @@ private: public: // associated log stream - CMyLogStream pcStream; + CMyLogStream* pcStream; }; #endif // AV_LOG_DISPLA \ No newline at end of file diff --git a/tools/assimp_view/MessageProc.cpp b/tools/assimp_view/MessageProc.cpp index 4ac9746f5..da427f6ee 100644 --- a/tools/assimp_view/MessageProc.cpp +++ b/tools/assimp_view/MessageProc.cpp @@ -2214,7 +2214,9 @@ int APIENTRY _tWinMain(HINSTANCE hInstance, // initialise the default logger if neccessary Assimp::DefaultLogger::create("",Assimp::Logger::VERBOSE); - Assimp::DefaultLogger::get()->attachStream((Assimp::LogStream*)&CLogWindow::Instance().pcStream, + + CLogWindow::Instance().pcStream = new CMyLogStream(); + Assimp::DefaultLogger::get()->attachStream(CLogWindow::Instance().pcStream, Assimp::DefaultLogger::DEBUGGING | Assimp::DefaultLogger::INFO | Assimp::DefaultLogger::ERR | Assimp::DefaultLogger::WARN);