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;  | 
