diff options
Diffstat (limited to 'winsup/cygwin/fhandler_socket.cc')
-rw-r--r-- | winsup/cygwin/fhandler_socket.cc | 18 |
1 files changed, 11 insertions, 7 deletions
diff --git a/winsup/cygwin/fhandler_socket.cc b/winsup/cygwin/fhandler_socket.cc index bc3c610e0..21bc7316e 100644 --- a/winsup/cygwin/fhandler_socket.cc +++ b/winsup/cygwin/fhandler_socket.cc @@ -748,6 +748,12 @@ fhandler_socket::wait_for_events (const long event_mask, const DWORD flags) int ret; long events = 0; + WSAEVENT ev[3] = { wsock_evt, NULL, NULL }; + wait_signal_arrived here (ev[1]); + DWORD ev_cnt = 2; + if ((ev[2] = pthread::get_cancel_event ()) != NULL) + ++ev_cnt; + while (!(ret = evaluate_events (event_mask, events, !(flags & MSG_PEEK))) && !events) { @@ -757,14 +763,9 @@ fhandler_socket::wait_for_events (const long event_mask, const DWORD flags) return SOCKET_ERROR; } - WSAEVENT ev[2] = { wsock_evt }; - set_signal_arrived here (ev[1]); - switch (WSAWaitForMultipleEvents (2, ev, FALSE, 50, FALSE)) + switch (WSAWaitForMultipleEvents (ev_cnt, ev, FALSE, 50, FALSE)) { case WSA_WAIT_TIMEOUT: - pthread_testcancel (); - break; - case WSA_WAIT_EVENT_0: break; @@ -774,8 +775,11 @@ fhandler_socket::wait_for_events (const long event_mask, const DWORD flags) WSASetLastError (WSAEINTR); return SOCKET_ERROR; + case WSA_WAIT_EVENT_0 + 2: + pthread::static_cancel_self (); + break; + default: - pthread_testcancel (); /* wsock_evt can be NULL. We're generating the same errno values as for sockets on which shutdown has been called. */ if (WSAGetLastError () != WSA_INVALID_HANDLE) |