+ /* Try select now */
+ if (select(m_fd + 1, &readfds, &writefds, &exceptfds, &tv) < 0)
+ {
+ /* What to do here? */
+ return (result & flags);
+ }
+
+ /* Check for exceptions and errors */
+ if (wxFD_ISSET(m_fd, &exceptfds))
+ {
+ m_establishing = false;
+ m_detected = wxSOCKET_LOST_FLAG;
+
+ /* LOST event: Abort any further processing */
+ return (wxSOCKET_LOST_FLAG & flags);
+ }
+
+ /* Check for readability */
+ if (wxFD_ISSET(m_fd, &readfds))
+ {
+ result |= wxSOCKET_INPUT_FLAG;
+
+ if (m_server && m_stream)
+ {
+ /* This is a TCP server socket that detected a connection.
+ While the INPUT_FLAG is also set, it doesn't matter on
+ this kind of sockets, as we can only Accept() from them. */
+ m_detected |= wxSOCKET_CONNECTION_FLAG;
+ }
+ }
+
+ /* Check for writability */
+ if (wxFD_ISSET(m_fd, &writefds))
+ {
+ if (m_establishing && !m_server)
+ {
+ int error;
+ SOCKOPTLEN_T len = sizeof(error);
+ m_establishing = false;
+ getsockopt(m_fd, SOL_SOCKET, SO_ERROR, (char*)&error, &len);
+
+ if (error)
+ {
+ m_detected = wxSOCKET_LOST_FLAG;
+
+ /* LOST event: Abort any further processing */
+ return (wxSOCKET_LOST_FLAG & flags);
+ }
+ else
+ {
+ m_detected |= wxSOCKET_CONNECTION_FLAG;
+ }
+ }
+ else
+ {
+ result |= wxSOCKET_OUTPUT_FLAG;
+ }
+ }
+
+ return (result | m_detected) & flags;
+}
+
+// All Wait functions poll the socket using Select() to
+// check for the specified combination of conditions, until one
+// of these conditions become true, an error occurs, or the
+// timeout elapses. The polling loop runs the event loop so that
+// this won't block the GUI.
+
+bool
+wxSocketBase::DoWait(long seconds, long milliseconds, wxSocketEventFlags flags)
+{
+ wxCHECK_MSG( m_impl, false, "can't wait on invalid socket" );
+
+ // This can be set to true from Interrupt() to exit this function a.s.a.p.
+ m_interrupt = false;
+
+
+ // Use either the provided timeout or the default timeout value associated
+ // with this socket.
+ //
+ // TODO: allow waiting forever, see #9443
+ const long timeout = seconds == -1 ? m_timeout * 1000
+ : seconds * 1000 + milliseconds;
+ const wxMilliClock_t timeEnd = wxGetLocalTimeMillis() + timeout;