- 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
pull/1/head
aramis_acg 2010-04-10 15:00:36 +00:00
parent 616bd39b6f
commit bcf0ddc086
5 changed files with 18 additions and 8 deletions

View File

@ -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();

View File

@ -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,9 +359,11 @@ 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;
}
}
// ----------------------------------------------------------------------------------
// Writes message to stream

View File

@ -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

View File

@ -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

View File

@ -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);