|
32 | 32 | #include <poll.h> |
33 | 33 | #endif |
34 | 34 |
|
| 35 | +SocketEventsMode g_socket_events_mode{SocketEventsMode::Unknown}; |
| 36 | + |
35 | 37 | static inline bool IOErrorIsPermanent(int err) |
36 | 38 | { |
37 | 39 | return err != WSAEAGAIN && err != WSAEINTR && err != WSAEWOULDBLOCK && err != WSAEINPROGRESS; |
@@ -162,10 +164,17 @@ bool Sock::Wait(std::chrono::milliseconds timeout, Event requested, SocketEvents |
162 | 164 | { |
163 | 165 | EventsPerSock events_per_sock{std::make_pair(m_socket, Events{requested})}; |
164 | 166 |
|
| 167 | + // We need to ensure we are only using a level-triggered mode because we are expecting |
| 168 | + // a direct correlation between the events reported and the one socket we are querying |
165 | 169 | if (auto [sem, _, __] = event_params; sem != SocketEventsMode::Poll && sem != SocketEventsMode::Select) { |
166 | | - // We need to ensure we are only using a level-triggered mode because we are expecting |
167 | | - // a direct correlation between the events reported and the one socket we are querying |
168 | | - event_params = SocketEventsParams(); |
| 170 | + // We will use a compatible fallback events mode if we didn't specify a valid option |
| 171 | + event_params = SocketEventsParams{ |
| 172 | +#ifdef USE_POLL |
| 173 | + SocketEventsMode::Poll |
| 174 | +#else |
| 175 | + SocketEventsMode::Select |
| 176 | +#endif /* USE_POLL */ |
| 177 | + }; |
169 | 178 | } |
170 | 179 | if (!WaitMany(timeout, events_per_sock, event_params)) { |
171 | 180 | return false; |
@@ -435,7 +444,7 @@ void Sock::SendComplete(const std::string& data, |
435 | 444 | // Wait for a short while (or the socket to become ready for sending) before retrying |
436 | 445 | // if nothing was sent. |
437 | 446 | const auto wait_time = std::min(deadline - now, std::chrono::milliseconds{MAX_WAIT_FOR_IO}); |
438 | | - (void)Wait(wait_time, SEND); |
| 447 | + (void)Wait(wait_time, SEND, SocketEventsParams{::g_socket_events_mode}); |
439 | 448 | } |
440 | 449 | } |
441 | 450 |
|
@@ -518,7 +527,7 @@ std::string Sock::RecvUntilTerminator(uint8_t terminator, |
518 | 527 |
|
519 | 528 | // Wait for a short while (or the socket to become ready for reading) before retrying. |
520 | 529 | const auto wait_time = std::min(deadline - now, std::chrono::milliseconds{MAX_WAIT_FOR_IO}); |
521 | | - (void)Wait(wait_time, RECV); |
| 530 | + (void)Wait(wait_time, RECV, SocketEventsParams{::g_socket_events_mode}); |
522 | 531 | } |
523 | 532 | } |
524 | 533 |
|
|
0 commit comments