X-Git-Url: https://git.saurik.com/wxWidgets.git/blobdiff_plain/8e3f3880bc2b13b0ff90a60f676959989da732dd..d4fbfbe5cb7ce7ce651437d10222d5c2deeccb24:/src/common/object.cpp diff --git a/src/common/object.cpp b/src/common/object.cpp index 4d9cf55745..0a77aab57b 100644 --- a/src/common/object.cpp +++ b/src/common/object.cpp @@ -20,14 +20,11 @@ #ifndef WX_PRECOMP #include "wx/object.h" #include "wx/hash.h" + #include "wx/memory.h" #endif #include -#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()