]> git.saurik.com Git - wxWidgets.git/blobdiff - src/common/string.cpp
fixes #9951
[wxWidgets.git] / src / common / string.cpp
index 85b30905335d5583528b65729888a2060b7f6829..bb5029fcf486eeb498a84a7a4567b682630bc27d 100644 (file)
@@ -60,6 +60,35 @@ const size_t wxString::npos = (size_t) -1;
 
 #if wxUSE_STRING_POS_CACHE
 
+#ifdef wxHAS_COMPILER_TLS
+
+wxTLS_TYPE(wxString::Cache) wxString::ms_cache;
+
+#else // !wxHAS_COMPILER_TLS
+
+struct wxStrCacheInitializer
+{
+    wxStrCacheInitializer()
+    {
+        // calling this function triggers s_cache initialization in it, and
+        // from now on it becomes safe to call from multiple threads
+        wxString::GetCache();
+    }
+};
+
+/*
+wxString::Cache& wxString::GetCache()
+{
+    static wxTLS_TYPE(Cache) s_cache;
+
+    return wxTLS_VALUE(s_cache);
+}
+*/
+
+static wxStrCacheInitializer gs_stringCacheInit;
+
+#endif // wxHAS_COMPILER_TLS/!wxHAS_COMPILER_TLS
+
 // gdb seems to be unable to display thread-local variables correctly, at least
 // not my 6.4.98 version under amd64, so provide this debugging helper to do it
 #ifdef __WXDEBUG__
@@ -93,12 +122,9 @@ void wxDumpStrCache() { wxStrCacheDumper::ShowAll(); }
 
 wxString::CacheStats wxString::ms_cacheStats;
 
-namespace
-{
-
-struct ShowCacheStats
+struct wxStrCacheStatsDumper
 {
-    ~ShowCacheStats()
+    ~wxStrCacheStatsDumper()
     {
         const wxString::CacheStats& stats = wxString::ms_cacheStats;
 
@@ -123,9 +149,9 @@ struct ShowCacheStats
                    stats.lentot, 100.*float(stats.lenhits)/stats.lentot);
         }
     }
-} s_showCacheStats;
+};
 
-} // anonymous namespace
+static wxStrCacheStatsDumper s_showCacheStats;
 
 #endif // wxPROFILE_STRING_CACHE