int wxEpollDispatcher::DoPoll(epoll_event *events, int numEvents, int timeout) const { // the code below relies on TIMEOUT_INFINITE being -1 so that we can pass // timeout value directly to epoll_wait() which interprets -1 as meaning to // wait forever and would need to be changed if the value of // TIMEOUT_INFINITE ever changes wxCOMPILE_TIME_ASSERT( TIMEOUT_INFINITE == -1, UpdateThisCode ); wxMilliClock_t timeEnd; if ( timeout > 0 ) timeEnd = wxGetLocalTimeMillis(); int rc; for ( ;; ) { rc = epoll_wait(m_epollDescriptor, events, numEvents, timeout); if ( rc != -1 || errno != EINTR ) break; // we got interrupted, update the timeout and restart if ( timeout > 0 ) { timeout = wxMilliClockToLong(timeEnd - wxGetLocalTimeMillis()); if ( timeout < 0 ) return 0; } } return rc; }
bool wxConsoleEventLoop::Pending() const { if ( m_dispatcher->HasPending() ) return true; #if wxUSE_TIMER wxUsecClock_t nextTimer; if ( wxTimerScheduler::Get().GetNext(&nextTimer) && !wxMilliClockToLong(nextTimer) ) return true; #endif // wxUSE_TIMER return false; }
int wxConsoleEventLoop::DispatchTimeout(unsigned long timeout) { #if wxUSE_TIMER // check if we need to decrease the timeout to account for a timer wxUsecClock_t nextTimer; if ( wxTimerScheduler::Get().GetNext(&nextTimer) ) { unsigned long timeUntilNextTimer = wxMilliClockToLong(nextTimer / 1000); if ( timeUntilNextTimer < timeout ) timeout = timeUntilNextTimer; } #endif // wxUSE_TIMER bool hadEvent = m_dispatcher->Dispatch(timeout) > 0; #if wxUSE_TIMER if ( wxTimerScheduler::Get().NotifyExpired() ) hadEvent = true; #endif // wxUSE_TIMER return hadEvent ? 1 : -1; }