From f96233d53ef6bdc1a9247fbf29d297a52714d76a Mon Sep 17 00:00:00 2001 From: Vadim Zeitlin Date: Sat, 15 Mar 2008 03:42:48 +0000 Subject: [PATCH] protect access to ms_aTraceMasks with a critical section (replaces patch 1911172) git-svn-id: https://svn.wxwidgets.org/svn/wx/wxWidgets/trunk@52541 c3d73ce0-8a6f-49c7-b76d-6d57e0e08775 --- include/wx/log.h | 11 +++++++---- src/common/log.cpp | 19 ++++++++++++++++++- 2 files changed, 25 insertions(+), 5 deletions(-) diff --git a/include/wx/log.h b/include/wx/log.h index 4d95236042..a4f1168db6 100644 --- a/include/wx/log.h +++ b/include/wx/log.h @@ -202,8 +202,7 @@ public: static void SetTraceMask(wxTraceMask ulMask) { ms_ulTraceMask = ulMask; } // add string trace mask - static void AddTraceMask(const wxString& str) - { ms_aTraceMasks.push_back(str); } + static void AddTraceMask(const wxString& str); // add string trace mask static void RemoveTraceMask(const wxString& str); @@ -211,8 +210,9 @@ public: // remove all string trace masks static void ClearTraceMasks(); - // get string trace masks - static const wxArrayString &GetTraceMasks() { return ms_aTraceMasks; } + // get string trace masks: note that this is MT-unsafe if other threads can + // call AddTraceMask() concurrently + static const wxArrayString& GetTraceMasks() { return ms_aTraceMasks; } // sets the time stamp string format: this is used as strftime() format // string for the log targets which add time stamps to the messages; set @@ -345,6 +345,9 @@ private: // disabled static wxString ms_timestamp; +#if wxUSE_THREADS + static wxCriticalSection ms_traceCS; // protects ms_aTraceMasks +#endif static wxTraceMask ms_ulTraceMask; // controls wxLogTrace behaviour static wxArrayString ms_aTraceMasks; // more powerful filter for wxLogTrace }; diff --git a/src/common/log.cpp b/src/common/log.cpp index ddb361a254..bbd0c58292 100644 --- a/src/common/log.cpp +++ b/src/common/log.cpp @@ -618,8 +618,17 @@ void wxLog::DoCreateOnDemand() ms_bAutoCreate = true; } +void wxLog::AddTraceMask(const wxString& str) +{ + wxCRIT_SECT_LOCKER(lock, ms_traceCS); + + ms_aTraceMasks.push_back(str); +} + void wxLog::RemoveTraceMask(const wxString& str) { + wxCRIT_SECT_LOCKER(lock, ms_traceCS); + int index = ms_aTraceMasks.Index(str); if ( index != wxNOT_FOUND ) ms_aTraceMasks.RemoveAt((size_t)index); @@ -627,6 +636,8 @@ void wxLog::RemoveTraceMask(const wxString& str) void wxLog::ClearTraceMasks() { + wxCRIT_SECT_LOCKER(lock, ms_traceCS); + ms_aTraceMasks.Clear(); } @@ -722,11 +733,16 @@ void wxLog::Flush() /*static*/ bool wxLog::IsAllowedTraceMask(const wxString& mask) { + wxCRIT_SECT_LOCKER(lock, ms_traceCS); + for ( wxArrayString::iterator it = ms_aTraceMasks.begin(), en = ms_aTraceMasks.end(); it != en; ++it ) + { if ( *it == mask) return true; + } + return false; } @@ -924,7 +940,8 @@ wxLogInterposerTemp::wxLogInterposerTemp() // ---------------------------------------------------------------------------- #if wxUSE_THREADS -wxCriticalSection wxLog::ms_prevCS; +wxCriticalSection wxLog::ms_prevCS, + wxLog::ms_traceCS; #endif // wxUSE_THREADS bool wxLog::ms_bRepetCounting = false; wxString wxLog::ms_prevString; -- 2.45.2