+ wxLogTrace(wxEpollDispatcher_Trace,
+ wxT("removed fd %d from %d"), fd, m_epollDescriptor);
+ return true;
+}
+
+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;
+ }
+ }