X-Git-Url: https://git.llucax.com/software/libev.git/blobdiff_plain/4422091b9b8967efdcfea8f650321595a8d95a98..bd14babf134e551f28f49193bf20705933c772c8:/ev.html diff --git a/ev.html b/ev.html index f24dedd..bb4c00e 100644 --- a/ev.html +++ b/ev.html @@ -6,7 +6,7 @@ - +
@@ -37,11 +37,13 @@ev_idle
- when you've got nothing better to do...ev_prepare
and ev_check
- customise your event loop!ev_embed
- when one backend isn't enough...ev_fork
- the audacity to resume the event loop after a fork#include <ev.h> +/* this is the only header you need */ + #include <ev.h> + + /* what follows is a fully working example program */ + ev_io stdin_watcher; + ev_timer timeout_watcher; + + /* 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 */ + } + + static void + timeout_cb (EV_P_ struct ev_timer *w, int revents) + { + /* puts ("timeout"); */ + ev_unloop (EV_A_ EVUNLOOP_ONE); /* leave one loop call */ + } + + int + main (void) + { + struct ev_loop *loop = ev_default_loop (0); + + /* 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); + + /* 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 */ + ev_loop (loop, 0); + + return 0; + }@@ -116,10 +158,6 @@ calledev_tstamp
, which is what you should use too. It usually alia to thedouble
type in C, and when you need to do any calculations on it, you should treat it as such. - - - -
See the description of ev_embed
watchers for more info.
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 and semantics are +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.
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.
Example: replace the libev allocator with one that waits a bit and then retries: better than mine).
static void * - persistent_realloc (void *ptr, long size) + persistent_realloc (void *ptr, size_t size) { for (;;) { @@ -607,6 +645,15 @@ received events. Callbacks of both watcher types can start and stop as many watchers as they want, and all of them will be taken into account (for example, aev_prepare
watcher might start an idle watcher to keepev_loop
from blocking). +
EV_EMBED
The embedded event loop specified in the ev_embed
watcher needs attention.
EV_FORK
The event loop has been resumed in the child process after fork (see
+ev_fork
).
EV_ERROR
ev_fork
- the audacity to resume the event loop after a forkFork watchers are called when a fork ()
was detected (usually because
+whoever is a good citizen cared to tell libev about it by calling
+ev_default_fork
or ev_loop_fork
). The invocation is done before the
+event loop blocks next and before ev_check
watchers are being called,
+and only in the child after the fork. If whoever good citizen calling
+ev_default_fork
cheats and calls it in the wrong process, the fork
+handlers will be invoked, too, of course.
Initialises and configures the fork watcher - it has no parameters of any
+kind. There is a ev_fork_set
macro, but using it is utterly pointless,
+believe me.
Invokes ev_embed_sweep
.
ev::stat
onlyInvokes ev_stat_stat
.
Libev can be compiled with a variety of options, the most fundemantal is
+EV_MULTIPLICITY
. This option determines wether (most) functions and
+callbacks have an initial struct ev_loop *
argument.
To make it easier to write programs that cope with either variant, the +following macros are defined:
+EV_A
, EV_A_
This provides the loop argument for functions, if one is required ("ev
+loop argument"). The EV_A
form is used when this is the sole argument,
+EV_A_
is used when other arguments are following. Example:
ev_unref (EV_A); + ev_timer_add (EV_A_ watcher); + ev_loop (EV_A_ 0); + ++
It assumes the variable loop
of type struct ev_loop *
is in scope,
+which is often provided by the following macro.
EV_P
, EV_P_
This provides the loop parameter for functions, if one is required ("ev
+loop parameter"). The EV_P
form is used when this is the sole parameter,
+EV_P_
is used when other parameters are following. Example:
// this is how ev_unref is being declared + static void ev_unref (EV_P); + + // this is how you can declare your typical callback + static void cb (EV_P_ ev_timer *w, int revents) + ++
It declares a parameter loop
of type struct ev_loop *
, quite
+suitable for use with EV_A
.
EV_DEFAULT
, EV_DEFAULT_
Similar to the other two macros, this gives you the value of the default +loop, if multiple loops are supported ("ev loop default").
+Example: Declare and initialise a check watcher, working regardless of +wether multiple loops are supported or not.
+static void + check_cb (EV_P_ ev_timer *w, int revents) + { + ev_check_stop (EV_A_ w); + } + + ev_check check; + ev_check_init (&check, check_cb); + ev_check_start (EV_DEFAULT_ &check); + ev_loop (EV_DEFAULT_ 0); + + + +
0
, then they are not.
If undefined or defined to be 1
, then stat watchers are supported. If
+defined to be 0
, then they are not.
If undefined or defined to be 1
, then fork watchers are supported. If
defined to be 0
, then they are not.
0
, then they are not.
If you need to shave off some kilobytes of code at the expense of some
speed, define this symbol to 1
. Currently only used for gcc to override
some inlining decisions, saves roughly 30% codesize of amd64.
ev_child
watchers use a small hash table to distribute workload by
+pid. The default size is 16
(or 1
with EV_MINIMAL
), usually more
+than enough. If you need to manage thousands of children you might want to
+increase this value.