From 7ee4f890a3497997a963fceca256069ecdf829d5 Mon Sep 17 00:00:00 2001 From: Graham Newton Date: Sat, 9 Nov 2013 08:11:41 +0800 Subject: [PATCH] windows workaround unsigned fd in emulated poll A common practise to temporarily disable a socket in a poll call is to negate the socket fd. poll should then ignore the socket. emulated_poll does this with the following code: if (poll_fd->fd < 0 || !poll_fd->events) goto skip1; However on Windows the fd field in WSAPOLLFD is unsigned int!!! So the check for a negative fd value always fails. This results in select returning an error with an error code of 10038 -- Socket operation on nonsocket. The fix is to type cast fd like so: if ((int)poll_fd->fd < 0 || !poll_fd->events) This may be the cause of some high CPU load reports. I noticed the load being 50% with my application running on Windows XP. Signed-off-by: Graham Newton --- win32port/win32helpers/websock-w32.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/win32port/win32helpers/websock-w32.c b/win32port/win32helpers/websock-w32.c index bec150b1..ec3022e9 100644 --- a/win32port/win32helpers/websock-w32.c +++ b/win32port/win32helpers/websock-w32.c @@ -46,7 +46,7 @@ INT WSAAPI emulated_poll(LPWSAPOLLFD fdarray, ULONG nfds, INT timeout) poll_fd->revents = 0; - if (poll_fd->fd < 0 || !poll_fd->events) + if ((int)poll_fd->fd < 0 || !poll_fd->events) goto skip1; if (max_socket < poll_fd->fd)