diff –git a/ext/libev/ev_select.c b/ext/libev/ev_select.c index f38d6ca..3a32642 100644 — a/ext/libev/ev_select.c +++ b/ext/libev/ev_select.c @@ -67,6 +67,53 @@
#include <string.h>
+#ifdef _WIN32 +
+########## COOLIO PATCHERY HO! ########## + +Ruby undefs FD_* utilities for own implementation. +It converts fd argument into socket handle internally on Windows, +so libev should not use Ruby's FD_* utilities. + +Following FD_* utilities come from MinGW. +RubyInstaller is built by MinGW so this should work. +
+int PASCAL __WSAFDIsSet(SOCKET,fd_set*); +#define EV_WIN_FD_CLR(fd,set) do { u_int __i;\ +for (__i = 0; __i < ((fd_set *)(set))->fd_count ; __i++) {\ + if (((fd_set *)(set))->fd_array == (fd)) {\ + while (__i < ((fd_set *)(set))->fd_count-1) {\ + ((fd_set*)(set))->fd_array = ((fd_set*)(set))->fd_array;\ + __i++;\ + }\ + ((fd_set*)(set))->fd_count–;\ + break;\ + }\ +}\ +} while (0) +#define EV_WIN_FD_SET(fd, set) do { u_int __i;\ +for (__i = 0; __i < ((fd_set *)(set))->fd_count ; __i++) {\ + if (((fd_set *)(set))->fd_array == (fd)) {\ + break;\ + }\ +}\ +if (__i == ((fd_set *)(set))->fd_count) {\ + if (((fd_set *)(set))->fd_count < FD_SETSIZE) {\ + ((fd_set *)(set))->fd_array = (fd);\ + ((fd_set *)(set))->fd_count++;\ + }\ +}\ +} while(0) +#define EV_WIN_FD_ZERO(set) (((fd_set *)(set))->fd_count=0) +#define EV_WIN_FD_ISSET(fd, set) __WSAFDIsSet((SOCKET)(fd), (fd_set *)(set)) + ########################################
+#else +#define EV_WIN_FD_CLR FD_CLR +#define EV_WIN_FD_SET FD_SET +#define EV_WIN_FD_ZERO FD_ZERO +#define EV_WIN_FD_ISSET FD_ISSET +#endif +
static void select_modify (EV_P_ int fd, int oev, int nev) {
@@ -91,17 +138,17 @@ select_modify (EV_P_ int fd, int oev, int nev)
if ((oev ^ nev) & EV_READ) #endif if (nev & EV_READ)
-
FD_SET (handle, (fd_set *)vec_ri);
+ EV_WIN_FD_SET (handle, (fd_set *)vec_ri);
else
-
FD_CLR (handle, (fd_set *)vec_ri);
+ EV_WIN_FD_CLR (handle, (fd_set *)vec_ri);
#if EV_SELECT_IS_WINSOCKET if ((oev ^ nev) & EV_WRITE) #endif if (nev & EV_WRITE)
-
FD_SET (handle, (fd_set *)vec_wi);
+ EV_WIN_FD_SET (handle, (fd_set *)vec_wi);
else
-
FD_CLR (handle, (fd_set *)vec_wi);
+ EV_WIN_FD_CLR (handle, (fd_set *)vec_wi);
#else
@@ -136,6 +183,8 @@ select_modify (EV_P_ int fd, int oev, int nev)
} }
+#undef socket +
static void select_poll (EV_P_ ev_tstamp timeout) {
@@ -230,10 +279,10 @@ select_poll (EV_P_ ev_tstamp timeout)
int handle = fd; #endif
-
if (FD_ISSET (handle, (fd_set *)vec_ro)) events |= EV_READ;
-
if (FD_ISSET (handle, (fd_set *)vec_wo)) events |= EV_WRITE;
+ if (EV_WIN_FD_ISSET (handle, (fd_set *)vec_ro)) events |= EV_READ; + if (EV_WIN_FD_ISSET (handle, (fd_set *)vec_wo)) events |= EV_WRITE;
#ifdef _WIN32
-
if (FD_ISSET (handle, (fd_set *)vec_eo)) events |= EV_WRITE;
+ if (EV_WIN_FD_ISSET (handle, (fd_set *)vec_eo)) events |= EV_WRITE;
#endif if (expect_true (events))
@@ -279,9 +328,9 @@ select_init (EV_P_ int flags)
backend_poll = select_poll; #if EV_SELECT_USE_FD_SET
-
vec_ri = ev_malloc (sizeof (fd_set)); FD_ZERO ((fd_set *)vec_ri);
+ vec_ri = ev_malloc (sizeof (fd_set)); EV_WIN_FD_ZERO ((fd_set *)vec_ri);
vec_ro = ev_malloc (sizeof (fd_set));
-
vec_wi = ev_malloc (sizeof (fd_set)); FD_ZERO ((fd_set *)vec_wi);
+ vec_wi = ev_malloc (sizeof (fd_set)); EV_WIN_FD_ZERO ((fd_set *)vec_wi);
vec_wo = ev_malloc (sizeof (fd_set)); #ifdef _WIN32 vec_eo = ev_malloc (sizeof (fd_set));