X-Git-Url: https://git.saurik.com/wxWidgets.git/blobdiff_plain/5c33522fca7cddc441a316f5b9fb50d7685435ba..90e15296e9208a869efcc96329597fa3bf263d26:/src/common/event.cpp diff --git a/src/common/event.cpp b/src/common/event.cpp index 630a4f20cc..590c3adf3e 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(); @@ -1292,7 +1298,7 @@ bool wxEvtHandler::ProcessEvent(wxEvent& event) return true; // propagate the event upwards the window chain and/or to the application - // object if it wasn't processed at this level + // object if it wasn't processed at this level return TryParent(event); } @@ -1377,7 +1383,7 @@ bool wxEvtHandler::SearchEventTable(wxEventTable& table, wxEvent& event) } void wxEvtHandler::Connect( int id, int lastId, - int eventType, + wxEventType eventType, wxObjectEventFunction func, wxObject *userData, wxEvtHandler* eventSink )