prevent multiplexing Windows kernel event objects we listen for across various socket...
authorAndrew Dunstan <andrew@dunslane.net>
Sat, 29 Jul 2006 20:14:40 +0000 (20:14 +0000)
committerAndrew Dunstan <andrew@dunslane.net>
Sat, 29 Jul 2006 20:14:40 +0000 (20:14 +0000)
src/backend/port/win32/socket.c

index 508a053fc627ba59756ca82fa7bca8f0f35975a6..ec1d1ad18a52458e759d77c63edeb559fbb6a1dd 100644 (file)
@@ -106,6 +106,7 @@ int
 pgwin32_waitforsinglesocket(SOCKET s, int what)
 {
        static HANDLE waitevent = INVALID_HANDLE_VALUE;
+       static SOCKET current_socket = -1;
        HANDLE          events[2];
        int                     r;
 
@@ -121,6 +122,15 @@ pgwin32_waitforsinglesocket(SOCKET s, int what)
                ereport(ERROR,
                                (errmsg_internal("Failed to reset socket waiting event: %i", (int) GetLastError())));
 
+       /*
+        * make sure we don't multiplex this kernel event object with a different 
+        * socket from a previous call
+        */
+
+       if (current_socket != s && current_socket != -1)
+               WSAEventSelect(current_socket, waitevent, 0);
+
+       current_socket = s;
 
        if (WSAEventSelect(s, waitevent, what) == SOCKET_ERROR)
        {