mirror of /home/gitosis/repositories/libev.git
renamed METHODs to BACKENDs
add ev_supported_backends and ev_recommended_backends functions.
This commit is contained in:
parent
46b853611d
commit
04e7d47934
78
ev.c
78
ev.c
|
@ -156,12 +156,6 @@ extern "C" {
|
|||
|
||||
/**/
|
||||
|
||||
/* darwin simply cannot be helped */
|
||||
#ifdef __APPLE__
|
||||
# undef EV_USE_POLL
|
||||
# undef EV_USE_KQUEUE
|
||||
#endif
|
||||
|
||||
#ifndef CLOCK_MONOTONIC
|
||||
# undef EV_USE_MONOTONIC
|
||||
# define EV_USE_MONOTONIC 0
|
||||
|
@ -787,9 +781,40 @@ enable_secure (void)
|
|||
}
|
||||
|
||||
unsigned int
|
||||
ev_method (EV_P)
|
||||
ev_supported_backends (void)
|
||||
{
|
||||
return method;
|
||||
}
|
||||
|
||||
unsigned int
|
||||
ev_recommended_backends (void)
|
||||
{
|
||||
unsigned int flags;
|
||||
|
||||
if (EV_USE_PORT ) flags |= EVBACKEND_PORT;
|
||||
if (EV_USE_KQUEUE) flags |= EVBACKEND_KQUEUE;
|
||||
if (EV_USE_EPOLL ) flags |= EVBACKEND_EPOLL;
|
||||
if (EV_USE_POLL ) flags |= EVBACKEND_POLL;
|
||||
if (EV_USE_SELECT) flags |= EVBACKEND_SELECT;
|
||||
|
||||
return flags;
|
||||
}
|
||||
|
||||
unsigned int
|
||||
ev_backend (EV_P)
|
||||
{
|
||||
unsigned int flags = ev_recommended_backends ();
|
||||
|
||||
#ifndef __NetBSD__
|
||||
/* kqueue is borked on everything but netbsd apparently */
|
||||
/* it usually doesn't work correctly on anything but sockets and pipes */
|
||||
flags &= ~EVBACKEND_KQUEUE;
|
||||
#endif
|
||||
#ifdef __APPLE__
|
||||
// flags &= ~EVBACKEND_KQUEUE; for documentation
|
||||
flags &= ~EVBACKEND_POLL;
|
||||
#endif
|
||||
|
||||
return flags;
|
||||
}
|
||||
|
||||
static void
|
||||
|
@ -815,31 +840,24 @@ loop_init (EV_P_ unsigned int flags)
|
|||
&& getenv ("LIBEV_FLAGS"))
|
||||
flags = atoi (getenv ("LIBEV_FLAGS"));
|
||||
|
||||
if (!(flags & EVMETHOD_ALL))
|
||||
{
|
||||
flags |= EVMETHOD_ALL;
|
||||
#if EV_USE_KQUEUE && !defined (__NetBSD__)
|
||||
/* kqueue is borked on everything but netbsd apparently */
|
||||
/* it usually doesn't work correctly on anything but sockets and pipes */
|
||||
flags &= ~EVMETHOD_KQUEUE;
|
||||
#endif
|
||||
}
|
||||
if (!(flags & 0x0000ffffUL))
|
||||
flags |= ev_recommended_backends ();
|
||||
|
||||
method = 0;
|
||||
#if EV_USE_PORT
|
||||
if (!method && (flags & EVMETHOD_PORT )) method = port_init (EV_A_ flags);
|
||||
if (!method && (flags & EVBACKEND_PORT )) method = port_init (EV_A_ flags);
|
||||
#endif
|
||||
#if EV_USE_KQUEUE
|
||||
if (!method && (flags & EVMETHOD_KQUEUE)) method = kqueue_init (EV_A_ flags);
|
||||
if (!method && (flags & EVBACKEND_KQUEUE)) method = kqueue_init (EV_A_ flags);
|
||||
#endif
|
||||
#if EV_USE_EPOLL
|
||||
if (!method && (flags & EVMETHOD_EPOLL )) method = epoll_init (EV_A_ flags);
|
||||
if (!method && (flags & EVBACKEND_EPOLL )) method = epoll_init (EV_A_ flags);
|
||||
#endif
|
||||
#if EV_USE_POLL
|
||||
if (!method && (flags & EVMETHOD_POLL )) method = poll_init (EV_A_ flags);
|
||||
if (!method && (flags & EVBACKEND_POLL )) method = poll_init (EV_A_ flags);
|
||||
#endif
|
||||
#if EV_USE_SELECT
|
||||
if (!method && (flags & EVMETHOD_SELECT)) method = select_init (EV_A_ flags);
|
||||
if (!method && (flags & EVBACKEND_SELECT)) method = select_init (EV_A_ flags);
|
||||
#endif
|
||||
|
||||
ev_init (&sigev, sigcb);
|
||||
|
@ -853,19 +871,19 @@ loop_destroy (EV_P)
|
|||
int i;
|
||||
|
||||
#if EV_USE_PORT
|
||||
if (method == EVMETHOD_PORT ) port_destroy (EV_A);
|
||||
if (method == EVBACKEND_PORT ) port_destroy (EV_A);
|
||||
#endif
|
||||
#if EV_USE_KQUEUE
|
||||
if (method == EVMETHOD_KQUEUE) kqueue_destroy (EV_A);
|
||||
if (method == EVBACKEND_KQUEUE) kqueue_destroy (EV_A);
|
||||
#endif
|
||||
#if EV_USE_EPOLL
|
||||
if (method == EVMETHOD_EPOLL ) epoll_destroy (EV_A);
|
||||
if (method == EVBACKEND_EPOLL ) epoll_destroy (EV_A);
|
||||
#endif
|
||||
#if EV_USE_POLL
|
||||
if (method == EVMETHOD_POLL ) poll_destroy (EV_A);
|
||||
if (method == EVBACKEND_POLL ) poll_destroy (EV_A);
|
||||
#endif
|
||||
#if EV_USE_SELECT
|
||||
if (method == EVMETHOD_SELECT) select_destroy (EV_A);
|
||||
if (method == EVBACKEND_SELECT) select_destroy (EV_A);
|
||||
#endif
|
||||
|
||||
for (i = NUMPRI; i--; )
|
||||
|
@ -888,13 +906,13 @@ static void
|
|||
loop_fork (EV_P)
|
||||
{
|
||||
#if EV_USE_PORT
|
||||
if (method == EVMETHOD_PORT ) port_fork (EV_A);
|
||||
if (method == EVBACKEND_PORT ) port_fork (EV_A);
|
||||
#endif
|
||||
#if EV_USE_KQUEUE
|
||||
if (method == EVMETHOD_KQUEUE) kqueue_fork (EV_A);
|
||||
if (method == EVBACKEND_KQUEUE) kqueue_fork (EV_A);
|
||||
#endif
|
||||
#if EV_USE_EPOLL
|
||||
if (method == EVMETHOD_EPOLL ) epoll_fork (EV_A);
|
||||
if (method == EVBACKEND_EPOLL ) epoll_fork (EV_A);
|
||||
#endif
|
||||
|
||||
if (ev_is_active (&sigev))
|
||||
|
|
50
ev.h
50
ev.h
|
@ -71,18 +71,18 @@ struct ev_loop;
|
|||
#endif
|
||||
|
||||
/* eventmask, revents, events... */
|
||||
#define EV_UNDEF -1 /* guaranteed to be invalid */
|
||||
#define EV_NONE 0x00
|
||||
#define EV_READ 0x01 /* io only */
|
||||
#define EV_WRITE 0x02 /* io only */
|
||||
#define EV_TIMEOUT 0x000100 /* timer only */
|
||||
#define EV_PERIODIC 0x000200 /* periodic timer only */
|
||||
#define EV_SIGNAL 0x000400 /* signal only */
|
||||
#define EV_IDLE 0x000800 /* idle only */
|
||||
#define EV_CHECK 0x001000 /* check only */
|
||||
#define EV_PREPARE 0x002000 /* prepare only */
|
||||
#define EV_CHILD 0x004000 /* child/pid only */
|
||||
#define EV_ERROR 0x800000 /* sent when an error occurs */
|
||||
#define EV_UNDEF -1L /* guaranteed to be invalid */
|
||||
#define EV_NONE 0x00L
|
||||
#define EV_READ 0x01L /* io only */
|
||||
#define EV_WRITE 0x02L /* io only */
|
||||
#define EV_TIMEOUT 0x000100L /* timer only */
|
||||
#define EV_PERIODIC 0x000200L /* periodic timer only */
|
||||
#define EV_SIGNAL 0x000400L /* signal only */
|
||||
#define EV_IDLE 0x000800L /* idle only */
|
||||
#define EV_CHECK 0x001000L /* check only */
|
||||
#define EV_PREPARE 0x002000L /* prepare only */
|
||||
#define EV_CHILD 0x004000L /* child/pid only */
|
||||
#define EV_ERROR 0x800000L /* sent when an error occurs */
|
||||
|
||||
/* can be used to add custom fields to all watchers, while losing binary compatibility */
|
||||
#ifndef EV_COMMON
|
||||
|
@ -233,24 +233,24 @@ union ev_any_watcher
|
|||
|
||||
/* bits for ev_default_loop and ev_loop_new */
|
||||
/* the default */
|
||||
#define EVFLAG_AUTO 0x00000000 /* not quite a mask */
|
||||
|
||||
/* method bits to be ored together */
|
||||
#define EVMETHOD_SELECT 0x00000001 /* about anywhere */
|
||||
#define EVMETHOD_POLL 0x00000002 /* !win */
|
||||
#define EVMETHOD_EPOLL 0x00000004 /* linux */
|
||||
#define EVMETHOD_KQUEUE 0x00000008 /* bsd */
|
||||
#define EVMETHOD_DEVPOLL 0x00000010 /* solaris 8 */ /* NYI */
|
||||
#define EVMETHOD_PORT 0x00000020 /* solaris 10 */
|
||||
#define EVMETHOD_ALL 0x0000ffff /* all methods, also future ones, or so */
|
||||
|
||||
#define EVFLAG_AUTO 0x00000000UL /* not quite a mask */
|
||||
/* flag bits */
|
||||
#define EVFLAG_NOENV 0x01000000 /* do NOT consult environment */
|
||||
#define EVFLAG_NOENV 0x01000000UL /* do NOT consult environment */
|
||||
/* method bits to be ored together */
|
||||
#define EVBACKEND_SELECT 0x00000001UL /* about anywhere */
|
||||
#define EVBACKEND_POLL 0x00000002UL /* !win */
|
||||
#define EVBACKEND_EPOLL 0x00000004UL /* linux */
|
||||
#define EVBACKEND_KQUEUE 0x00000008UL /* bsd */
|
||||
#define EVBACKEND_DEVPOLL 0x00000010UL /* solaris 8 */ /* NYI */
|
||||
#define EVBACKEND_PORT 0x00000020UL /* solaris 10 */
|
||||
|
||||
#if EV_PROTOTYPES
|
||||
int ev_version_major (void);
|
||||
int ev_version_minor (void);
|
||||
|
||||
unsigned int ev_supported_backends (void);
|
||||
unsigned int ev_recommended_backends (void);
|
||||
|
||||
ev_tstamp ev_time (void);
|
||||
|
||||
/* Sets the allocation function to use, works like realloc.
|
||||
|
@ -309,7 +309,7 @@ void ev_default_destroy (void); /* destroy the default loop */
|
|||
/* you can actually call it at any time, anywhere :) */
|
||||
void ev_default_fork (void);
|
||||
|
||||
unsigned int ev_method (EV_P);
|
||||
unsigned int ev_backend (EV_P);
|
||||
#endif
|
||||
|
||||
#define EVLOOP_NONBLOCK 1 /* do not block/wait */
|
||||
|
|
50
ev.pod
50
ev.pod
|
@ -77,6 +77,22 @@ as this indicates an incompatible change. Minor versions are usually
|
|||
compatible to older versions, so a larger minor version alone is usually
|
||||
not a problem.
|
||||
|
||||
=item unsigned int ev_supported_backends ()
|
||||
|
||||
Return the set of all backends (i.e. their corresponding C<EV_BACKEND_*>
|
||||
value) compiled into this binary of libev (independent of their
|
||||
availability on the system you are running on). See C<ev_default_loop> for
|
||||
a description of the set values.
|
||||
|
||||
=item unsigned int ev_recommended_backends ()
|
||||
|
||||
Return the set of all backends compiled into this binary of libev and also
|
||||
recommended for this platform. This set is often smaller than the one
|
||||
returned by C<ev_supported_backends>, as for example kqueue is broken on
|
||||
most BSDs and will not be autodetected unless you explicitly request it
|
||||
(assuming you know what you are doing). This is the set of backends that
|
||||
C<EVFLAG_AUTO> will probe for.
|
||||
|
||||
=item ev_set_allocator (void *(*cb)(void *ptr, long size))
|
||||
|
||||
Sets the allocation function to use (the prototype is similar to the
|
||||
|
@ -121,13 +137,13 @@ done correctly, because it's hideous and inefficient).
|
|||
This will initialise the default event loop if it hasn't been initialised
|
||||
yet and return it. If the default loop could not be initialised, returns
|
||||
false. If it already was initialised it simply returns it (and ignores the
|
||||
flags).
|
||||
flags. If that is troubling you, check C<ev_backend ()> afterwards).
|
||||
|
||||
If you don't know what event loop to use, use the one returned from this
|
||||
function.
|
||||
|
||||
The flags argument can be used to specify special behaviour or specific
|
||||
backends to use, and is usually specified as 0 (or EVFLAG_AUTO).
|
||||
backends to use, and is usually specified as C<0> (or EVFLAG_AUTO).
|
||||
|
||||
It supports the following flags:
|
||||
|
||||
|
@ -147,7 +163,7 @@ override the flags completely if it is found in the environment. This is
|
|||
useful to try out specific backends to test their performance, or to work
|
||||
around bugs.
|
||||
|
||||
=item C<EVMETHOD_SELECT> (value 1, portable select backend)
|
||||
=item C<EVBACKEND_SELECT> (value 1, portable select backend)
|
||||
|
||||
This is your standard select(2) backend. Not I<completely> standard, as
|
||||
libev tries to roll its own fd_set with no limits on the number of fds,
|
||||
|
@ -155,14 +171,14 @@ but if that fails, expect a fairly low limit on the number of fds when
|
|||
using this backend. It doesn't scale too well (O(highest_fd)), but its usually
|
||||
the fastest backend for a low number of fds.
|
||||
|
||||
=item C<EVMETHOD_POLL> (value 2, poll backend, available everywhere except on windows)
|
||||
=item C<EVBACKEND_POLL> (value 2, poll backend, available everywhere except on windows)
|
||||
|
||||
And this is your standard poll(2) backend. It's more complicated than
|
||||
select, but handles sparse fds better and has no artificial limit on the
|
||||
number of fds you can use (except it will slow down considerably with a
|
||||
lot of inactive fds). It scales similarly to select, i.e. O(total_fds).
|
||||
|
||||
=item C<EVMETHOD_EPOLL> (value 4, Linux)
|
||||
=item C<EVBACKEND_EPOLL> (value 4, Linux)
|
||||
|
||||
For few fds, this backend is a bit little slower than poll and select,
|
||||
but it scales phenomenally better. While poll and select usually scale like
|
||||
|
@ -175,7 +191,7 @@ result in some caching, there is still a syscall per such incident
|
|||
best to avoid that. Also, dup()ed file descriptors might not work very
|
||||
well if you register events for both fds.
|
||||
|
||||
=item C<EVMETHOD_KQUEUE> (value 8, most BSD clones)
|
||||
=item C<EVBACKEND_KQUEUE> (value 8, most BSD clones)
|
||||
|
||||
Kqueue deserves special mention, as at the time of this writing, it
|
||||
was broken on all BSDs except NetBSD (usually it doesn't work with
|
||||
|
@ -189,20 +205,20 @@ course). While starting and stopping an I/O watcher does not cause an
|
|||
extra syscall as with epoll, it still adds up to four event changes per
|
||||
incident, so its best to avoid that.
|
||||
|
||||
=item C<EVMETHOD_DEVPOLL> (value 16, Solaris 8)
|
||||
=item C<EVBACKEND_DEVPOLL> (value 16, Solaris 8)
|
||||
|
||||
This is not implemented yet (and might never be).
|
||||
|
||||
=item C<EVMETHOD_PORT> (value 32, Solaris 10)
|
||||
=item C<EVBACKEND_PORT> (value 32, Solaris 10)
|
||||
|
||||
This uses the Solaris 10 port mechanism. As with everything on Solaris,
|
||||
it's really slow, but it still scales very well (O(active_fds)).
|
||||
|
||||
=item C<EVMETHOD_ALL>
|
||||
=item C<EVBACKEND_ALL>
|
||||
|
||||
Try all backends (even potentially broken ones that wouldn't be tried
|
||||
with C<EVFLAG_AUTO>). Since this is a mask, you can do stuff such as
|
||||
C<EVMETHOD_ALL & ~EVMETHOD_KQUEUE>.
|
||||
C<EVBACKEND_ALL & ~EVBACKEND_KQUEUE>.
|
||||
|
||||
=back
|
||||
|
||||
|
@ -246,15 +262,19 @@ quite nicely into a call to C<pthread_atfork>:
|
|||
|
||||
pthread_atfork (0, 0, ev_default_fork);
|
||||
|
||||
At the moment, C<EVBACKEND_SELECT> and C<EVBACKEND_POLL> are safe to use
|
||||
without calling this function, so if you force one of those backends you
|
||||
do not need to care.
|
||||
|
||||
=item ev_loop_fork (loop)
|
||||
|
||||
Like C<ev_default_fork>, but acts on an event loop created by
|
||||
C<ev_loop_new>. Yes, you have to call this on every allocated event loop
|
||||
after fork, and how you do this is entirely your own problem.
|
||||
|
||||
=item unsigned int ev_method (loop)
|
||||
=item unsigned int ev_backend (loop)
|
||||
|
||||
Returns one of the C<EVMETHOD_*> flags indicating the event backend in
|
||||
Returns one of the C<EVBACKEND_*> flags indicating the event backend in
|
||||
use.
|
||||
|
||||
=item ev_tstamp ev_now (loop)
|
||||
|
@ -370,7 +390,7 @@ corresponding stop function (C<< ev_<type>_stop (loop, watcher *) >>.
|
|||
|
||||
As long as your watcher is active (has been started but not stopped) you
|
||||
must not touch the values stored in it. Most specifically you must never
|
||||
reinitialise it or call its set method.
|
||||
reinitialise it or call its set macro.
|
||||
|
||||
You can check whether an event is active by calling the C<ev_is_active
|
||||
(watcher *)> macro. To see whether an event is outstanding (but the
|
||||
|
@ -497,8 +517,8 @@ to the same underlying file/socket etc. description (that is, they share
|
|||
the same underlying "file open").
|
||||
|
||||
If you must do this, then force the use of a known-to-be-good backend
|
||||
(at the time of this writing, this includes only EVMETHOD_SELECT and
|
||||
EVMETHOD_POLL).
|
||||
(at the time of this writing, this includes only C<EVBACKEND_SELECT> and
|
||||
C<EVBACKEND_POLL>).
|
||||
|
||||
=over 4
|
||||
|
||||
|
|
|
@ -96,7 +96,7 @@ epoll_init (EV_P_ int flags)
|
|||
epoll_eventmax = 64; /* intiial number of events receivable per poll */
|
||||
epoll_events = (struct epoll_event *)ev_malloc (sizeof (struct epoll_event) * epoll_eventmax);
|
||||
|
||||
return EVMETHOD_EPOLL;
|
||||
return EVBACKEND_EPOLL;
|
||||
}
|
||||
|
||||
static void
|
||||
|
|
|
@ -193,7 +193,7 @@ kqueue_init (EV_P_ int flags)
|
|||
kqueue_changemax = 0;
|
||||
kqueue_changecnt = 0;
|
||||
|
||||
return EVMETHOD_KQUEUE;
|
||||
return EVBACKEND_KQUEUE;
|
||||
}
|
||||
|
||||
static void
|
||||
|
|
|
@ -115,7 +115,7 @@ poll_init (EV_P_ int flags)
|
|||
pollidxs = 0; pollidxmax = 0;
|
||||
polls = 0; pollmax = 0; pollcnt = 0;
|
||||
|
||||
return EVMETHOD_POLL;
|
||||
return EVBACKEND_POLL;
|
||||
}
|
||||
|
||||
static void
|
||||
|
|
|
@ -118,7 +118,7 @@ port_init (EV_P_ int flags)
|
|||
port_eventmax = 64; /* intiial number of events receivable per poll */
|
||||
port_events = (port_event_t *)ev_malloc (sizeof (port_event_t) * port_eventmax);
|
||||
|
||||
return EVMETHOD_PORT;
|
||||
return EVBACKEND_PORT;
|
||||
}
|
||||
|
||||
static void
|
||||
|
|
|
@ -221,7 +221,7 @@ select_init (EV_P_ int flags)
|
|||
vec_wo = 0;
|
||||
#endif
|
||||
|
||||
return EVMETHOD_SELECT;
|
||||
return EVBACKEND_SELECT;
|
||||
}
|
||||
|
||||
static void
|
||||
|
|
Loading…
Reference in New Issue