From: Vadim Zeitlin Date: Tue, 1 Mar 2005 01:26:34 +0000 (+0000) Subject: don't compare iterator after calling erase() in ProcessPendingEvents() (replaces... X-Git-Url: https://git.saurik.com/wxWidgets.git/commitdiff_plain/7b0d5c59ebe9299ee312f4f1adb48189137575e1 don't compare iterator after calling erase() in ProcessPendingEvents() (replaces patch 1153906) git-svn-id: https://svn.wxwidgets.org/svn/wx/wxWidgets/trunk@32507 c3d73ce0-8a6f-49c7-b76d-6d57e0e08775 --- diff --git a/src/common/event.cpp b/src/common/event.cpp index da707a1887..bda30d8451 100644 --- a/src/common/event.cpp +++ b/src/common/event.cpp @@ -1123,30 +1123,28 @@ void wxEvtHandler::ProcessPendingEvents() wxENTER_CRIT_SECT( Lock() ); - // remember last event to process during this iteration - wxList::compatibility_iterator lastPendingNode = m_pendingEvents->GetLast(); - - wxList::compatibility_iterator node = m_pendingEvents->GetFirst(); - while ( node ) + // we leave the loop once we have processed all events that were present at + // the start of ProcessPendingEvents because otherwise we could get into + // infinite loop if the pending event handler execution resulted in another + // event being posted + size_t n = m_pendingEvents->size(); + for ( wxList::compatibility_iterator node = m_pendingEvents->GetFirst(); + node; + node = m_pendingEvents->GetFirst() ) { wxEvent *event = (wxEvent *)node->GetData(); + m_pendingEvents->Erase(node); - // In ProcessEvent, new events might get added and - // we can safely leave the crtical section here. wxLEAVE_CRIT_SECT( Lock() ); + ProcessEvent(*event); delete event; + wxENTER_CRIT_SECT( Lock() ); - // leave the loop once we have processed all events that were present - // at the start of ProcessPendingEvents because otherwise we could get - // into infinite loop if the pending event handler execution resulted - // in another event being posted - if ( node == lastPendingNode ) + if ( !--n ) break; - - node = m_pendingEvents->GetFirst(); } wxLEAVE_CRIT_SECT( Lock() );