/*
+ * libev select fd activity backend
+ *
* Copyright (c) 2007 Marc Alexander Lehmann <libev@schmorp.de>
* All rights reserved.
*
#include <unistd.h>
/* for unix systems */
-#include <sys/select.h>
+#ifndef WIN32
+# include <sys/select.h>
+#endif
#include <string.h>
#include <inttypes.h>
-static unsigned char *vec_ri, *vec_ro, *vec_wi, *vec_wo;
-static int vec_max;
-
static void
-select_modify (int fd, int oev, int nev)
+select_modify (EV_P_ int fd, int oev, int nev)
{
int offs = fd >> 3;
int mask = 1 << (fd & 7);
+ if (oev == nev)
+ return;
+
if (vec_max < (fd >> 5) + 1)
{
int new_max = (fd >> 5) + 1;
vec_wi [offs] &= ~mask;
}
-static void select_poll (ev_tstamp timeout)
+static void
+select_poll (EV_P_ ev_tstamp timeout)
{
struct timeval tv;
int res;
events |= byte_w & (1 << bit) ? EV_WRITE : 0;
if (events)
- fd_event (idx * 8 + bit, events);
+ fd_event (EV_A_ idx * 8 + bit, events);
}
}
}
else if (res < 0)
{
if (errno == EBADF)
- fd_recheck ();
+ fd_ebadf (EV_A);
+ else if (errno == ENOMEM)
+ fd_enomem (EV_A);
}
}
-void select_init (int flags)
+static int
+select_init (EV_P_ int flags)
{
- ev_method = EVMETHOD_SELECT;
method_fudge = 1e-2; /* needed to compensate for select returning early, very conservative */
method_modify = select_modify;
method_poll = select_poll;
+
+ vec_max = 0;
+ vec_ri = 0;
+ vec_ri = 0;
+ vec_wo = 0;
+ vec_wo = 0;
+
+ return EVMETHOD_SELECT;
+}
+
+static void
+select_destroy (EV_P)
+{
+ free (vec_ri);
+ free (vec_ro);
+ free (vec_wi);
+ free (vec_wo);
}