mirror of
https://github.com/bitcoin/bitcoin.git
synced 2025-04-27 12:26:07 +02:00
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.
This commit is contained in:
parent
78fdfbea66
commit
ea1845315a
@ -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…
x
Reference in New Issue
Block a user