summaryrefslogtreecommitdiffstats
path: root/winsup/cygwin/net.cc
diff options
context:
space:
mode:
authorCorinna Vinschen <corinna@vinschen.de>2001-05-18 08:33:33 +0000
committerCorinna Vinschen <corinna@vinschen.de>2001-05-18 08:33:33 +0000
commit0260054a8cf0ca8642994847e4c64156f0adc983 (patch)
tree80af6c9d94cc091944c6d8b305f328ada5572964 /winsup/cygwin/net.cc
parentf6b52c79f54a91c97fdb0591faf4fdfacffb5ff6 (diff)
downloadcygnal-0260054a8cf0ca8642994847e4c64156f0adc983.tar.gz
cygnal-0260054a8cf0ca8642994847e4c64156f0adc983.tar.bz2
cygnal-0260054a8cf0ca8642994847e4c64156f0adc983.zip
* net.cc (wsock_event::wait): Explicitely cancel IO when a signal
arrived to avoid data loss. Fallback to blocking IO when canceling fails.
Diffstat (limited to 'winsup/cygwin/net.cc')
-rw-r--r--winsup/cygwin/net.cc8
1 files changed, 7 insertions, 1 deletions
diff --git a/winsup/cygwin/net.cc b/winsup/cygwin/net.cc
index c63fa3c33..5fbc92e8d 100644
--- a/winsup/cygwin/net.cc
+++ b/winsup/cygwin/net.cc
@@ -90,7 +90,13 @@ wsock_event::wait (int socket, LPDWORD flags)
ret = (int) len;
break;
case WSA_WAIT_EVENT_0 + 1:
- WSASetLastError (WSAEINTR);
+ if (!CancelIo ((HANDLE)socket))
+ {
+ debug_printf ("CancelIo() %E, fallback to blocking io");
+ WSAGetOverlappedResult(socket, &ovr, &len, TRUE, flags);
+ }
+ else
+ WSASetLastError (WSAEINTR);
break;
case WSA_WAIT_FAILED:
break;