From 7e01fd517f7b34988d3438bdde655b75c389de2d Mon Sep 17 00:00:00 2001 From: root Date: Wed, 19 Aug 2009 23:44:51 +0000 Subject: *** empty log message *** --- Changes | 2 ++ ev.c | 24 +++++++++++++++--------- ev.pod | 16 +++++++++++++++- ev_win32.c | 4 ++-- 4 files changed, 34 insertions(+), 12 deletions(-) diff --git a/Changes b/Changes index 3191cb1..0a478fb 100644 --- a/Changes +++ b/Changes @@ -1,6 +1,8 @@ Revision history for libev, a high-performance and full-featured event loop. - backport inotify code to C89. + - implement EV_WIN32_HANDLE_TO_FD and EV_WIN32_CLOSE_FD configuration + symbols to make ti easier for apps to do their own fd management. 3.8 Sun Aug 9 14:30:45 CEST 2009 - incompatible change: do not necessarily reset signal handler diff --git a/ev.c b/ev.c index 4e19864..1161aa3 100644 --- a/ev.c +++ b/ev.c @@ -478,6 +478,16 @@ static EV_ATOMIC_T have_realtime; /* did clock_gettime (CLOCK_REALTIME) work? */ static EV_ATOMIC_T have_monotonic; /* did clock_gettime (CLOCK_MONOTONIC) work? */ #endif +#ifndef EV_FD_TO_WIN32_HANDLE +# define EV_FD_TO_WIN32_HANDLE(fd) _get_osfhandle (fd) +#endif +#ifndef EV_WIN32_HANDLE_TO_FD +# define EV_WIN32_HANDLE_TO_FD(handle) _open_osfhandle (fd, 0) +#endif +#ifndef EV_WIN32_CLOSE_FD +# define EV_WIN32_CLOSE_FD(fd) close (fd) +#endif + #ifdef _WIN32 # include "ev_win32.c" #endif @@ -878,11 +888,7 @@ fd_reify (EV_P) if (events) { unsigned long arg; - #ifdef EV_FD_TO_WIN32_HANDLE - anfd->handle = EV_FD_TO_WIN32_HANDLE (fd); - #else - anfd->handle = _get_osfhandle (fd); - #endif + anfd->handle = EV_FD_TO_WIN32_HANDLE (fd); assert (("libev: only socket fds supported in this configuration", ioctlsocket (anfd->handle, FIONREAD, &arg) == 0)); } #endif @@ -1623,8 +1629,8 @@ loop_destroy (EV_P) if (evpipe [0] >= 0) { - close (evpipe [0]); - close (evpipe [1]); + EV_WIN32_CLOSE_FD (evpipe [0]); + EV_WIN32_CLOSE_FD (evpipe [1]); } } @@ -1730,8 +1736,8 @@ loop_fork (EV_P) if (evpipe [0] >= 0) { - close (evpipe [0]); - close (evpipe [1]); + EV_WIN32_CLOSE_FD (evpipe [0]); + EV_WIN32_CLOSE_FD (evpipe [1]); } evpipe_init (EV_A); diff --git a/ev.pod b/ev.pod index 31aa6b6..00dde2e 100644 --- a/ev.pod +++ b/ev.pod @@ -3665,7 +3665,7 @@ C<_get_osfhandle> on the fd to convert it to an OS handle. Otherwise, it is assumed that all these functions actually work on fds, even on win32. Should not be defined on non-win32 platforms. -=item EV_FD_TO_WIN32_HANDLE +=item EV_FD_TO_WIN32_HANDLE(fd) If C is enabled, then libev needs a way to map file descriptors to socket handles. When not defining this symbol (the @@ -3673,6 +3673,20 @@ default), then libev will call C<_get_osfhandle>, which is usually correct. In some cases, programs use their own file descriptor management, in which case they can provide this function to map fds to socket handles. +=item EV_WIN32_HANDLE_TO_FD(handle) + +If C then libev maps handles to file descriptors +using the standard C<_open_osfhandle> function. For programs implementing +their own fd to handle mapping, overwriting this function makes it easier +to do so. This can be done by defining this macro to an appropriate value. + +=item EV_WIN32_CLOSE_FD(fd) + +If programs implement their own fd to handle mapping on win32, then this +macro can be used to override the C function, useful to unregister +file descriptors again. Note that the replacement function has to close +the underlying OS handle. + =item EV_USE_POLL If defined to be C<1>, libev will compile in support for the C(2) diff --git a/ev_win32.c b/ev_win32.c index a048c0b..ee60ae6 100644 --- a/ev_win32.c +++ b/ev_win32.c @@ -111,8 +111,8 @@ ev_pipe (int filedes [2]) closesocket (listener); #if EV_SELECT_IS_WINSOCKET - filedes [0] = _open_osfhandle (sock [0], 0); - filedes [1] = _open_osfhandle (sock [1], 0); + filedes [0] = EV_WIN32_HANDLE_TO_FD (sock [0]); + filedes [1] = EV_WIN32_HANDLE_TO_FD (sock [1]); #else /* when select isn't winsocket, we also expect socket, connect, accept etc. * to work on fds */ -- cgit v1.2.3