diff options
Diffstat (limited to 'ev_select.c')
-rw-r--r-- | ev_select.c | 29 |
1 files changed, 22 insertions, 7 deletions
diff --git a/ev_select.c b/ev_select.c index 9c63f0d..712a113 100644 --- a/ev_select.c +++ b/ev_select.c @@ -100,6 +100,9 @@ select_modify (EV_P_ int fd, int oev, int nev) vec_ro = ev_realloc (vec_ro, new_max * NFDBYTES); /* could free/malloc */ vec_wi = ev_realloc (vec_wi, new_max * NFDBYTES); vec_wo = ev_realloc (vec_wo, new_max * NFDBYTES); /* could free/malloc */ + #ifdef _WIN32 + vec_eo = ev_realloc (vec_eo, new_max * NFDBYTES); /* could free/malloc */ + #endif for (; vec_max < new_max; ++vec_max) ((fd_mask *)vec_ri) [vec_max] = @@ -122,17 +125,19 @@ select_poll (EV_P_ ev_tstamp timeout) { struct timeval tv; int res; + int fd_setsize; + + tv.tv_sec = (long)timeout; + tv.tv_usec = (long)((timeout - (ev_tstamp)tv.tv_sec) * 1e6); #if EV_SELECT_USE_FD_SET - memcpy (vec_ro, vec_ri, sizeof (fd_set)); - memcpy (vec_wo, vec_wi, sizeof (fd_set)); + fd_setsize = sizeof (fd_set); #else - memcpy (vec_ro, vec_ri, vec_max * NFDBYTES); - memcpy (vec_wo, vec_wi, vec_max * NFDBYTES); + fd_setsize = vec_max * NFDBYTES; #endif - tv.tv_sec = (long)timeout; - tv.tv_usec = (long)((timeout - (ev_tstamp)tv.tv_sec) * 1e6); + memcpy (vec_ro, vec_ri, fd_setsize); + memcpy (vec_wo, vec_wi, fd_setsize); #ifdef _WIN32 /* pass in the write set as except set. @@ -140,7 +145,8 @@ select_poll (EV_P_ ev_tstamp timeout) * errors to be reported as an exception and not by setting * the writable bit. this is so uncontrollably lame. */ - res = select (vec_max * NFDBITS, (fd_set *)vec_ro, (fd_set *)vec_wo, (fd_set *)vec_wo, &tv); + memcpy (vec_eo, vec_wi, fd_setsize); + res = select (vec_max * NFDBITS, (fd_set *)vec_ro, (fd_set *)vec_wo, (fd_set *)vec_eo, &tv); #else res = select (vec_max * NFDBITS, (fd_set *)vec_ro, (fd_set *)vec_wo, 0, &tv); #endif @@ -201,6 +207,9 @@ select_poll (EV_P_ ev_tstamp timeout) if (FD_ISSET (handle, (fd_set *)vec_ro)) events |= EV_READ; if (FD_ISSET (handle, (fd_set *)vec_wo)) events |= EV_WRITE; + #ifdef _WIN32 + if (FD_ISSET (handle, (fd_set *)vec_eo)) events |= EV_WRITE; + #endif if (expect_true (events)) fd_event (EV_A_ fd, events); @@ -215,6 +224,9 @@ select_poll (EV_P_ ev_tstamp timeout) { fd_mask word_r = ((fd_mask *)vec_ro) [word]; fd_mask word_w = ((fd_mask *)vec_wo) [word]; + #ifdef _WIN32 + word_w |= ((fd_mask *)vec_eo) [word]; + #endif if (word_r || word_w) for (bit = NFDBITS; bit--; ) @@ -247,6 +259,9 @@ select_init (EV_P_ int flags) vec_ro = ev_malloc (sizeof (fd_set)); vec_wi = ev_malloc (sizeof (fd_set)); FD_ZERO ((fd_set *)vec_wi); vec_wo = ev_malloc (sizeof (fd_set)); + #ifdef _WIN32 + vec_eo = ev_malloc (sizeof (fd_set)); + #endif #else vec_max = 0; vec_ri = 0; |