git-svn-id: https://svn.wxwidgets.org/svn/wx/wxWidgets/trunk@55393
c3d73ce0-8a6f-49c7-b76d-
6d57e0e08775
// not by the compiler), the global s_cache variable could be not yet
// initialized when a ctor of another global object is executed and if that
// ctor uses any wxString methods, bad things happen
// not by the compiler), the global s_cache variable could be not yet
// initialized when a ctor of another global object is executed and if that
// ctor uses any wxString methods, bad things happen
- //
- // also note that for the same reason this function _is_ MT-safe: we know
- // it's going to be called during the program startup (currently during
- // globals initialization but even if they ever stop using wxString, it would
- // still be called by wxInitialize()), i.e. before any threads are created
static Cache& GetCache()
{
static wxTLS_TYPE(Cache) s_cache;
static Cache& GetCache()
{
static wxTLS_TYPE(Cache) s_cache;
static Cache::Element *GetCacheEnd() { return GetCacheBegin() + Cache::SIZE; }
static unsigned& LastUsedCacheElement() { return GetCache().lastUsed; }
static Cache::Element *GetCacheEnd() { return GetCacheBegin() + Cache::SIZE; }
static unsigned& LastUsedCacheElement() { return GetCache().lastUsed; }
+ // this helper struct is used to ensure that GetCache() is called during
+ // static initialization time, i.e. before any threads creation, as otherwise
+ // the static s_cache construction inside GetCache() wouldn't be MT-safe
+ friend struct wxStrCacheInitializer;
+
+ // this is used in debug builds only to provide a convenient function,
+ // callable from a debugger, to show the cache contents
friend struct wxStrCacheDumper;
// uncomment this to have access to some profiling statistics on program
friend struct wxStrCacheDumper;
// uncomment this to have access to some profiling statistics on program
#if wxUSE_STRING_POS_CACHE
#if wxUSE_STRING_POS_CACHE
+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();
+ }
+};
+
+static wxStrCacheInitializer gs_stringCacheInit;
+
// 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__
// 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__
struct wxStrCacheDumper
{
static void ShowAll()
struct wxStrCacheDumper
{
static void ShowAll()
+} // anonymous namespace
+
void wxDumpStrCache() { wxStrCacheDumper::ShowAll(); }
#endif // __WXDEBUG__
void wxDumpStrCache() { wxStrCacheDumper::ShowAll(); }
#endif // __WXDEBUG__