|
|
|
@ -8,49 +8,63 @@ libev - a high performance full-featured event loop written in C
|
|
|
|
|
|
|
|
|
|
=head2 EXAMPLE PROGRAM
|
|
|
|
|
|
|
|
|
|
// a single header file is required
|
|
|
|
|
#include <ev.h>
|
|
|
|
|
|
|
|
|
|
// every watcher type has its own typedef'd struct
|
|
|
|
|
// with the name ev_<type>
|
|
|
|
|
ev_io stdin_watcher;
|
|
|
|
|
ev_timer timeout_watcher;
|
|
|
|
|
|
|
|
|
|
/* called when data readable on stdin */
|
|
|
|
|
// all watcher callbacks have a similar signature
|
|
|
|
|
// this callback is called when data is 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 */
|
|
|
|
|
puts ("stdin ready");
|
|
|
|
|
// for one-shot events, one must manually stop the watcher
|
|
|
|
|
// with its corresponding stop function.
|
|
|
|
|
ev_io_stop (EV_A_ w);
|
|
|
|
|
|
|
|
|
|
// this causes all nested ev_loop's to stop iterating
|
|
|
|
|
ev_unloop (EV_A_ EVUNLOOP_ALL);
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
// another callback, this time for a time-out
|
|
|
|
|
static void
|
|
|
|
|
timeout_cb (EV_P_ struct ev_timer *w, int revents)
|
|
|
|
|
{
|
|
|
|
|
/* puts ("timeout"); */
|
|
|
|
|
ev_unloop (EV_A_ EVUNLOOP_ONE); /* leave one loop call */
|
|
|
|
|
puts ("timeout");
|
|
|
|
|
// this causes the innermost ev_loop to stop iterating
|
|
|
|
|
ev_unloop (EV_A_ EVUNLOOP_ONE);
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
int
|
|
|
|
|
main (void)
|
|
|
|
|
{
|
|
|
|
|
// use the default event loop unless you have special needs
|
|
|
|
|
struct ev_loop *loop = ev_default_loop (0);
|
|
|
|
|
|
|
|
|
|
/* initialise an io watcher, then start it */
|
|
|
|
|
// initialise an io watcher, then start it
|
|
|
|
|
// this one will watch for stdin to become readable
|
|
|
|
|
ev_io_init (&stdin_watcher, stdin_cb, /*STDIN_FILENO*/ 0, EV_READ);
|
|
|
|
|
ev_io_start (loop, &stdin_watcher);
|
|
|
|
|
|
|
|
|
|
/* simple non-repeating 5.5 second timeout */
|
|
|
|
|
// initialise a timer watcher, then start it
|
|
|
|
|
// simple non-repeating 5.5 second timeout
|
|
|
|
|
ev_timer_init (&timeout_watcher, timeout_cb, 5.5, 0.);
|
|
|
|
|
ev_timer_start (loop, &timeout_watcher);
|
|
|
|
|
|
|
|
|
|
/* loop till timeout or data ready */
|
|
|
|
|
// now wait for events to arrive
|
|
|
|
|
ev_loop (loop, 0);
|
|
|
|
|
|
|
|
|
|
// unloop was called, so exit
|
|
|
|
|
return 0;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
=head1 DESCRIPTION
|
|
|
|
|
|
|
|
|
|
The newest version of this document is also available as a html-formatted
|
|
|
|
|
The newest version of this document is also available as an html-formatted
|
|
|
|
|
web page you might find easier to navigate when reading it for the first
|
|
|
|
|
time: L<http://cvs.schmorp.de/libev/ev.html>.
|
|
|
|
|
|
|
|
|
@ -86,12 +100,13 @@ for example).
|
|
|
|
|
|
|
|
|
|
=head2 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 B<EMBED> section in
|
|
|
|
|
this manual. If libev was configured without support for multiple event
|
|
|
|
|
loops, then all functions taking an initial argument of name C<loop>
|
|
|
|
|
(which is always of type C<struct ev_loop *>) will not have this argument.
|
|
|
|
|
Libev is very configurable. In this manual the default (and most common)
|
|
|
|
|
configuration will be described, which supports multiple event loops. For
|
|
|
|
|
more info about various configuration options please have a look at
|
|
|
|
|
B<EMBED> section in this manual. If libev was configured without support
|
|
|
|
|
for multiple event loops, then all functions taking an initial argument of
|
|
|
|
|
name C<loop> (which is always of type C<struct ev_loop *>) will not have
|
|
|
|
|
this argument.
|
|
|
|
|
|
|
|
|
|
=head2 TIME REPRESENTATION
|
|
|
|
|
|
|
|
|
@ -299,8 +314,8 @@ enabling this flag.
|
|
|
|
|
This works by calling C<getpid ()> 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 noticeable (on my
|
|
|
|
|
Linux system for example, C<getpid> is actually a simple 5-insn sequence
|
|
|
|
|
without a syscall and thus I<very> fast, but my Linux system also has
|
|
|
|
|
GNU/Linux system for example, C<getpid> is actually a simple 5-insn sequence
|
|
|
|
|
without a syscall and thus I<very> fast, but my GNU/Linux system also has
|
|
|
|
|
C<pthread_atfork> which is even faster).
|
|
|
|
|
|
|
|
|
|
The big advantage of this flag is that you can forget about fork (and
|
|
|
|
@ -1421,6 +1436,12 @@ as you don't register any with libev). Similarly, when the last signal
|
|
|
|
|
watcher for a signal is stopped libev will reset the signal handler to
|
|
|
|
|
SIG_DFL (regardless of what it was set to before).
|
|
|
|
|
|
|
|
|
|
If possible and supported, libev will install its handlers with
|
|
|
|
|
C<SA_RESTART> behaviour enabled, so syscalls should not be unduly
|
|
|
|
|
interrupted. If you have a problem with syscalls getting interrupted by
|
|
|
|
|
signals you can block all signals in an C<ev_check> watcher and unblock
|
|
|
|
|
them in an C<ev_prepare> watcher.
|
|
|
|
|
|
|
|
|
|
=head3 Watcher-Specific Functions and Data Members
|
|
|
|
|
|
|
|
|
|
=over 4
|
|
|
|
|