OSDN Git Service

* fhandler_socket.cc (fhandler_socket::close): Respond to signals while
authorcgf <cgf>
Tue, 5 Mar 2002 18:02:52 +0000 (18:02 +0000)
committercgf <cgf>
Tue, 5 Mar 2002 18:02:52 +0000 (18:02 +0000)
looping, waiting for socket to close.  Superstitiously clear last error when
WSAEWOULDBLOCK.

winsup/cygwin/ChangeLog
winsup/cygwin/fhandler_socket.cc

index 48a40cd..525167c 100644 (file)
@@ -1,3 +1,9 @@
+2002-03-05  Christopher Faylor  <cgf@redhat.com>
+
+       * fhandler_socket.cc (fhandler_socket::close): Respond to signals while
+       looping, waiting for socket to close.  Superstitiously clear last error
+       when WSAEWOULDBLOCK.
+
 2002-03-05  Robert Collins  <rbtcollins@hotmail.com>
 
        * cygserver_transport_pipes.cc (transport_layer_pipes::transport_layer_pipes): 
index cf8ec1c..e343c90 100644 (file)
@@ -352,13 +352,21 @@ fhandler_socket::close ()
   setsockopt (get_socket (), SOL_SOCKET, SO_LINGER,
              (const char *)&linger, sizeof linger);
 
-  while ((res = closesocket (get_socket ()))
-        && WSAGetLastError () == WSAEWOULDBLOCK)
-    continue;
-  if (res)
+  while ((res = closesocket (get_socket ())) != 0)
     {
-      set_winsock_errno ();
-      res = -1;
+      if (WSAGetLastError () != WSAEWOULDBLOCK)
+       {
+         set_winsock_errno ();
+         res = -1;
+         break;
+       }
+      if (WaitForSingleObject (signal_arrived, 10) == WAIT_OBJECT_0)
+       {
+         set_errno (EINTR);
+         res = -1;
+         break;
+       }
+      WSASetLastError (0);
     }
 
   close_secret_event ();