heh. I was just doing it the way Tom suggested - see attached. With a
little more trouble we could also keep track if the listened for events
and sometimes save ourselves a second call to WSAEventSelect, but I'm
not sure it's worth it.
[EMAIL PROTECTED] wrote:
Is anyone working on this?
Tom Lane wrote:
> korry <[EMAIL PROTECTED] <mailto:[EMAIL PROTECTED]>> writes:
> > The problem is that, each time you go through
> > pgwin32_waitforsinglesocket(), you tie the *same* kernel object
> > (waitevent is static) to each socket.
> > The fix is pretty simple - just call WSAEventSelect( s, waitevent, 0 )
> > after WaitForMultipleObjectsEx() returns. That disassociates the socket
> > from the Event (it will get re-associated the next time
> > pgwin32_waitforsingleselect() is called.
> Hmm. Presumably we don't do this a whole lot (use multiple sockets) or
> we'd have noticed before. Perhaps better would be to keep an additional
> static variable saying which socket the event is currently associated
> to, and only issue the extra WSAEventSelect calls if we need to change
> it. Or is WSAEventSelect fast enough that it doesn't matter?
Here's a simple patch that fixes the problem (I haven't explored the
performance of this patch compared to Tom's suggestion).
RCS file: /cvsroot/pgsql/src/backend/port/win32/socket.c,v
retrieving revision 1.11
diff -c -r1.11 socket.c
*** backend/port/win32/socket.c 5 Mar 2006 15:58:35 -0000 1.11
--- backend/port/win32/socket.c 29 Jul 2006 14:19:23 -0000
*** 106,111 ****
--- 106,112 ----
pgwin32_waitforsinglesocket(SOCKET s, int what)
static HANDLE waitevent = INVALID_HANDLE_VALUE;
+ static SOCKET current_socket = -1;
*** 121,126 ****
--- 122,136 ----
(errmsg_internal("Failed to reset socket waiting event: %i", (int) GetLastError())));
+ * make sure we don't multiplex this 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)
---------------------------(end of broadcast)---------------------------
TIP 2: Don't 'kill -9' the postmaster