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
This commit is contained in:
@@ -1143,8 +1143,6 @@ void wxEvtHandler::QueueEvent(wxEvent *event)
|
|||||||
|
|
||||||
m_pendingEvents->Append(event);
|
m_pendingEvents->Append(event);
|
||||||
|
|
||||||
wxLEAVE_CRIT_SECT( m_pendingEventsLock );
|
|
||||||
|
|
||||||
// 2) Add this event handler to list of event handlers that
|
// 2) Add this event handler to list of event handlers that
|
||||||
// have pending events.
|
// have pending events.
|
||||||
|
|
||||||
@@ -1157,6 +1155,14 @@ void wxEvtHandler::QueueEvent(wxEvent *event)
|
|||||||
|
|
||||||
wxLEAVE_CRIT_SECT(*wxPendingEventsLocker);
|
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,
|
// 3) Inform the system that new pending events are somewhere,
|
||||||
// and that these should be processed in idle time.
|
// and that these should be processed in idle time.
|
||||||
wxWakeUpIdle();
|
wxWakeUpIdle();
|
||||||
|
Reference in New Issue
Block a user