Browse Source

*** empty log message ***

master
Marc Alexander Lehmann 13 years ago
parent
commit
b1641f98b0
4 changed files with 46 additions and 10 deletions
  1. +4
    -0
      Changes
  2. +6
    -0
      ev.c
  3. +18
    -1
      ev.pod
  4. +18
    -9
      ev_select.c

+ 4
- 0
Changes View File

@ -1,5 +1,8 @@
Revision history for libev, a high-performance and full-featured event loop.
- work around yet another windows bug: FD_SET actually adds fd's
multiple times to the fd_*SET*, despite official MSN docs claiming
otherwise. Reported and wel-analysed by Matt Tolton.
- define NFSBITS to 0 when EV_SELECT_IS_WINSOCKET to make it compile
(reported any analysed by Chris Hulbert).
- fix a bug in ev_ebadf (this function is only used to catch
@ -7,6 +10,7 @@ Revision history for libev, a high-performance and full-featured event loop.
- fix a bug in fd_intern on win32 (could lead to compile errors
under some circumstances, but would work correctly if it compiles).
reported by Matt Tolton.
- (try to) work around missing lstat on windows.
- pass in the write fd set as except fd set under windows. windows
is so uncontrollably lame that it requires this. this means that
switching off oobinline is not supported (but tcp/ip doesn't


+ 6
- 0
ev.c View File

@ -2571,6 +2571,12 @@ infy_fork (EV_P)
#endif
#ifdef _WIN32
# define EV_LSTAT(p,b) _stati64 (p, b)
#else
# define EV_LSTAT(p,b) lstat (p, b)
#endif
void
ev_stat_stat (EV_P_ ev_stat *w)
{


+ 18
- 1
ev.pod View File

@ -3328,6 +3328,22 @@ different implementation for windows, as libev offers the POSIX readiness
notification model, which cannot be implemented efficiently on windows
(Microsoft monopoly games).
A typical way to use libev under windows is to embed it (see the embedding
section for details) and use the following F<evwrap.h> header file instead
of F<ev.h>:
#define EV_STANDALONE /* keeps ev from requiring config.h */
#define EV_SELECT_IS_WINSOCKET 1 /* configure libev for windows select */
#define EV_STAT_ENABLE 0 /* no stat() availble */
#include "ev.h"
And compile the following F<evwrap.c> file into your project (make sure
you do I<not> compile the F<ev.c> or any other embedded soruce files!):
#include "evwrap.h"
#include "ev.c"
=over 4
=item The winsocket select function
@ -3335,7 +3351,8 @@ notification model, which cannot be implemented efficiently on windows
The winsocket C<select> function doesn't follow POSIX in that it
requires socket I<handles> and not socket I<file descriptors> (it is
also extremely buggy). This makes select very inefficient, and also
requires a mapping from file descriptors to socket handles. See the
requires a mapping from file descriptors to socket handles (the Microsoft
C runtime provides the function C<_open_osfhandle> for this). See the
discussion of the C<EV_SELECT_USE_FD_SET>, C<EV_SELECT_IS_WINSOCKET> and
C<EV_FD_TO_WIN32_HANDLE> preprocessor symbols for more info.


+ 18
- 9
ev_select.c View File

@ -79,15 +79,24 @@ select_modify (EV_P_ int fd, int oev, int nev)
int handle = fd;
#endif
if (nev & EV_READ)
FD_SET (handle, (fd_set *)vec_ri);
else
FD_CLR (handle, (fd_set *)vec_ri);
if (nev & EV_WRITE)
FD_SET (handle, (fd_set *)vec_wi);
else
FD_CLR (handle, (fd_set *)vec_wi);
/* FD_SET is broken on windows (it adds the fd to a set twice or more,
* which eventually leads to overflows). Need to call it only on changes.
*/
#if EV_SELECT_IS_WINSOCKET
if ((oev ^ nev) & EV_READ)
#endif
if (nev & EV_READ)
FD_SET (handle, (fd_set *)vec_ri);
else
FD_CLR (handle, (fd_set *)vec_ri);
#if EV_SELECT_IS_WINSOCKET
if ((oev ^ nev) & EV_WRITE)
#endif
if (nev & EV_WRITE)
FD_SET (handle, (fd_set *)vec_wi);
else
FD_CLR (handle, (fd_set *)vec_wi);
#else


Loading…
Cancel
Save