From: Vadim Zeitlin Date: Sat, 8 Nov 2008 22:41:10 +0000 (+0000) Subject: fix race condition which could result in assert failures in debug builds and infinite... X-Git-Url: https://git.saurik.com/wxWidgets.git/commitdiff_plain/a715b99070705047b491dc65c1fad87c20441b1d fix race condition which could result in assert failures in debug builds and infinite loops in release (#9094) git-svn-id: https://svn.wxwidgets.org/svn/wx/wxWidgets/trunk@56712 c3d73ce0-8a6f-49c7-b76d-6d57e0e08775 --- diff --git a/src/common/event.cpp b/src/common/event.cpp index 630a4f20cc..c60c8dc265 100644 --- a/src/common/event.cpp +++ b/src/common/event.cpp @@ -1143,8 +1143,6 @@ void wxEvtHandler::QueueEvent(wxEvent *event) m_pendingEvents->Append(event); - wxLEAVE_CRIT_SECT( m_pendingEventsLock ); - // 2) Add this event handler to list of event handlers that // have pending events. @@ -1157,6 +1155,14 @@ void wxEvtHandler::QueueEvent(wxEvent *event) wxLEAVE_CRIT_SECT(*wxPendingEventsLocker); + // only release m_pendingEventsLock now because otherwise there is a race + // condition as described in the ticket #9093: we could process the event + // just added to m_pendingEvents in our ProcessPendingEvents() below before + // we had time to append this pointer to wxPendingEvents list; thus + // breaking the invariant that a handler should be in the list iff it has + // any pending events to process + wxLEAVE_CRIT_SECT( m_pendingEventsLock ); + // 3) Inform the system that new pending events are somewhere, // and that these should be processed in idle time. wxWakeUpIdle();