X-Git-Url: https://git.saurik.com/wxWidgets.git/blobdiff_plain/68482dc584054c65f2dee76def3927d338fc20a7..e0e2cbbe946954db58b28aab3d9cc207987a6a5a:/src/common/string.cpp diff --git a/src/common/string.cpp b/src/common/string.cpp index c97125d2c4..bb5029fcf4 100644 --- a/src/common/string.cpp +++ b/src/common/string.cpp @@ -59,8 +59,36 @@ 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__ @@ -73,11 +101,11 @@ struct wxStrCacheDumper for ( unsigned n = 0; n < wxString::Cache::SIZE; n++ ) { const wxString::Cache::Element& - c = wxString::ms_cache.cached[n]; + c = wxString::GetCacheBegin()[n]; printf("\t%u%s\t%p: pos=(%lu, %lu), len=%ld\n", n, - n == wxString::ms_cache.lastUsed ? " [*]" : "", + n == wxString::LastUsedCacheElement() ? " [*]" : "", c.str, (unsigned long)c.pos, (unsigned long)c.impl, @@ -94,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; @@ -124,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