X-Git-Url: https://git.saurik.com/wxWidgets.git/blobdiff_plain/85149efad7fc85798de59e8a680616aa5ad85ffb..a87f2821adee59d00f99cad1f9bcf61b0accbcb6:/src/common/object.cpp

diff --git a/src/common/object.cpp b/src/common/object.cpp
index 4cb6e34b0f..0a77aab57b 100644
--- a/src/common/object.cpp
+++ b/src/common/object.cpp
@@ -14,20 +14,17 @@
 #include "wx/wxprec.h"
 
 #ifdef __BORLANDC__
-#pragma hdrstop
+    #pragma hdrstop
 #endif
 
 #ifndef WX_PRECOMP
-    #include "wx/hash.h"
     #include "wx/object.h"
+    #include "wx/hash.h"
+    #include "wx/memory.h"
 #endif
 
 #include <string.h>
 
-#if (defined(__WXDEBUG__) && wxUSE_MEMORY_TRACING) || wxUSE_DEBUG_CONTEXT
-#include "wx/memory.h"
-#endif
-
 #if defined(__WXDEBUG__) || wxUSE_DEBUG_CONTEXT
     #if defined(__VISAGECPP__)
         #define DEBUG_PRINTF(NAME) { static int raz=0; \
@@ -208,13 +205,31 @@ wxClassInfo *wxClassInfo::FindClass(const wxChar *className)
     }
 }
 
+// This function wasn't written to be reentrant but there is a possiblity of
+// reentrance if something it does causes a shared lib to load and register
+// classes. On Solaris this happens when the wxHashTable is newed, so the first
+// part of the function has been modified to handle it, and a wxASSERT checks
+// against reentrance in the remainder of the function.
+
 void wxClassInfo::Register()
 {
     if ( !sm_classTable )
     {
-        sm_classTable = new wxHashTable(wxKEY_STRING);
+        wxHashTable *classTable = new wxHashTable(wxKEY_STRING);
+
+        // check for reentrance
+        if ( sm_classTable )
+            delete classTable;
+        else
+            sm_classTable = classTable;
     }
 
+#ifdef __WXDEBUG__
+    // reentrance guard - see note above
+    static int entry = 0;
+    wxASSERT_MSG(++entry == 1, _T("wxClassInfo::Register() reentrance"));
+#endif
+
     // Using IMPLEMENT_DYNAMIC_CLASS() macro twice (which may happen if you
     // link any object module twice mistakenly, or link twice against wx shared
     // library) will break this function because it will enter an infinite loop
@@ -229,6 +244,10 @@ void wxClassInfo::Register()
     );
 
     sm_classTable->Put(m_className, (wxObject *)this);
+
+#ifdef __WXDEBUG__
+    --entry;
+#endif
 }
 
 void wxClassInfo::Unregister()