summaryrefslogtreecommitdiff
path: root/ev_select.c
diff options
context:
space:
mode:
Diffstat (limited to 'ev_select.c')
-rw-r--r--ev_select.c29
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;