X-Git-Url: https://git.saurik.com/wxWidgets.git/blobdiff_plain/2804f77d88eb478f85a281b19d87e38cd96e0d0c..a2fd8a45eca03f90371a1c41b2f7450df088b07c:/src/common/appbase.cpp diff --git a/src/common/appbase.cpp b/src/common/appbase.cpp index d2b8a4c3f3..1efd57addd 100644 --- a/src/common/appbase.cpp +++ b/src/common/appbase.cpp @@ -51,11 +51,13 @@ #include #endif +#ifndef __WXPALMOS5__ #if !defined(__WXMSW__) || defined(__WXMICROWIN__) #include // for SIGTRAP used by wxTrap() #endif //Win/Unix #include +#endif // ! __WXPALMOS5__ #if wxUSE_FONTMAP #include "wx/fontmap.h" @@ -81,6 +83,8 @@ #include "wx/msw/debughlp.h" #endif #endif // wxUSE_STACKWALKER + + #include "wx/recguard.h" #endif // __WXDEBUG__ // wxABI_VERSION can be defined when compiling applications but it should be @@ -163,22 +167,18 @@ wxAppConsoleBase::~wxAppConsoleBase() // initilization/cleanup // ---------------------------------------------------------------------------- -bool wxAppConsoleBase::Initialize(int& argcOrig, wxChar **argvOrig) +bool wxAppConsoleBase::Initialize(int& WXUNUSED(argc), wxChar **argv) { #if wxUSE_INTL GetTraits()->SetLocale(); #endif // wxUSE_INTL - // remember the command line arguments - argc = argcOrig; - argv = argvOrig; - #if wxUSE_THREADS wxPendingEventsLocker = new wxCriticalSection; #endif #ifndef __WXPALMOS__ - if ( m_appName.empty() && argv ) + if ( m_appName.empty() && argv && argv[0] ) { // the application name is, by default, the name of its executable file wxFileName::SplitPath(argv[0], NULL, &m_appName, NULL); @@ -359,21 +359,21 @@ void wxAppConsoleBase::ProcessPendingEvents() if (wxPendingEvents) { - // iterate until the list becomes empty + // iterate until the list becomes empty: the handlers remove themselves + // from it when they don't have any more pending events wxList::compatibility_iterator node = wxPendingEvents->GetFirst(); while (node) { - wxEvtHandler *handler = (wxEvtHandler *)node->GetData(); - wxPendingEvents->Erase(node); - // In ProcessPendingEvents(), new handlers might be add // and we can safely leave the critical section here. wxLEAVE_CRIT_SECT( *wxPendingEventsLocker ); + wxEvtHandler *handler = (wxEvtHandler *)node->GetData(); handler->ProcessPendingEvents(); wxENTER_CRIT_SECT( *wxPendingEventsLocker ); + // restart as the iterators could have been invalidated node = wxPendingEvents->GetFirst(); } } @@ -826,20 +826,17 @@ static void wxDoOnAssert(const wxString& szFile, const wxString& szMsg = wxEmptyString) { // FIXME MT-unsafe - static bool s_bInAssert = false; + static int s_bInAssert = 0; - if ( s_bInAssert ) + wxRecursionGuard guard(s_bInAssert); + if ( guard.IsInside() ) { - // He-e-e-e-elp!! we're trapped in endless loop + // can't use assert here to avoid infinite loops, so just trap wxTrap(); - s_bInAssert = false; - return; } - s_bInAssert = true; - if ( !wxTheApp ) { // by default, show the assert dialog box -- we can't customize this @@ -853,8 +850,6 @@ static void wxDoOnAssert(const wxString& szFile, wxTheApp->OnAssertFailure(szFile.c_str(), nLine, szFunc.c_str(), szCond.c_str(), szMsg.c_str()); } - - s_bInAssert = false; } void wxOnAssert(const wxString& szFile,