Hello, I have stumbled upon an issue with async watchers on Windows that has been previously reported on the mail list - ev_async_send() fails (silently) to signal the watcher. My OS is Windows XP SP3, and I have a fully updated version of Visual C++ Express 2010.
The problem is caused by the fact that in my case the implementation of write() uses WriteFile(), but seems to assume that the handle associated with the passed file descriptor is not in overlapped mode, always sets the lpOverlapped parameter to NULL, and the lpNumberOfBytesWritten argument to a non-NULL value. Furthermore, socket() creates a socket in overlapped mode by default according to MSDN: http://msdn.microsoft.com/en-us/library/windows/desktop/ms740506(v=vs.85).aspx Finally, WriteFile() fails because it has specific expectations for its parameters that are not satisfied, as documented here: http://msdn.microsoft.com/en-us/library/windows/desktop/aa365747(v=vs.85).aspx The solution is simple - call WSASocket() instead of socket(), since the former allows us to set or unset the overlapped attribute explicitly. It is also identical with respect to OS version, header file and library dependencies. I have attached a sample patch; would you please merge it into the libev source code? Yours faithfully, Anton Kirilov --- ev_win32.c.orig 2011-02-16 10:02:50.000000000 +0200 +++ ev_win32.c 2012-02-16 17:06:19.598675577 +0200 @@ -59,7 +59,7 @@ SOCKET listener; SOCKET sock [2] = { -1, -1 }; - if ((listener = socket (AF_INET, SOCK_STREAM, 0)) == INVALID_SOCKET) + if ((listener = WSASocket (AF_INET, SOCK_STREAM, 0, NULL, 0, 0)) == INVALID_SOCKET) return -1; addr.sin_family = AF_INET; _______________________________________________ libev mailing list [email protected] http://lists.schmorp.de/cgi-bin/mailman/listinfo/libev
