#include "wx/msgout.h"
#include "wx/ptr_scpd.h"
#include "wx/tokenzr.h"
+#include "wx/thread.h"
#if wxUSE_EXCEPTIONS && wxUSE_STL
#include <exception>
#include <typeinfo>
#endif
+#ifndef __WXPALMOS5__
#if !defined(__WXMSW__) || defined(__WXMICROWIN__)
#include <signal.h> // for SIGTRAP used by wxTrap()
#endif //Win/Unix
#include <locale.h>
+#endif // ! __WXPALMOS5__
#if wxUSE_FONTMAP
#include "wx/fontmap.h"
#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
// 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);
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();
}
}
// nothing to do
}
-#if wxUSE_SOCKETS
-GSocketGUIFunctionsTable* wxConsoleAppTraitsBase::GetSocketGUIFunctionsTable()
-{
- return NULL;
-}
-#endif
-
// ----------------------------------------------------------------------------
// wxAppTraits
// ----------------------------------------------------------------------------
}
#endif
+#if wxUSE_THREADS
+void wxMutexGuiEnterImpl();
+void wxMutexGuiLeaveImpl();
+
+void wxAppTraitsBase::MutexGuiEnter()
+{
+ wxMutexGuiEnterImpl();
+}
+
+void wxAppTraitsBase::MutexGuiLeave()
+{
+ wxMutexGuiLeaveImpl();
+}
+
+void WXDLLIMPEXP_BASE wxMutexGuiEnter()
+{
+ wxAppConsoleBase::GetInstance()->GetTraits()->MutexGuiEnter();
+}
+
+void WXDLLIMPEXP_BASE wxMutexGuiLeave()
+{
+ wxAppConsoleBase::GetInstance()->GetTraits()->MutexGuiLeave();
+}
+#endif // wxUSE_THREADS
+
#ifdef __WXDEBUG__
bool wxAppTraitsBase::ShowAssertDialog(const wxString& msgOriginal)
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
wxTheApp->OnAssertFailure(szFile.c_str(), nLine, szFunc.c_str(),
szCond.c_str(), szMsg.c_str());
}
-
- s_bInAssert = false;
}
void wxOnAssert(const wxString& szFile,