.\" ========================================================================
.\"
.IX Title ""<STANDARD INPUT>" 1"
-.TH "<STANDARD INPUT>" 1 "2007-11-27" "perl v5.8.8" "User Contributed Perl Documentation"
+.TH "<STANDARD INPUT>" 1 "2007-11-29" "perl v5.8.8" "User Contributed Perl Documentation"
.SH "NAME"
libev \- a high performance full\-featured event loop written in C
.SH "SYNOPSIS"
.Vb 1
\& #include <ev.h>
.Ve
+.SH "EXAMPLE PROGRAM"
+.IX Header "EXAMPLE PROGRAM"
+.Vb 1
+\& #include <ev.h>
+.Ve
+.PP
+.Vb 2
+\& ev_io stdin_watcher;
+\& ev_timer timeout_watcher;
+.Ve
+.PP
+.Vb 8
+\& /* called when data readable on stdin */
+\& static void
+\& stdin_cb (EV_P_ struct ev_io *w, int revents)
+\& {
+\& /* puts ("stdin ready"); */
+\& ev_io_stop (EV_A_ w); /* just a syntax example */
+\& ev_unloop (EV_A_ EVUNLOOP_ALL); /* leave all loop calls */
+\& }
+.Ve
+.PP
+.Vb 6
+\& static void
+\& timeout_cb (EV_P_ struct ev_timer *w, int revents)
+\& {
+\& /* puts ("timeout"); */
+\& ev_unloop (EV_A_ EVUNLOOP_ONE); /* leave one loop call */
+\& }
+.Ve
+.PP
+.Vb 4
+\& int
+\& main (void)
+\& {
+\& struct ev_loop *loop = ev_default_loop (0);
+.Ve
+.PP
+.Vb 3
+\& /* initialise an io watcher, then start it */
+\& ev_io_init (&stdin_watcher, stdin_cb, /*STDIN_FILENO*/ 0, EV_READ);
+\& ev_io_start (loop, &stdin_watcher);
+.Ve
+.PP
+.Vb 3
+\& /* simple non-repeating 5.5 second timeout */
+\& ev_timer_init (&timeout_watcher, timeout_cb, 5.5, 0.);
+\& ev_timer_start (loop, &timeout_watcher);
+.Ve
+.PP
+.Vb 2
+\& /* loop till timeout or data ready */
+\& ev_loop (loop, 0);
+.Ve
+.PP
+.Vb 2
+\& return 0;
+\& }
+.Ve
.SH "DESCRIPTION"
.IX Header "DESCRIPTION"
Libev is an event loop: you register interest in certain events (such as a
watcher.
.SH "FEATURES"
.IX Header "FEATURES"
-Libev supports select, poll, the linux-specific epoll and the bsd-specific
-kqueue mechanisms for file descriptor events, relative timers, absolute
-timers with customised rescheduling, signal events, process status change
-events (related to \s-1SIGCHLD\s0), and event watchers dealing with the event
-loop mechanism itself (idle, prepare and check watchers). It also is quite
-fast (see this benchmark comparing
-it to libevent for example).
+Libev supports \f(CW\*(C`select\*(C'\fR, \f(CW\*(C`poll\*(C'\fR, the Linux-specific \f(CW\*(C`epoll\*(C'\fR, the
+BSD-specific \f(CW\*(C`kqueue\*(C'\fR and the Solaris-specific event port mechanisms
+for file descriptor events (\f(CW\*(C`ev_io\*(C'\fR), the Linux \f(CW\*(C`inotify\*(C'\fR interface
+(for \f(CW\*(C`ev_stat\*(C'\fR), relative timers (\f(CW\*(C`ev_timer\*(C'\fR), absolute timers
+with customised rescheduling (\f(CW\*(C`ev_periodic\*(C'\fR), synchronous signals
+(\f(CW\*(C`ev_signal\*(C'\fR), process status change events (\f(CW\*(C`ev_child\*(C'\fR), and event
+watchers dealing with the event loop mechanism itself (\f(CW\*(C`ev_idle\*(C'\fR,
+\&\f(CW\*(C`ev_embed\*(C'\fR, \f(CW\*(C`ev_prepare\*(C'\fR and \f(CW\*(C`ev_check\*(C'\fR watchers) as well as
+file watchers (\f(CW\*(C`ev_stat\*(C'\fR) and even limited support for fork events
+(\f(CW\*(C`ev_fork\*(C'\fR).
+.PP
+It also is quite fast (see this
+benchmark comparing it to libevent
+for example).
.SH "CONVENTIONS"
.IX Header "CONVENTIONS"
-Libev is very configurable. In this manual the default configuration
-will be described, which supports multiple event loops. For more info
-about various configuration options please have a look at the file
-\&\fI\s-1README\s0.embed\fR in the libev distribution. If libev was configured without
-support for multiple event loops, then all functions taking an initial
-argument of name \f(CW\*(C`loop\*(C'\fR (which is always of type \f(CW\*(C`struct ev_loop *\*(C'\fR)
-will not have this argument.
+Libev is very configurable. In this manual the default configuration will
+be described, which supports multiple event loops. For more info about
+various configuration options please have a look at \fB\s-1EMBED\s0\fR section in
+this manual. If libev was configured without support for multiple event
+loops, then all functions taking an initial argument of name \f(CW\*(C`loop\*(C'\fR
+(which is always of type \f(CW\*(C`struct ev_loop *\*(C'\fR) will not have this argument.
.SH "TIME REPRESENTATION"
.IX Header "TIME REPRESENTATION"
Libev represents time as a single floating point number, representing the
compatible to older versions, so a larger minor version alone is usually
not a problem.
.Sp
-Example: make sure we haven't accidentally been linked against the wrong
-version:
+Example: Make sure we haven't accidentally been linked against the wrong
+version.
.Sp
.Vb 3
\& assert (("libev version mismatch",
See the description of \f(CW\*(C`ev_embed\*(C'\fR watchers for more info.
.IP "ev_set_allocator (void *(*cb)(void *ptr, long size))" 4
.IX Item "ev_set_allocator (void *(*cb)(void *ptr, long size))"
-Sets the allocation function to use (the prototype is similar to the
-realloc C function, the semantics are identical). It is used to allocate
-and free memory (no surprises here). If it returns zero when memory
-needs to be allocated, the library might abort or take some potentially
-destructive action. The default is your system realloc function.
+Sets the allocation function to use (the prototype is similar \- the
+semantics is identical \- to the realloc C function). It is used to
+allocate and free memory (no surprises here). If it returns zero when
+memory needs to be allocated, the library might abort or take some
+potentially destructive action. The default is your system realloc
+function.
.Sp
You could override this function in high-availability programs to, say,
free some memory if it cannot allocate memory, to use a special allocator,
or even to sleep a while and retry until some memory is available.
.Sp
-Example: replace the libev allocator with one that waits a bit and then
-retries: better than mine).
+Example: Replace the libev allocator with one that waits a bit and then
+retries).
.Sp
.Vb 6
\& static void *
-\& persistent_realloc (void *ptr, long size)
+\& persistent_realloc (void *ptr, size_t size)
\& {
\& for (;;)
\& {
requested operation, or, if the condition doesn't go away, do bad stuff
(such as abort).
.Sp
-Example: do the same thing as libev does internally:
+Example: This is basically the same thing that libev does internally, too.
.Sp
.Vb 6
\& static void
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.
+.ie n .IP """EVFLAG_FORKCHECK""" 4
+.el .IP "\f(CWEVFLAG_FORKCHECK\fR" 4
+.IX Item "EVFLAG_FORKCHECK"
+Instead of calling \f(CW\*(C`ev_default_fork\*(C'\fR or \f(CW\*(C`ev_loop_fork\*(C'\fR manually after
+a fork, you can also make libev check for a fork in each iteration by
+enabling this flag.
+.Sp
+This works by calling \f(CW\*(C`getpid ()\*(C'\fR on every iteration of the loop,
+and thus this might slow down your event loop if you do a lot of loop
+iterations and little real work, but is usually not noticable (on my
+Linux system for example, \f(CW\*(C`getpid\*(C'\fR is actually a simple 5\-insn sequence
+without a syscall and thus \fIvery\fR fast, but my Linux system also has
+\&\f(CW\*(C`pthread_atfork\*(C'\fR which is even faster).
+.Sp
+The big advantage of this flag is that you can forget about fork (and
+forget about forgetting to tell libev about forking) when you use this
+flag.
+.Sp
+This flag setting cannot be overriden or specified in the \f(CW\*(C`LIBEV_FLAGS\*(C'\fR
+environment variable.
.ie n .IP """EVBACKEND_SELECT"" (value 1, portable select backend)" 4
.el .IP "\f(CWEVBACKEND_SELECT\fR (value 1, portable select backend)" 4
.IX Item "EVBACKEND_SELECT (value 1, portable select backend)"
handle signal and child watchers, and attempts to do so will be greeted by
undefined behaviour (or a failed assertion if assertions are enabled).
.Sp
-Example: try to create a event loop that uses epoll and nothing else.
+Example: Try to create a event loop that uses epoll and nothing else.
.Sp
.Vb 3
\& struct ev_loop *epoller = ev_loop_new (EVBACKEND_EPOLL | EVFLAG_NOENV);
\& were used, return, otherwise continue with step *.
.Ve
.Sp
-Example: queue some jobs and then loop until no events are outsanding
+Example: Queue some jobs and then loop until no events are outsanding
anymore.
.Sp
.Vb 4
way to do this for generic recurring timers or from within third-party
libraries. Just remember to \fIunref after start\fR and \fIref before stop\fR.
.Sp
-Example: create a signal watcher, but keep it from keeping \f(CW\*(C`ev_loop\*(C'\fR
+Example: Create a signal watcher, but keep it from keeping \f(CW\*(C`ev_loop\*(C'\fR
running when nothing else is active.
.Sp
.Vb 4
-\& struct dv_signal exitsig;
+\& struct ev_signal exitsig;
\& ev_signal_init (&exitsig, sig_cb, SIGINT);
-\& ev_signal_start (myloop, &exitsig);
-\& evf_unref (myloop);
+\& ev_signal_start (loop, &exitsig);
+\& evf_unref (loop);
.Ve
.Sp
-Example: for some weird reason, unregister the above signal handler again.
+Example: For some weird reason, unregister the above signal handler again.
.Sp
.Vb 2
-\& ev_ref (myloop);
-\& ev_signal_stop (myloop, &exitsig);
+\& ev_ref (loop);
+\& ev_signal_stop (loop, &exitsig);
.Ve
.SH "ANATOMY OF A WATCHER"
.IX Header "ANATOMY OF A WATCHER"
is pending (but not active) you must not call an init function on it (but
\&\f(CW\*(C`ev_TYPE_set\*(C'\fR is safe) and you must make sure the watcher is available to
libev (e.g. you cnanot \f(CW\*(C`free ()\*(C'\fR it).
-.IP "callback = ev_cb (ev_TYPE *watcher)" 4
-.IX Item "callback = ev_cb (ev_TYPE *watcher)"
+.IP "callback ev_cb (ev_TYPE *watcher)" 4
+.IX Item "callback ev_cb (ev_TYPE *watcher)"
Returns the callback currently set on the watcher.
.IP "ev_cb_set (ev_TYPE *watcher, callback)" 4
.IX Item "ev_cb_set (ev_TYPE *watcher, callback)"
\& }
.Ve
.PP
-More interesting and less C\-conformant ways of catsing your callback type
-have been omitted....
+More interesting and less C\-conformant ways of casting your callback type
+instead have been omitted.
+.PP
+Another common scenario is having some data structure with multiple
+watchers:
+.PP
+.Vb 6
+\& struct my_biggy
+\& {
+\& int some_data;
+\& ev_timer t1;
+\& ev_timer t2;
+\& }
+.Ve
+.PP
+In this case getting the pointer to \f(CW\*(C`my_biggy\*(C'\fR is a bit more complicated,
+you need to use \f(CW\*(C`offsetof\*(C'\fR:
+.PP
+.Vb 1
+\& #include <stddef.h>
+.Ve
+.PP
+.Vb 6
+\& static void
+\& t1_cb (EV_P_ struct ev_timer *w, int revents)
+\& {
+\& struct my_biggy big = (struct my_biggy *
+\& (((char *)w) - offsetof (struct my_biggy, t1));
+\& }
+.Ve
+.PP
+.Vb 6
+\& static void
+\& t2_cb (EV_P_ struct ev_timer *w, int revents)
+\& {
+\& struct my_biggy big = (struct my_biggy *
+\& (((char *)w) - offsetof (struct my_biggy, t2));
+\& }
+.Ve
.SH "WATCHER TYPES"
.IX Header "WATCHER TYPES"
This section describes each watcher in detail, but will not repeat
.IX Item "int events [read-only]"
The events being watched.
.PP
-Example: call \f(CW\*(C`stdin_readable_cb\*(C'\fR when \s-1STDIN_FILENO\s0 has become, well
+Example: Call \f(CW\*(C`stdin_readable_cb\*(C'\fR when \s-1STDIN_FILENO\s0 has become, well
readable, but only once. Since it is likely line\-buffered, you could
-attempt to read a whole line in the callback:
+attempt to read a whole line in the callback.
.PP
.Vb 6
\& static void
This will act as if the timer timed out and restart it again if it is
repeating. The exact semantics are:
.Sp
-If the timer is started but nonrepeating, stop it.
+If the timer is pending, its pending status is cleared.
+.Sp
+If the timer is started but nonrepeating, stop it (as if it timed out).
.Sp
-If the timer is repeating, either start it if necessary (with the repeat
-value), or reset the running timer to the repeat value.
+If the timer is repeating, either start it if necessary (with the
+\&\f(CW\*(C`repeat\*(C'\fR value), or reset the running timer to the \f(CW\*(C`repeat\*(C'\fR value.
.Sp
This sounds a bit complicated, but here is a useful and typical
-example: Imagine you have a tcp connection and you want a so-called
-idle timeout, that is, you want to be called when there have been,
-say, 60 seconds of inactivity on the socket. The easiest way to do
-this is to configure an \f(CW\*(C`ev_timer\*(C'\fR with \f(CW\*(C`after\*(C'\fR=\f(CW\*(C`repeat\*(C'\fR=\f(CW60\fR and calling
+example: Imagine you have a tcp connection and you want a so-called idle
+timeout, that is, you want to be called when there have been, say, 60
+seconds of inactivity on the socket. The easiest way to do this is to
+configure an \f(CW\*(C`ev_timer\*(C'\fR with a \f(CW\*(C`repeat\*(C'\fR value of \f(CW60\fR and then call
\&\f(CW\*(C`ev_timer_again\*(C'\fR each time you successfully read or write some data. If
you go into an idle state where you do not expect data to travel on the
-socket, you can stop the timer, and again will automatically restart it if
-need be.
+socket, you can \f(CW\*(C`ev_timer_stop\*(C'\fR the timer, and \f(CW\*(C`ev_timer_again\*(C'\fR will
+automatically restart it if need be.
.Sp
-You can also ignore the \f(CW\*(C`after\*(C'\fR value and \f(CW\*(C`ev_timer_start\*(C'\fR altogether
-and only ever use the \f(CW\*(C`repeat\*(C'\fR value:
+That means you can ignore the \f(CW\*(C`after\*(C'\fR value and \f(CW\*(C`ev_timer_start\*(C'\fR
+altogether and only ever use the \f(CW\*(C`repeat\*(C'\fR value and \f(CW\*(C`ev_timer_again\*(C'\fR:
.Sp
.Vb 8
\& ev_timer_init (timer, callback, 0., 5.);
\& ev_timer_again (loop, timer);
.Ve
.Sp
-This is more efficient then stopping/starting the timer eahc time you want
-to modify its timeout value.
+This is more slightly efficient then stopping/starting the timer each time
+you want to modify its timeout value.
.IP "ev_tstamp repeat [read\-write]" 4
.IX Item "ev_tstamp repeat [read-write]"
The current \f(CW\*(C`repeat\*(C'\fR value. Will be used each time the watcher times out
or \f(CW\*(C`ev_timer_again\*(C'\fR is called and determines the next timeout (if any),
which is also when any modifications are taken into account.
.PP
-Example: create a timer that fires after 60 seconds.
+Example: Create a timer that fires after 60 seconds.
.PP
.Vb 5
\& static void
\& ev_timer_start (loop, &mytimer);
.Ve
.PP
-Example: create a timeout timer that times out after 10 seconds of
+Example: Create a timeout timer that times out after 10 seconds of
inactivity.
.PP
.Vb 5
switched off. Can be changed any time, but changes only take effect when
the periodic timer fires or \f(CW\*(C`ev_periodic_again\*(C'\fR is being called.
.PP
-Example: call a callback every hour, or, more precisely, whenever the
+Example: Call a callback every hour, or, more precisely, whenever the
system clock is divisible by 3600. The callback invocation times have
potentially a lot of jittering, but good long-term stability.
.PP
\& ev_periodic_start (loop, &hourly_tick);
.Ve
.PP
-Example: the same as above, but use a reschedule callback to do it:
+Example: The same as above, but use a reschedule callback to do it:
.PP
.Vb 1
\& #include <math.h>
\& ev_periodic_init (&hourly_tick, clock_cb, 0., 0., my_scheduler_cb);
.Ve
.PP
-Example: call a callback every hour, starting now:
+Example: Call a callback every hour, starting now:
.PP
.Vb 4
\& struct ev_periodic hourly_tick;
The process exit/trace status caused by \f(CW\*(C`rpid\*(C'\fR (see your systems
\&\f(CW\*(C`waitpid\*(C'\fR and \f(CW\*(C`sys/wait.h\*(C'\fR documentation for details).
.PP
-Example: try to exit cleanly on \s-1SIGINT\s0 and \s-1SIGTERM\s0.
+Example: Try to exit cleanly on \s-1SIGINT\s0 and \s-1SIGTERM\s0.
.PP
.Vb 5
\& static void
otherwise always forced to be at least one) and all the other fields of
the stat buffer having unspecified contents.
.PP
+The path \fIshould\fR be absolute and \fImust not\fR end in a slash. If it is
+relative and your working directory changes, the behaviour is undefined.
+.PP
Since there is no standard to do this, the portable implementation simply
-calls \f(CW\*(C`stat (2)\*(C'\fR regulalry on the path to see if it changed somehow. You
+calls \f(CW\*(C`stat (2)\*(C'\fR regularly on the path to see if it changed somehow. You
can specify a recommended polling interval for this case. If you specify
a polling interval of \f(CW0\fR (highly recommended!) then a \fIsuitable,
unspecified default\fR value will be used (which you can expect to be around
as even with OS-supported change notifications, this can be
resource\-intensive.
.PP
-At the time of this writing, no specific \s-1OS\s0 backends are implemented, but
-if demand increases, at least a kqueue and inotify backend will be added.
+At the time of this writing, only the Linux inotify interface is
+implemented (implementing kqueue support is left as an exercise for the
+reader). Inotify will be used to give hints only and should not change the
+semantics of \f(CW\*(C`ev_stat\*(C'\fR watchers, which means that libev sometimes needs
+to fall back to regular polling again even with inotify, but changes are
+usually detected immediately, and if the file exists there will be no
+polling.
.IP "ev_stat_init (ev_stat *, callback, const char *path, ev_tstamp interval)" 4
.IX Item "ev_stat_init (ev_stat *, callback, const char *path, ev_tstamp interval)"
.PD 0
kind. There is a \f(CW\*(C`ev_idle_set\*(C'\fR macro, but using it is utterly pointless,
believe me.
.PP
-Example: dynamically allocate an \f(CW\*(C`ev_idle\*(C'\fR, start it, and in the
-callback, free it. Alos, use no error checking, as usual.
+Example: Dynamically allocate an \f(CW\*(C`ev_idle\*(C'\fR watcher, start it, and in the
+callback, free it. Also, use no error checking, as usual.
.PP
.Vb 7
\& static void
Similar to the other two macros, this gives you the value of the default
loop, if multiple loops are supported (\*(L"ev loop default\*(R").
.PP
-Example: Declare and initialise a check watcher, working regardless of
-wether multiple loops are supported or not.
+Example: Declare and initialise a check watcher, utilising the above
+macros so it will work regardless of wether multiple loops are supported
+or not.
.PP
.Vb 5
\& static void
.Ve
.PP
.Vb 5
-\& ev_select.c only when select backend is enabled (which is by default)
+\& ev_select.c only when select backend is enabled (which is enabled by default)
\& ev_poll.c only when poll backend is enabled (disabled by default)
\& ev_epoll.c only when the epoll backend is enabled (disabled by default)
\& ev_kqueue.c only when the kqueue backend is enabled (disabled by default)
.IP "\s-1EV_USE_DEVPOLL\s0" 4
.IX Item "EV_USE_DEVPOLL"
reserved for future expansion, works like the \s-1USE\s0 symbols above.
+.IP "\s-1EV_USE_INOTIFY\s0" 4
+.IX Item "EV_USE_INOTIFY"
+If defined to be \f(CW1\fR, libev will compile in support for the Linux inotify
+interface to speed up \f(CW\*(C`ev_stat\*(C'\fR watchers. Its actual availability will
+be detected at runtime.
.IP "\s-1EV_H\s0" 4
.IX Item "EV_H"
The name of the \fIev.h\fR header file used to include it. The default if
\&\f(CW\*(C`ev_child\*(C'\fR watchers use a small hash table to distribute workload by
pid. The default size is \f(CW16\fR (or \f(CW1\fR with \f(CW\*(C`EV_MINIMAL\*(C'\fR), usually more
than enough. If you need to manage thousands of children you might want to
-increase this value.
+increase this value (\fImust\fR be a power of two).
+.IP "\s-1EV_INOTIFY_HASHSIZE\s0" 4
+.IX Item "EV_INOTIFY_HASHSIZE"
+\&\f(CW\*(C`ev_staz\*(C'\fR watchers use a small hash table to distribute workload by
+inotify watch id. The default size is \f(CW16\fR (or \f(CW1\fR with \f(CW\*(C`EV_MINIMAL\*(C'\fR),
+usually more than enough. If you need to manage thousands of \f(CW\*(C`ev_stat\*(C'\fR
+watchers you might want to increase this value (\fImust\fR be a power of
+two).
.IP "\s-1EV_COMMON\s0" 4
.IX Item "EV_COMMON"
By default, all watchers have a \f(CW\*(C`void *data\*(C'\fR member. By redefining
file.
.Sp
The usage in rxvt-unicode is simpler. It has a \fIev_cpp.h\fR header file
-that everybody includes and which overrides some autoconf choices:
+that everybody includes and which overrides some configure choices:
.Sp
-.Vb 4
+.Vb 9
+\& #define EV_MINIMAL 1
\& #define EV_USE_POLL 0
\& #define EV_MULTIPLICITY 0
-\& #define EV_PERIODICS 0
+\& #define EV_PERIODIC_ENABLE 0
+\& #define EV_STAT_ENABLE 0
+\& #define EV_FORK_ENABLE 0
\& #define EV_CONFIG_H <config.h>
+\& #define EV_MINPRI 0
+\& #define EV_MAXPRI 0
.Ve
.Sp
.Vb 1
.IX Item "Starting io/check/prepare/idle/signal/child watchers: O(1)"
.IP "Stopping check/prepare/idle watchers: O(1)" 4
.IX Item "Stopping check/prepare/idle watchers: O(1)"
-.IP "Stopping an io/signal/child watcher: O(number_of_watchers_for_this_(fd/signal/pid % 16))" 4
-.IX Item "Stopping an io/signal/child watcher: O(number_of_watchers_for_this_(fd/signal/pid % 16))"
+.IP "Stopping an io/signal/child watcher: O(number_of_watchers_for_this_(fd/signal/pid % \s-1EV_PID_HASHSIZE\s0))" 4
+.IX Item "Stopping an io/signal/child watcher: O(number_of_watchers_for_this_(fd/signal/pid % EV_PID_HASHSIZE))"
.IP "Finding the next timer per loop iteration: O(1)" 4
.IX Item "Finding the next timer per loop iteration: O(1)"
.IP "Each change on a file descriptor per loop iteration: O(number_of_watchers_for_this_fd)" 4