net: extend Sock::Wait() to report a timeout

Previously `Sock::Wait()` would not have signaled to the caller whether
a timeout or one of the requested events occurred since that was not
needed by any of the callers.

Such functionality will be needed in the I2P implementation, thus extend
the `Sock::Wait()` method.
pull/826/head
Vasil Dimov 4 years ago
parent 78fdfbea66
commit ea1845315a
No known key found for this signature in database
GPG Key ID: 54DF06F64B55CBBF

@ -59,7 +59,7 @@ ssize_t Sock::Recv(void* buf, size_t len, int flags) const
return recv(m_socket, static_cast<char*>(buf), len, flags); return recv(m_socket, static_cast<char*>(buf), len, flags);
} }
bool Sock::Wait(std::chrono::milliseconds timeout, Event requested) const bool Sock::Wait(std::chrono::milliseconds timeout, Event requested, Event* occurred) const
{ {
#ifdef USE_POLL #ifdef USE_POLL
pollfd fd; pollfd fd;
@ -72,7 +72,21 @@ bool Sock::Wait(std::chrono::milliseconds timeout, Event requested) const
fd.events |= POLLOUT; fd.events |= POLLOUT;
} }
return poll(&fd, 1, count_milliseconds(timeout)) != SOCKET_ERROR; if (poll(&fd, 1, count_milliseconds(timeout)) == SOCKET_ERROR) {
return false;
}
if (occurred != nullptr) {
*occurred = 0;
if (fd.revents & POLLIN) {
*occurred |= RECV;
}
if (fd.revents & POLLOUT) {
*occurred |= SEND;
}
}
return true;
#else #else
if (!IsSelectableSocket(m_socket)) { if (!IsSelectableSocket(m_socket)) {
return false; return false;
@ -93,7 +107,21 @@ bool Sock::Wait(std::chrono::milliseconds timeout, Event requested) const
timeval timeout_struct = MillisToTimeval(timeout); timeval timeout_struct = MillisToTimeval(timeout);
return select(m_socket + 1, &fdset_recv, &fdset_send, nullptr, &timeout_struct) != SOCKET_ERROR; if (select(m_socket + 1, &fdset_recv, &fdset_send, nullptr, &timeout_struct) == SOCKET_ERROR) {
return false;
}
if (occurred != nullptr) {
*occurred = 0;
if (FD_ISSET(m_socket, &fdset_recv)) {
*occurred |= RECV;
}
if (FD_ISSET(m_socket, &fdset_send)) {
*occurred |= SEND;
}
}
return true;
#endif /* USE_POLL */ #endif /* USE_POLL */
} }

@ -105,9 +105,14 @@ public:
* Wait for readiness for input (recv) or output (send). * Wait for readiness for input (recv) or output (send).
* @param[in] timeout Wait this much for at least one of the requested events to occur. * @param[in] timeout Wait this much for at least one of the requested events to occur.
* @param[in] requested Wait for those events, bitwise-or of `RECV` and `SEND`. * @param[in] requested Wait for those events, bitwise-or of `RECV` and `SEND`.
* @param[out] occurred If not nullptr and `true` is returned, then upon return this
* indicates which of the requested events occurred. A timeout is indicated by return
* value of `true` and `occurred` being set to 0.
* @return true on success and false otherwise * @return true on success and false otherwise
*/ */
virtual bool Wait(std::chrono::milliseconds timeout, Event requested) const; virtual bool Wait(std::chrono::milliseconds timeout,
Event requested,
Event* occurred = nullptr) const;
private: private:
/** /**

Loading…
Cancel
Save