]> git.saurik.com Git - wxWidgets.git/commitdiff
Make critical sections initialization really thread-safe.
authorVadim Zeitlin <vadim@wxwidgets.org>
Sun, 12 Jul 2009 17:22:50 +0000 (17:22 +0000)
committerVadim Zeitlin <vadim@wxwidgets.org>
Sun, 12 Jul 2009 17:22:50 +0000 (17:22 +0000)
git-svn-id: https://svn.wxwidgets.org/svn/wx/wxWidgets/trunk@61419 c3d73ce0-8a6f-49c7-b76d-6d57e0e08775

src/common/log.cpp

index 09b89aaa30fa754ef2dd7c2ecdf22470e85ab7b2..99a424bfd3ba289c1da7f7a74f53d63cf88f68cf 100644 (file)
@@ -77,35 +77,35 @@ namespace
 typedef wxVector<wxLogRecord> wxLogRecords;
 wxLogRecords gs_bufferedLogRecords;
 
-
-// define static functions providing access to the critical sections we use
-// instead of just using static critical section variables as log functions may
-// be used during static initialization and while this is certainly not
-// advisable it's still better to not crash (as we'd do if we used a yet
-// uninitialized critical section) if it happens
+// this macro allows to define an object which will be initialized before any
+// other function in this file is called: this is necessary to allow log
+// functions to be used during static initialization (this is not advisable
+// anyhow but we should at least try to not crash) and to also ensure that they
+// are initialized by the time static initialization is done, i.e. before any
+// threads are created hopefully
+//
+// the net effect of all this is that you can use Get##name##CS() function to
+// access the critical function without worrying about it being not initialized
+//
+// see also WX_DEFINE_GLOBAL_CONV2() in src/common/strconv.cpp
+#define WX_DEFINE_LOG_CS(name)                                                \
+    inline wxCriticalSection& Get##name##CS()                                 \
+    {                                                                         \
+        static wxCriticalSection s_cs##name;                                  \
+        return s_cs##name;                                                    \
+    }                                                                         \
+                                                                              \
+    wxCriticalSection *gs_##name##CSPtr = &Get##name##CS()
 
 // this critical section is used for buffering the messages from threads other
 // than main, i.e. it protects all accesses to gs_bufferedLogRecords above
-inline wxCriticalSection& GetBackgroundLogCS()
-{
-    static wxCriticalSection s_csBackground;
-
-    return s_csBackground;
-}
+WX_DEFINE_LOG_CS(BackgroundLog);
 
-inline wxCriticalSection& GetTraceMaskCS()
-{
-    static wxCriticalSection s_csTrace;
-
-    return s_csTrace;
-}
+// this one is used for protecting ms_aTraceMasks from concurrent access
+WX_DEFINE_LOG_CS(TraceMask);
 
-inline wxCriticalSection& GetLevelsCS()
-{
-    static wxCriticalSection s_csLevels;
-
-    return s_csLevels;
-}
+// and this one is used for gs_componentLevels 
+WX_DEFINE_LOG_CS(Levels);
 
 } // anonymous namespace