From: Stefan Csomor Date: Mon, 3 Jun 2013 14:57:56 +0000 (+0000) Subject: make sure we don't execute pending deletes either when in runModel, otherwise reentra... X-Git-Url: https://git.saurik.com/wxWidgets.git/commitdiff_plain/19736e6452f8dabf20f620b742bc3b4f670ba78b make sure we don't execute pending deletes either when in runModel, otherwise reentrancy problems occur git-svn-id: https://svn.wxwidgets.org/svn/wx/wxWidgets/trunk@74099 c3d73ce0-8a6f-49c7-b76d-6d57e0e08775 --- diff --git a/include/wx/osx/core/evtloop.h b/include/wx/osx/core/evtloop.h index cae3c8e78f..600c2056cd 100644 --- a/include/wx/osx/core/evtloop.h +++ b/include/wx/osx/core/evtloop.h @@ -54,6 +54,7 @@ public: AddSourceForFD(int fd, wxEventLoopSourceHandler *handler, int flags); #endif // wxUSE_EVENTLOOP_SOURCE + bool ShouldProcessIdleEvents() const { return m_processIdleEvents ; } protected: void CommonModeObserverCallBack(CFRunLoopObserverRef observer, int activity); void DefaultModeObserverCallBack(CFRunLoopObserverRef observer, int activity); @@ -106,6 +107,8 @@ class WXDLLIMPEXP_BASE wxCFEventLoopPauseIdleEvents : public wxObject public: wxCFEventLoopPauseIdleEvents(); virtual ~wxCFEventLoopPauseIdleEvents(); +private: + bool m_formerState; }; #endif // _WX_OSX_EVTLOOP_H_ diff --git a/src/osx/core/evtloop_cf.cpp b/src/osx/core/evtloop_cf.cpp index 20f01f8fd6..8d3ef5f843 100644 --- a/src/osx/core/evtloop_cf.cpp +++ b/src/osx/core/evtloop_cf.cpp @@ -163,13 +163,13 @@ void wxCFEventLoop::CommonModeObserverCallBack(CFRunLoopObserverRef WXUNUSED(obs // and this input is only removed from it when pending event handlers are // executed) - if ( wxTheApp ) + if ( wxTheApp && ShouldProcessIdleEvents() ) wxTheApp->ProcessPendingEvents(); } if ( activity & kCFRunLoopBeforeWaiting ) { - if ( m_processIdleEvents && ProcessIdle() ) + if ( ShouldProcessIdleEvents() && ProcessIdle() ) { WakeUp(); } @@ -445,14 +445,19 @@ wxCFEventLoopPauseIdleEvents::wxCFEventLoopPauseIdleEvents() { wxCFEventLoop* cfl = dynamic_cast(wxEventLoopBase::GetActive()); if ( cfl ) + { + m_formerState = cfl->ShouldProcessIdleEvents(); cfl->SetProcessIdleEvents(false); + } + else + m_formerState = true; } wxCFEventLoopPauseIdleEvents::~wxCFEventLoopPauseIdleEvents() { wxCFEventLoop* cfl = dynamic_cast(wxEventLoopBase::GetActive()); if ( cfl ) - cfl->SetProcessIdleEvents(true); + cfl->SetProcessIdleEvents(m_formerState); } // TODO Move to thread_osx.cpp