]> git.saurik.com Git - wxWidgets.git/commitdiff
protect access to ms_aTraceMasks with a critical section (replaces patch 1911172)
authorVadim Zeitlin <vadim@wxwidgets.org>
Sat, 15 Mar 2008 03:42:48 +0000 (03:42 +0000)
committerVadim Zeitlin <vadim@wxwidgets.org>
Sat, 15 Mar 2008 03:42:48 +0000 (03:42 +0000)
git-svn-id: https://svn.wxwidgets.org/svn/wx/wxWidgets/trunk@52541 c3d73ce0-8a6f-49c7-b76d-6d57e0e08775

include/wx/log.h
src/common/log.cpp

index 4d9523604271ef8422f6d77a1c594350411e4b3e..a4f1168db6252efe27e2f8109323da369b76618c 100644 (file)
@@ -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
 };
index ddb361a2547b2cc3253bfc15ea17033f727ee32b..bbd0c5829223b746c5425ef9dc91ac8af0699dd6 100644 (file)
@@ -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;