diff options
| author | root <root> | 2008-05-26 04:14:32 +0000 | 
|---|---|---|
| committer | root <root> | 2008-05-26 04:14:32 +0000 | 
| commit | f85b77ac352d8b007139aef3f54a73cd41c70b29 (patch) | |
| tree | deeb678d14acae8da561784f5fdd3a565aa92fa6 | |
| parent | d993d6efe358429d7aec3709f3ce85b50a756e2b (diff) | |
*** empty log message ***
| -rw-r--r-- | Changes | 6 | ||||
| -rw-r--r-- | ev_select.c | 29 | ||||
| -rw-r--r-- | ev_vars.h | 3 | ||||
| -rw-r--r-- | ev_wrap.h | 2 | 
4 files changed, 31 insertions, 9 deletions
| @@ -1,10 +1,12 @@  Revision history for libev, a high-performance and full-featured event loop.  	- pass in the write fd set as except fd set under windows. windows -          is so uncontrollably lame that it requires this. +          is so uncontrollably lame that it requires this. this means that +          switching off oobinline is not supported (but tcp/ip doesn't +          have oob, so that would be stupid anyways.  3.41 Fri May 23 18:42:54 CEST 2008 -	- work around an (undocumented) bug in winsocket select: if you +	- work around an obscure bug in winsocket select: if you            provide only empty fd sets then select returns WSAEINVAL. how sucky.          - improve timer scheduling stability and reduce use of time_epsilon.          - use 1-based 2-heap for EV_MINIMAL, simplifies code, reduces 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;  @@ -72,6 +72,9 @@ VARx(void *, vec_ri)  VARx(void *, vec_ro)  VARx(void *, vec_wi)  VARx(void *, vec_wo) +#if defined(_WIN32) || EV_GENWRAP +VARx(void *, vec_eo) +#endif  VARx(int, vec_max)  #endif @@ -22,6 +22,7 @@  #define vec_ro ((loop)->vec_ro)  #define vec_wi ((loop)->vec_wi)  #define vec_wo ((loop)->vec_wo) +#define vec_eo ((loop)->vec_eo)  #define vec_max ((loop)->vec_max)  #define polls ((loop)->polls)  #define pollmax ((loop)->pollmax) @@ -94,6 +95,7 @@  #undef vec_ro  #undef vec_wi  #undef vec_wo +#undef vec_eo  #undef vec_max  #undef polls  #undef pollmax | 
