+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 wxEpollDispatcher::HasPending() const
+{
+ epoll_event event;
+
+ // NB: it's not really clear if epoll_wait() can return a number greater
+ // than the number of events passed to it but just in case it can, use
+ // >= instead of == here, see #10397
+ return DoPoll(&event, 1, 0) >= 1;
+}
+
+int wxEpollDispatcher::Dispatch(int timeout)