|
|
|
@ -129,7 +129,7 @@ |
|
|
|
|
.\" ======================================================================== |
|
|
|
|
.\" |
|
|
|
|
.IX Title "EV 1" |
|
|
|
|
.TH EV 1 "2007-12-19" "perl v5.8.8" "User Contributed Perl Documentation" |
|
|
|
|
.TH EV 1 "2007-12-21" "perl v5.8.8" "User Contributed Perl Documentation" |
|
|
|
|
.SH "NAME" |
|
|
|
|
libev \- a high performance full\-featured event loop written in C |
|
|
|
|
.SH "SYNOPSIS" |
|
|
|
@ -203,7 +203,7 @@ web page you might find easier to navigate when reading it for the first |
|
|
|
|
time: <http://cvs.schmorp.de/libev/ev.html>. |
|
|
|
|
.PP |
|
|
|
|
Libev is an event loop: you register interest in certain events (such as a |
|
|
|
|
file descriptor being readable or a timeout occuring), and it will manage |
|
|
|
|
file descriptor being readable or a timeout occurring), and it will manage |
|
|
|
|
these event sources and provide your program with events. |
|
|
|
|
.PP |
|
|
|
|
To do this, it must take more or less complete control over your process |
|
|
|
@ -461,15 +461,18 @@ lot of inactive fds). It scales similarly to select, i.e. O(total_fds). |
|
|
|
|
.el .IP "\f(CWEVBACKEND_EPOLL\fR (value 4, Linux)" 4 |
|
|
|
|
.IX Item "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 |
|
|
|
|
O(total_fds) where n is the total number of fds (or the highest fd), epoll scales |
|
|
|
|
either O(1) or O(active_fds). |
|
|
|
|
.Sp |
|
|
|
|
While stopping and starting an I/O watcher in the same iteration will |
|
|
|
|
result in some caching, there is still a syscall per such incident |
|
|
|
|
but it scales phenomenally better. While poll and select usually scale |
|
|
|
|
like O(total_fds) where n is the total number of fds (or the highest fd), |
|
|
|
|
epoll scales either O(1) or O(active_fds). The epoll design has a number |
|
|
|
|
of shortcomings, such as silently dropping events in some hard-to-detect |
|
|
|
|
cases and rewuiring a syscall per fd change, no fork support and bad |
|
|
|
|
support for dup: |
|
|
|
|
.Sp |
|
|
|
|
While stopping, setting and starting an I/O watcher in the same iteration |
|
|
|
|
will result in some caching, there is still a syscall per such incident |
|
|
|
|
(because the fd could point to a different file description now), so its |
|
|
|
|
best to avoid that. Also, \fIdup()\fRed file descriptors might not work very |
|
|
|
|
well if you register events for both fds. |
|
|
|
|
best to avoid that. Also, \f(CW\*(C`dup ()\*(C'\fR'ed file descriptors might not work |
|
|
|
|
very well if you register events for both fds. |
|
|
|
|
.Sp |
|
|
|
|
Please note that epoll sometimes generates spurious notifications, so you |
|
|
|
|
need to use non-blocking I/O or other means to avoid blocking when no data |
|
|
|
@ -478,17 +481,20 @@ need to use non-blocking I/O or other means to avoid blocking when no data |
|
|
|
|
.el .IP "\f(CWEVBACKEND_KQUEUE\fR (value 8, most \s-1BSD\s0 clones)" 4 |
|
|
|
|
.IX Item "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 |
|
|
|
|
anything but sockets and pipes, except on Darwin, where of course its |
|
|
|
|
completely useless). For this reason its not being \*(L"autodetected\*(R" |
|
|
|
|
was broken on \fIall\fR BSDs (usually it doesn't work with anything but |
|
|
|
|
sockets and pipes, except on Darwin, where of course it's completely |
|
|
|
|
useless. On NetBSD, it seems to work for all the \s-1FD\s0 types I tested, so it |
|
|
|
|
is used by default there). For this reason it's not being \*(L"autodetected\*(R" |
|
|
|
|
unless you explicitly specify it explicitly in the flags (i.e. using |
|
|
|
|
\&\f(CW\*(C`EVBACKEND_KQUEUE\*(C'\fR). |
|
|
|
|
\&\f(CW\*(C`EVBACKEND_KQUEUE\*(C'\fR) or libev was compiled on a known-to-be-good (\-enough) |
|
|
|
|
system like NetBSD. |
|
|
|
|
.Sp |
|
|
|
|
It scales in the same way as the epoll backend, but the interface to the |
|
|
|
|
kernel is more efficient (which says nothing about its actual speed, of |
|
|
|
|
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. |
|
|
|
|
kernel is more efficient (which says nothing about its actual speed, |
|
|
|
|
of course). While stopping, setting and starting an I/O watcher does |
|
|
|
|
never cause an extra syscall as with epoll, it still adds up to two event |
|
|
|
|
changes per incident, support for \f(CW\*(C`fork ()\*(C'\fR is very bad and it drops fds |
|
|
|
|
silently in similarly hard-to-detetc cases. |
|
|
|
|
.ie n .IP """EVBACKEND_DEVPOLL"" (value 16, Solaris 8)" 4 |
|
|
|
|
.el .IP "\f(CWEVBACKEND_DEVPOLL\fR (value 16, Solaris 8)" 4 |
|
|
|
|
.IX Item "EVBACKEND_DEVPOLL (value 16, Solaris 8)" |
|
|
|
@ -496,10 +502,10 @@ This is not implemented yet (and might never be). |
|
|
|
|
.ie n .IP """EVBACKEND_PORT"" (value 32, Solaris 10)" 4 |
|
|
|
|
.el .IP "\f(CWEVBACKEND_PORT\fR (value 32, Solaris 10)" 4 |
|
|
|
|
.IX Item "EVBACKEND_PORT (value 32, Solaris 10)" |
|
|
|
|
This uses the Solaris 10 port mechanism. As with everything on Solaris, |
|
|
|
|
This uses the Solaris 10 event port mechanism. As with everything on Solaris, |
|
|
|
|
it's really slow, but it still scales very well (O(active_fds)). |
|
|
|
|
.Sp |
|
|
|
|
Please note that solaris ports can result in a lot of spurious |
|
|
|
|
Please note that solaris event ports can deliver a lot of spurious |
|
|
|
|
notifications, so you need to use non-blocking I/O or other means to avoid |
|
|
|
|
blocking when no data (or space) is available. |
|
|
|
|
.ie n .IP """EVBACKEND_ALL""" 4 |
|
|
|
@ -562,7 +568,7 @@ calling this function, or cope with the fact afterwards (which is usually |
|
|
|
|
the easiest thing, you can just ignore the watchers and/or \f(CW\*(C`free ()\*(C'\fR them |
|
|
|
|
for example). |
|
|
|
|
.Sp |
|
|
|
|
Not that certain global state, such as signal state, will not be freed by |
|
|
|
|
Note that certain global state, such as signal state, will not be freed by |
|
|
|
|
this function, and related watchers (such as signal and child watchers) |
|
|
|
|
would need to be stopped manually. |
|
|
|
|
.Sp |
|
|
|
@ -620,7 +626,7 @@ Returns the current \*(L"event loop time\*(R", which is the time the event loop |
|
|
|
|
received events and started processing them. This timestamp does not |
|
|
|
|
change as long as callbacks are being processed, and this is also the base |
|
|
|
|
time used for relative timers. You can treat it as the timestamp of the |
|
|
|
|
event occuring (or more correctly, libev finding out about it). |
|
|
|
|
event occurring (or more correctly, libev finding out about it). |
|
|
|
|
.IP "ev_loop (loop, int flags)" 4 |
|
|
|
|
.IX Item "ev_loop (loop, int flags)" |
|
|
|
|
Finally, this is it, the event handler. This function usually is called |
|
|
|
@ -1082,7 +1088,7 @@ its own, so its quite safe to use). |
|
|
|
|
\fIThe special problem of disappearing file descriptors\fR |
|
|
|
|
.IX Subsection "The special problem of disappearing file descriptors" |
|
|
|
|
.PP |
|
|
|
|
Some backends (e.g kqueue, epoll) need to be told about closing a file |
|
|
|
|
Some backends (e.g. kqueue, epoll) need to be told about closing a file |
|
|
|
|
descriptor (either by calling \f(CW\*(C`close\*(C'\fR explicitly or by any other means, |
|
|
|
|
such as \f(CW\*(C`dup\*(C'\fR). The reason is that you register interest in some file |
|
|
|
|
descriptor, but when it goes away, the operating system will silently drop |
|
|
|
@ -1101,6 +1107,30 @@ This is how one would do it normally anyway, the important point is that |
|
|
|
|
the libev application should not optimise around libev but should leave |
|
|
|
|
optimisations to libev. |
|
|
|
|
.PP |
|
|
|
|
\fIThs special problem of dup'ed file descriptors\fR |
|
|
|
|
.IX Subsection "Ths special problem of dup'ed file descriptors" |
|
|
|
|
.PP |
|
|
|
|
Some backends (e.g. epoll), cannot register events for file descriptors, |
|
|
|
|
but only events for the underlying file descriptions. That menas when you |
|
|
|
|
have \f(CW\*(C`dup ()\*(C'\fR'ed file descriptors and register events for them, only one |
|
|
|
|
file descriptor might actually receive events. |
|
|
|
|
.PP |
|
|
|
|
There is no workaorund possible except not registering events |
|
|
|
|
for potentially \f(CW\*(C`dup ()\*(C'\fR'ed file descriptors or to resort to |
|
|
|
|
\&\f(CW\*(C`EVBACKEND_SELECT\*(C'\fR or \f(CW\*(C`EVBACKEND_POLL\*(C'\fR. |
|
|
|
|
.PP |
|
|
|
|
\fIThe special problem of fork\fR |
|
|
|
|
.IX Subsection "The special problem of fork" |
|
|
|
|
.PP |
|
|
|
|
Some backends (epoll, kqueue) do not support \f(CW\*(C`fork ()\*(C'\fR at all or exhibit |
|
|
|
|
useless behaviour. Libev fully supports fork, but needs to be told about |
|
|
|
|
it in the child. |
|
|
|
|
.PP |
|
|
|
|
To support fork in your programs, you either have to call |
|
|
|
|
\&\f(CW\*(C`ev_default_fork ()\*(C'\fR or \f(CW\*(C`ev_loop_fork ()\*(C'\fR after a fork in the child, |
|
|
|
|
enable \f(CW\*(C`EVFLAG_FORKCHECK\*(C'\fR, or resort to \f(CW\*(C`EVBACKEND_SELECT\*(C'\fR or |
|
|
|
|
\&\f(CW\*(C`EVBACKEND_POLL\*(C'\fR. |
|
|
|
|
.PP |
|
|
|
|
\fIWatcher-Specific Functions\fR |
|
|
|
|
.IX Subsection "Watcher-Specific Functions" |
|
|
|
|
.IP "ev_io_init (ev_io *, callback, int fd, int events)" 4 |
|
|
|
@ -1908,7 +1938,7 @@ this. |
|
|
|
|
This is a rather advanced watcher type that lets you embed one event loop |
|
|
|
|
into another (currently only \f(CW\*(C`ev_io\*(C'\fR events are supported in the embedded |
|
|
|
|
loop, other types of watchers might be handled in a delayed or incorrect |
|
|
|
|
fashion and must not be used). |
|
|
|
|
fashion and must not be used). (See portability notes, below). |
|
|
|
|
.PP |
|
|
|
|
There are primarily two reasons you would want that: work around bugs and |
|
|
|
|
prioritise I/O. |
|
|
|
@ -1978,6 +2008,21 @@ create it, and if that fails, use the normal loop for everything: |
|
|
|
|
\& else |
|
|
|
|
\& loop_lo = loop_hi; |
|
|
|
|
.Ve |
|
|
|
|
.Sh "Portability notes" |
|
|
|
|
.IX Subsection "Portability notes" |
|
|
|
|
Kqueue is nominally embeddable, but this is broken on all BSDs that I |
|
|
|
|
tried, in various ways. Usually the embedded event loop will simply never |
|
|
|
|
receive events, sometimes it will only trigger a few times, sometimes in a |
|
|
|
|
loop. Epoll is also nominally embeddable, but many Linux kernel versions |
|
|
|
|
will always eport the epoll fd as ready, even when no events are pending. |
|
|
|
|
.PP |
|
|
|
|
While libev allows embedding these backends (they are contained in |
|
|
|
|
\&\f(CW\*(C`ev_embeddable_backends ()\*(C'\fR), take extreme care that it will actually |
|
|
|
|
work. |
|
|
|
|
.PP |
|
|
|
|
When in doubt, create a dynamic event loop forced to use sockets (this |
|
|
|
|
usually works) and possibly another thread and a pipe or so to report to |
|
|
|
|
your main event loop. |
|
|
|
|
.PP |
|
|
|
|
\fIWatcher-Specific Functions and Data Members\fR |
|
|
|
|
.IX Subsection "Watcher-Specific Functions and Data Members" |
|
|
|
@ -1997,8 +2042,8 @@ if you do not want thta, you need to temporarily stop the embed watcher). |
|
|
|
|
Make a single, non-blocking sweep over the embedded loop. This works |
|
|
|
|
similarly to \f(CW\*(C`ev_loop (embedded_loop, EVLOOP_NONBLOCK)\*(C'\fR, but in the most |
|
|
|
|
apropriate way for embedded loops. |
|
|
|
|
.IP "struct ev_loop *loop [read\-only]" 4 |
|
|
|
|
.IX Item "struct ev_loop *loop [read-only]" |
|
|
|
|
.IP "struct ev_loop *other [read\-only]" 4 |
|
|
|
|
.IX Item "struct ev_loop *other [read-only]" |
|
|
|
|
The embedded event loop. |
|
|
|
|
.ie n .Sh """ev_fork"" \- the audacity to resume the event loop after a fork" |
|
|
|
|
.el .Sh "\f(CWev_fork\fP \- the audacity to resume the event loop after a fork" |
|
|
|
@ -2332,7 +2377,7 @@ applications. Examples of applications that embed it include the Deliantra |
|
|
|
|
Game Server, the \s-1EV\s0 perl module, the \s-1GNU\s0 Virtual Private Ethernet (gvpe) |
|
|
|
|
and rxvt\-unicode. |
|
|
|
|
.PP |
|
|
|
|
The goal is to enable you to just copy the neecssary files into your |
|
|
|
|
The goal is to enable you to just copy the necessary files into your |
|
|
|
|
source directory without having to change even a single line in them, so |
|
|
|
|
you can easily upgrade by simply copying (or having a checked-out copy of |
|
|
|
|
libev somewhere in your source tree). |
|
|
|
@ -2447,7 +2492,7 @@ If defined to be \f(CW1\fR, libev will try to detect the availability of the |
|
|
|
|
monotonic clock option at both compiletime and runtime. Otherwise no use |
|
|
|
|
of the monotonic clock option will be attempted. If you enable this, you |
|
|
|
|
usually have to link against librt or something similar. Enabling it when |
|
|
|
|
the functionality isn't available is safe, though, althoguh you have |
|
|
|
|
the functionality isn't available is safe, though, although you have |
|
|
|
|
to make sure you link against any libraries where the \f(CW\*(C`clock_gettime\*(C'\fR |
|
|
|
|
function is hiding in (often \fI\-lrt\fR). |
|
|
|
|
.IP "\s-1EV_USE_REALTIME\s0" 4 |
|
|
|
@ -2456,8 +2501,8 @@ If defined to be \f(CW1\fR, libev will try to detect the availability of the |
|
|
|
|
realtime clock option at compiletime (and assume its availability at |
|
|
|
|
runtime if successful). Otherwise no use of the realtime clock option will |
|
|
|
|
be attempted. This effectively replaces \f(CW\*(C`gettimeofday\*(C'\fR by \f(CW\*(C`clock_get |
|
|
|
|
(CLOCK_REALTIME, ...)\*(C'\fR and will not normally affect correctness. See tzhe note about libraries |
|
|
|
|
in the description of \f(CW\*(C`EV_USE_MONOTONIC\*(C'\fR, though. |
|
|
|
|
(CLOCK_REALTIME, ...)\*(C'\fR and will not normally affect correctness. See the |
|
|
|
|
note about libraries in the description of \f(CW\*(C`EV_USE_MONOTONIC\*(C'\fR, though. |
|
|
|
|
.IP "\s-1EV_USE_SELECT\s0" 4 |
|
|
|
|
.IX Item "EV_USE_SELECT" |
|
|
|
|
If undefined or defined to be \f(CW1\fR, libev will compile in support for the |
|
|
|
@ -2627,7 +2672,7 @@ For example, the perl \s-1EV\s0 module uses something like this: |
|
|
|
|
.PD |
|
|
|
|
Can be used to change the callback member declaration in each watcher, |
|
|
|
|
and the way callbacks are invoked and set. Must expand to a struct member |
|
|
|
|
definition and a statement, respectively. See the \fIev.v\fR header file for |
|
|
|
|
definition and a statement, respectively. See the \fIev.h\fR header file for |
|
|
|
|
their default definitions. One possible use for overriding these is to |
|
|
|
|
avoid the \f(CW\*(C`struct ev_loop *\*(C'\fR as first argument in all cases, or to use |
|
|
|
|
method calls instead of plain function calls in \*(C+. |
|
|
|
@ -2646,7 +2691,7 @@ This can also be used to rename all public symbols to avoid clashes with |
|
|
|
|
multiple versions of libev linked together (which is obviously bad in |
|
|
|
|
itself, but sometimes it is inconvinient to avoid this). |
|
|
|
|
.Sp |
|
|
|
|
A sed comamnd like this will create wrapper \f(CW\*(C`#define\*(C'\fR's that you need to |
|
|
|
|
A sed command like this will create wrapper \f(CW\*(C`#define\*(C'\fR's that you need to |
|
|
|
|
include before including \fIev.h\fR: |
|
|
|
|
.Sp |
|
|
|
|
.Vb 1 |
|
|
|
|