X-Git-Url: https://git.saurik.com/wxWidgets.git/blobdiff_plain/e822d1bd5fc4f3ac91fafd201d7519d091408dd2..582699e1ac533e85ba62ae320c6e922ad1685bec:/src/common/event.cpp diff --git a/src/common/event.cpp b/src/common/event.cpp index fbb9cc8f15..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(); @@ -1172,7 +1178,7 @@ void wxEvtHandler::ProcessPendingEvents() "should have pending events if called" ); wxList::compatibility_iterator node = m_pendingEvents->GetFirst(); - wxEventPtr event(wx_static_cast(wxEvent *, node->GetData())); + wxEventPtr event(static_cast(node->GetData())); // it's important we remove event from list before processing it, else a // nested event loop, for example from a modal dialog, might process the @@ -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 )