bool wxAppConsoleBase::HasPendingEvents() const { wxENTER_CRIT_SECT(const_cast<wxAppConsoleBase*>(this)->m_handlersWithPendingEventsLocker); bool has = !m_handlersWithPendingEvents.IsEmpty(); wxLEAVE_CRIT_SECT(const_cast<wxAppConsoleBase*>(this)->m_handlersWithPendingEventsLocker); return has; }
void wxAppConsoleBase::ProcessPendingEvents() { if (!m_bDoPendingEventProcessing) return; wxENTER_CRIT_SECT(m_handlersWithPendingEventsLocker); wxCHECK_RET( m_handlersWithPendingDelayedEvents.IsEmpty(), "this helper list should be empty" ); // iterate until the list becomes empty: the handlers remove themselves // from it when they don't have any more pending events while (!m_handlersWithPendingEvents.IsEmpty()) { // In ProcessPendingEvents(), new handlers might be added // and we can safely leave the critical section here. wxLEAVE_CRIT_SECT(m_handlersWithPendingEventsLocker); // NOTE: we always call ProcessPendingEvents() on the first event handler // with pending events because handlers auto-remove themselves // from this list (see RemovePendingEventHandler) if they have no // more pending events. m_handlersWithPendingEvents[0]->ProcessPendingEvents(); wxENTER_CRIT_SECT(m_handlersWithPendingEventsLocker); } // now the wxHandlersWithPendingEvents is surely empty; however some event // handlers may have moved themselves into wxHandlersWithPendingDelayedEvents // because of a selective wxYield call in progress. // Now we need to move them back to wxHandlersWithPendingEvents so the next // call to this function has the chance of processing them: if (!m_handlersWithPendingDelayedEvents.IsEmpty()) { WX_APPEND_ARRAY(m_handlersWithPendingEvents, m_handlersWithPendingDelayedEvents); m_handlersWithPendingDelayedEvents.Clear(); } wxLEAVE_CRIT_SECT(m_handlersWithPendingEventsLocker); }
void wxAppConsoleBase::DelayPendingEventHandler(wxEvtHandler* toDelay) { wxENTER_CRIT_SECT(m_handlersWithPendingEventsLocker); // move the handler from the list of handlers with processable pending events // to the list of handlers with pending events which needs to be processed later m_handlersWithPendingEvents.Remove(toDelay); if (m_handlersWithPendingDelayedEvents.Index(toDelay) == wxNOT_FOUND) m_handlersWithPendingDelayedEvents.Add(toDelay); wxLEAVE_CRIT_SECT(m_handlersWithPendingEventsLocker); }
void wxAppConsoleBase::DeletePendingEvents() { wxENTER_CRIT_SECT(m_handlersWithPendingEventsLocker); wxCHECK_RET( m_handlersWithPendingDelayedEvents.IsEmpty(), "this helper list should be empty" ); for (unsigned int i=0; i<m_handlersWithPendingEvents.GetCount(); i++) m_handlersWithPendingEvents[i]->DeletePendingEvents(); m_handlersWithPendingEvents.Clear(); wxLEAVE_CRIT_SECT(m_handlersWithPendingEventsLocker); }
void wxAppConsole::ProcessPendingEvents() { #if wxUSE_THREADS if ( !wxPendingEventsLocker ) return; #endif // ensure that we're the only thread to modify the pending events list wxENTER_CRIT_SECT( *wxPendingEventsLocker ); if ( !wxPendingEvents ) { wxLEAVE_CRIT_SECT( *wxPendingEventsLocker ); return; } // iterate until the list becomes empty wxList::compatibility_iterator node = wxPendingEvents->GetFirst(); while (node) { wxEvtHandler *handler = (wxEvtHandler *)node->GetData(); wxPendingEvents->Erase(node); // In ProcessPendingEvents(), new handlers might be add // and we can safely leave the critical section here. wxLEAVE_CRIT_SECT( *wxPendingEventsLocker ); handler->ProcessPendingEvents(); wxENTER_CRIT_SECT( *wxPendingEventsLocker ); node = wxPendingEvents->GetFirst(); } wxLEAVE_CRIT_SECT( *wxPendingEventsLocker ); }
void wxAppConsoleBase::DeletePendingEvents() { wxENTER_CRIT_SECT(m_handlersWithPendingEventsLocker); wxCHECK_RET( m_handlersWithPendingDelayedEvents.IsEmpty(), "this helper list should be empty" ); #if defined(__INTEL_COMPILER) && 1 /* VDM auto patch */ # pragma ivdep # pragma swp # pragma unroll # pragma prefetch # if 0 # pragma simd noassert # endif #endif /* VDM auto patch */ for (unsigned int i=0; i<m_handlersWithPendingEvents.GetCount(); i++) m_handlersWithPendingEvents[i]->DeletePendingEvents(); m_handlersWithPendingEvents.Clear(); wxLEAVE_CRIT_SECT(m_handlersWithPendingEventsLocker); }