diff options
-rw-r--r-- | ev.c | 61 | ||||
-rw-r--r-- | ev_select.c | 91 | ||||
-rw-r--r-- | evdns.c | 4 | ||||
-rwxr-xr-x | import_libevent | 4 |
4 files changed, 129 insertions, 31 deletions
@@ -66,9 +66,7 @@ #include <sys/types.h> #include <time.h> -#ifndef PERL -# include <signal.h> -#endif +#include <signal.h> #ifndef WIN32 # include <unistd.h> @@ -156,6 +154,59 @@ static int have_monotonic; /* did clock_gettime (CLOCK_MONOTONIC) work? */ /* note: the comment below could not be substantiated, but what would I care */ /* MSDN says this is required to handle SIGFPE */ volatile double SIGFPE_REQ = 0.0f; + +static int +ev_socketpair_tcp (int filedes [2]) +{ + struct sockaddr_in addr = { 0 }; + int addr_size = sizeof (addr); + SOCKET listener; + SOCKET sock [2] = { -1, -1 }; + + if ((listener = socket (AF_INET, SOCK_STREAM, 0)) == INVALID_SOCKET) + return -1; + + addr.sin_family = AF_INET; + addr.sin_addr.s_addr = htonl (INADDR_LOOPBACK); + addr.sin_port = 0; + + if (bind (listener, (struct sockaddr *)&addr, addr_size)) + goto fail; + + if (getsockname(listener, (struct sockaddr *)&addr, &addr_size)) + goto fail; + + if (listen (listener, 1)) + goto fail; + + if ((sock [0] = socket (AF_INET, SOCK_STREAM, 0)) == INVALID_SOCKET) + goto fail; + + if (connect (sock[0], (struct sockaddr *)&addr, addr_size)) + goto fail; + + if ((sock[1] = accept (listener, 0, 0)) < 0) + goto fail; + + closesocket (listener); + + filedes [0] = sock [0]; + filedes [1] = sock [1]; + + return 0; + +fail: + closesocket (listener); + + if (sock [0] != INVALID_SOCKET) closesocket (sock [0]); + if (sock [1] != INVALID_SOCKET) closesocket (sock [1]); + + return -1; +} + +# define ev_pipe(filedes) ev_socketpair_tcp (filedes) +#else +# define ev_pipe(filedes) pipe (filedes) #endif /*****************************************************************************/ @@ -779,7 +830,7 @@ loop_fork (EV_P) close (sigpipe [0]); close (sigpipe [1]); - while (pipe (sigpipe)) + while (ev_pipe (sigpipe)) syserr ("(libev) error creating pipe"); siginit (EV_A); @@ -832,7 +883,7 @@ int ev_default_loop (int methods) { if (sigpipe [0] == sigpipe [1]) - if (pipe (sigpipe)) + if (ev_pipe (sigpipe)) return 0; if (!default_loop) diff --git a/ev_select.c b/ev_select.c index 60cc084..d9fdf92 100644 --- a/ev_select.c +++ b/ev_select.c @@ -32,6 +32,7 @@ /* for unix systems */ #ifdef WIN32 typedef unsigned int uint32_t; +# define EV_SELECT_USE_FD_SET 1 #else # include <sys/select.h> # include <inttypes.h> @@ -42,33 +43,47 @@ typedef unsigned int uint32_t; static void 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_ri = (unsigned char *)ev_realloc (vec_ri, new_max * 4); - vec_ro = (unsigned char *)ev_realloc (vec_ro, new_max * 4); /* could free/malloc */ - vec_wi = (unsigned char *)ev_realloc (vec_wi, new_max * 4); - vec_wo = (unsigned char *)ev_realloc (vec_wo, new_max * 4); /* could free/malloc */ - - for (; vec_max < new_max; ++vec_max) - ((uint32_t *)vec_ri)[vec_max] = - ((uint32_t *)vec_wi)[vec_max] = 0; - } - - vec_ri [offs] |= mask; - if (!(nev & EV_READ)) - vec_ri [offs] &= ~mask; +#if EV_SELECT_USE_FD_SET + if (nev & EV_READ) + FD_SET (fd, (struct fd_set *)vec_ri); + else + FD_CLR (fd, (struct fd_set *)vec_ri); - vec_wi [offs] |= mask; - if (!(nev & EV_WRITE)) - vec_wi [offs] &= ~mask; + if (nev & EV_WRITE) + FD_SET (fd, (struct fd_set *)vec_wi); + else + FD_CLR (fd, (struct fd_set *)vec_wi); +#else + { + int offs = fd >> 3; + int mask = 1 << (fd & 7); + + if (vec_max < (fd >> 5) + 1) + { + int new_max = (fd >> 5) + 1; + + vec_ri = (unsigned char *)ev_realloc (vec_ri, new_max * 4); + vec_ro = (unsigned char *)ev_realloc (vec_ro, new_max * 4); /* could free/malloc */ + vec_wi = (unsigned char *)ev_realloc (vec_wi, new_max * 4); + vec_wo = (unsigned char *)ev_realloc (vec_wo, new_max * 4); /* could free/malloc */ + + for (; vec_max < new_max; ++vec_max) + ((uint32_t *)vec_ri)[vec_max] = + ((uint32_t *)vec_wi)[vec_max] = 0; + } + + vec_ri [offs] |= mask; + if (!(nev & EV_READ)) + vec_ri [offs] &= ~mask; + + vec_wi [offs] |= mask; + if (!(nev & EV_WRITE)) + vec_wi [offs] &= ~mask; + } +#endif } static void @@ -78,8 +93,13 @@ select_poll (EV_P_ ev_tstamp timeout) struct timeval tv; int res; +#if EV_SELECT_USE_FD_SET + memcpy (vec_ro, vec_ri, sizeof (struct fd_set)); + memcpy (vec_wo, vec_wi, sizeof (struct fd_set)); +#else memcpy (vec_ro, vec_ri, vec_max * 4); memcpy (vec_wo, vec_wi, vec_max * 4); +#endif tv.tv_sec = (long)timeout; tv.tv_usec = (long)((timeout - (ev_tstamp)tv.tv_sec) * 1e6); @@ -88,6 +108,11 @@ select_poll (EV_P_ ev_tstamp timeout) if (res < 0) { +#ifdef WIN32 + if (errno == WSAEINTR ) errno = EINTR; + if (errno == WSAENOTSOCK) errno = EBADF; +#endif + if (errno == EBADF) fd_ebadf (EV_A); else if (errno == ENOMEM && !syserr_cb) @@ -98,6 +123,17 @@ select_poll (EV_P_ ev_tstamp timeout) return; } +#if EV_SELECT_USE_FD_SET + for (word = 0; word < FD_SETSIZE; ++word) + { + int events = 0; + if (FD_ISSET (word, (struct fd_set *)vec_ro)) events |= EV_READ; + if (FD_ISSET (word, (struct fd_set *)vec_wo)) events |= EV_WRITE; + + if (events) + fd_event (EV_A_ word, events); + } +#else for (word = vec_max; word--; ) { if (((uint32_t *)vec_ro) [word] | ((uint32_t *)vec_wo) [word]) @@ -120,6 +156,7 @@ select_poll (EV_P_ ev_tstamp timeout) } } } +#endif } static int @@ -129,11 +166,19 @@ select_init (EV_P_ int flags) method_modify = select_modify; method_poll = select_poll; +#if EV_SELECT_USE_FD_SET + vec_max = FD_SETSIZE / 32; + vec_ri = ev_malloc (sizeof (struct fd_set)); FD_ZERO ((struct fd_set *)vec_ri); + vec_ro = ev_malloc (sizeof (struct fd_set)); + vec_wi = ev_malloc (sizeof (struct fd_set)); FD_ZERO ((struct fd_set *)vec_wi); + vec_wo = ev_malloc (sizeof (struct fd_set)); +#else vec_max = 0; vec_ri = 0; vec_ri = 0; vec_wo = 0; vec_wo = 0; +#endif return EVMETHOD_SELECT; } @@ -1,4 +1,4 @@ -/* $Id: evdns.c,v 1.15 2007-11-05 17:57:54 root Exp $ */ +/* $Id: evdns.c,v 1.16 2007-11-06 16:09:37 root Exp $ */ /* The original version of this module was written by Adam Langley; for * a history of modifications, check out the subversion logs. @@ -80,7 +80,6 @@ #include <string.h> #include <fcntl.h> -#include <sys/time.h> #ifdef HAVE_STDINT_H #include <stdint.h> #endif @@ -88,7 +87,6 @@ #include <string.h> #include <errno.h> #include <assert.h> -#include <unistd.h> #include <limits.h> #include <sys/stat.h> #include <ctype.h> diff --git a/import_libevent b/import_libevent index 2765cae..6b0b8cd 100755 --- a/import_libevent +++ b/import_libevent @@ -14,6 +14,10 @@ perl -ne ' print "#ifndef EV_STANDALONE\n$_#endif\n"; next; } + if (/#include "(unistd.h|sys/time.h)"/) { + print "#ifndef WIN32\n$_#endif\n"; + next; + } next if /#include "log.h"/; print; |