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 <gnewton@peavey-eu.com>
Dan Zhang needed to defeat the recv() with PEEK in order to get working
poll() emulation on 64-bit windows.
I cleaned up the style in that file and made a version of his workaround
(which was force recv result to 0). I can't test the result so it may
need more work.
Reported-by: Dan Zhang <emaildanzhang@gmail.com>
Signed-off-by: Andy Green <andy@warmcat.com>