From: Christian P. <cp...@us...> - 2005-01-16 01:58:26
|
Update of /cvsroot/pclasses/pclasses2/src/App In directory sc8-pr-cvs1.sourceforge.net:/tmp/cvs-serv16210/src/App Modified Files: LogChannel.cpp Log Message: Use ThreadKey. LogChannel should now be thread-safe. Index: LogChannel.cpp =================================================================== RCS file: /cvsroot/pclasses/pclasses2/src/App/LogChannel.cpp,v retrieving revision 1.1 retrieving revision 1.2 diff -u -d -r1.1 -r1.2 --- LogChannel.cpp 10 Jan 2005 02:38:56 -0000 1.1 +++ LogChannel.cpp 16 Jan 2005 01:58:15 -0000 1.2 @@ -19,6 +19,7 @@ ***************************************************************************/ #include "pclasses/System/SystemClock.h" +#include "pclasses/System/ThreadKey.h" #include "pclasses/App/LogTarget.h" #include "pclasses/App/LogChannel.h" #include "pclasses/App/LogMessage.h" @@ -38,6 +39,8 @@ class LogStreamBuffer: public std::streambuf { public: + typedef System::ThreadKey<LogStreamState> StreamStateThreadKey; + LogStreamBuffer(LogChannel& chan); ~LogStreamBuffer(); @@ -50,12 +53,12 @@ private: LogStreamState* state(); - LogChannel& _channel; - LogStreamState* _state; //@fixme _state must be a thread-local variable! + LogChannel& _channel; + StreamStateThreadKey _state; }; LogStreamBuffer::LogStreamBuffer(LogChannel& chan) -: _channel(chan), _state(0) +: _channel(chan) { } @@ -66,14 +69,16 @@ LogStreamState* LogStreamBuffer::state() { - if(!_state) + LogStreamState* s = _state; + if(!s) { - _state = new LogStreamState; - _state->empty = true; - _state->level = LogMessage::Info; + s = new LogStreamState; + s->empty = true; + s->level = LogMessage::Info; + _state = s; } - return _state; + return s; } void LogStreamBuffer::setMessageLevel(LogMessage::Level l) |