|
|
|
@ -126,12 +126,12 @@ It supports the following flags: |
|
|
|
|
|
|
|
|
|
=over 4 |
|
|
|
|
|
|
|
|
|
=item EVFLAG_AUTO |
|
|
|
|
=item C<EVFLAG_AUTO> |
|
|
|
|
|
|
|
|
|
The default flags value. Use this if you have no clue (it's the right |
|
|
|
|
thing, believe me). |
|
|
|
|
|
|
|
|
|
=item EVFLAG_NOENV |
|
|
|
|
=item C<EVFLAG_NOENV> |
|
|
|
|
|
|
|
|
|
If this flag bit is ored into the flag value (or the program runs setuid |
|
|
|
|
or setgid) then libev will I<not> look at the environment variable |
|
|
|
@ -140,17 +140,17 @@ 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 EVMETHOD_SELECT (portable select backend) |
|
|
|
|
=item C<EVMETHOD_SELECT> (portable select backend) |
|
|
|
|
|
|
|
|
|
=item EVMETHOD_POLL (poll backend, available everywhere except on windows) |
|
|
|
|
=item C<EVMETHOD_POLL> (poll backend, available everywhere except on windows) |
|
|
|
|
|
|
|
|
|
=item EVMETHOD_EPOLL (linux only) |
|
|
|
|
=item C<EVMETHOD_EPOLL> (linux only) |
|
|
|
|
|
|
|
|
|
=item EVMETHOD_KQUEUE (some bsds only) |
|
|
|
|
=item C<EVMETHOD_KQUEUE> (some bsds only) |
|
|
|
|
|
|
|
|
|
=item EVMETHOD_DEVPOLL (solaris 8 only) |
|
|
|
|
=item C<EVMETHOD_DEVPOLL> (solaris 8 only) |
|
|
|
|
|
|
|
|
|
=item EVMETHOD_PORT (solaris 10 only) |
|
|
|
|
=item C<EVMETHOD_PORT> (solaris 10 only) |
|
|
|
|
|
|
|
|
|
If one or more of these are ored into the flags value, then only these |
|
|
|
|
backends will be tried (in the reverse order as given here). If one are |
|
|
|
@ -262,7 +262,7 @@ libraries. Just remember to I<unref after start> and I<ref before stop>. |
|
|
|
|
|
|
|
|
|
A watcher is a structure that you create and register to record your |
|
|
|
|
interest in some event. For instance, if you want to wait for STDIN to |
|
|
|
|
become readable, you would create an ev_io watcher for that: |
|
|
|
|
become readable, you would create an C<ev_io> watcher for that: |
|
|
|
|
|
|
|
|
|
static void my_cb (struct ev_loop *loop, struct ev_io *w, int revents) |
|
|
|
|
{ |
|
|
|
@ -316,46 +316,46 @@ are: |
|
|
|
|
|
|
|
|
|
=over 4 |
|
|
|
|
|
|
|
|
|
=item EV_READ |
|
|
|
|
=item C<EV_READ> |
|
|
|
|
|
|
|
|
|
=item EV_WRITE |
|
|
|
|
=item C<EV_WRITE> |
|
|
|
|
|
|
|
|
|
The file descriptor in the ev_io watcher has become readable and/or |
|
|
|
|
The file descriptor in the C<ev_io> watcher has become readable and/or |
|
|
|
|
writable. |
|
|
|
|
|
|
|
|
|
=item EV_TIMEOUT |
|
|
|
|
=item C<EV_TIMEOUT> |
|
|
|
|
|
|
|
|
|
The ev_timer watcher has timed out. |
|
|
|
|
The C<ev_timer> watcher has timed out. |
|
|
|
|
|
|
|
|
|
=item EV_PERIODIC |
|
|
|
|
=item C<EV_PERIODIC> |
|
|
|
|
|
|
|
|
|
The ev_periodic watcher has timed out. |
|
|
|
|
The C<ev_periodic> watcher has timed out. |
|
|
|
|
|
|
|
|
|
=item EV_SIGNAL |
|
|
|
|
=item C<EV_SIGNAL> |
|
|
|
|
|
|
|
|
|
The signal specified in the ev_signal watcher has been received by a thread. |
|
|
|
|
The signal specified in the C<ev_signal> watcher has been received by a thread. |
|
|
|
|
|
|
|
|
|
=item EV_CHILD |
|
|
|
|
=item C<EV_CHILD> |
|
|
|
|
|
|
|
|
|
The pid specified in the ev_child watcher has received a status change. |
|
|
|
|
The pid specified in the C<ev_child> watcher has received a status change. |
|
|
|
|
|
|
|
|
|
=item EV_IDLE |
|
|
|
|
=item C<EV_IDLE> |
|
|
|
|
|
|
|
|
|
The ev_idle watcher has determined that you have nothing better to do. |
|
|
|
|
The C<ev_idle> watcher has determined that you have nothing better to do. |
|
|
|
|
|
|
|
|
|
=item EV_PREPARE |
|
|
|
|
=item C<EV_PREPARE> |
|
|
|
|
|
|
|
|
|
=item EV_CHECK |
|
|
|
|
=item C<EV_CHECK> |
|
|
|
|
|
|
|
|
|
All ev_prepare watchers are invoked just I<before> C<ev_loop> starts |
|
|
|
|
to gather new events, and all ev_check watchers are invoked just after |
|
|
|
|
All C<ev_prepare> watchers are invoked just I<before> C<ev_loop> starts |
|
|
|
|
to gather new events, and all C<ev_check> watchers are invoked just after |
|
|
|
|
C<ev_loop> has gathered them, but before it invokes any callbacks for any |
|
|
|
|
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, a ev_prepare watcher might start an idle watcher to keep |
|
|
|
|
(for example, a C<ev_prepare> watcher might start an idle watcher to keep |
|
|
|
|
C<ev_loop> from blocking). |
|
|
|
|
|
|
|
|
|
=item EV_ERROR |
|
|
|
|
=item C<EV_ERROR> |
|
|
|
|
|
|
|
|
|
An unspecified error has occured, the watcher has been stopped. This might |
|
|
|
|
happen because the watcher could not be properly started because libev |
|
|
|
@ -406,7 +406,7 @@ have been omitted.... |
|
|
|
|
This section describes each watcher in detail, but will not repeat |
|
|
|
|
information given in the last section. |
|
|
|
|
|
|
|
|
|
=head2 struct ev_io - is my file descriptor readable or writable |
|
|
|
|
=head2 C<ev_io> - is this file descriptor readable or writable |
|
|
|
|
|
|
|
|
|
I/O watchers check whether a file descriptor is readable or writable |
|
|
|
|
in each iteration of the event loop (This behaviour is called |
|
|
|
@ -434,13 +434,13 @@ EVMETHOD_POLL). |
|
|
|
|
|
|
|
|
|
=item ev_io_set (ev_io *, int fd, int events) |
|
|
|
|
|
|
|
|
|
Configures an ev_io watcher. The fd is the file descriptor to rceeive |
|
|
|
|
Configures an C<ev_io> watcher. The fd is the file descriptor to rceeive |
|
|
|
|
events for and events is either C<EV_READ>, C<EV_WRITE> or C<EV_READ | |
|
|
|
|
EV_WRITE> to receive the given events. |
|
|
|
|
|
|
|
|
|
=back |
|
|
|
|
|
|
|
|
|
=head2 struct ev_timer - relative and optionally recurring timeouts |
|
|
|
|
=head2 C<ev_timer> - relative and optionally recurring timeouts |
|
|
|
|
|
|
|
|
|
Timer watchers are simple relative timers that generate an event after a |
|
|
|
|
given time, and optionally repeating in regular intervals after that. |
|
|
|
@ -490,24 +490,24 @@ 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 ev_timer with after=repeat=60 and calling ev_timer_again each |
|
|
|
|
configure an C<ev_timer> with after=repeat=60 and calling ev_timer_again 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. |
|
|
|
|
|
|
|
|
|
=back |
|
|
|
|
|
|
|
|
|
=head2 ev_periodic - to cron or not to cron it |
|
|
|
|
=head2 C<ev_periodic> - to cron or not to cron it |
|
|
|
|
|
|
|
|
|
Periodic watchers are also timers of a kind, but they are very versatile |
|
|
|
|
(and unfortunately a bit complex). |
|
|
|
|
|
|
|
|
|
Unlike ev_timer's, they are not based on real time (or relative time) |
|
|
|
|
Unlike C<ev_timer>'s, they are not based on real time (or relative time) |
|
|
|
|
but on wallclock time (absolute time). You can tell a periodic watcher |
|
|
|
|
to trigger "at" some specific point in time. For example, if you tell a |
|
|
|
|
periodic watcher to trigger in 10 seconds (by specifiying e.g. c<ev_now () |
|
|
|
|
+ 10.>) and then reset your system clock to the last year, then it will |
|
|
|
|
take a year to trigger the event (unlike an ev_timer, which would trigger |
|
|
|
|
take a year to trigger the event (unlike an C<ev_timer>, which would trigger |
|
|
|
|
roughly 10 seconds later and of course not if you reset your system time |
|
|
|
|
again). |
|
|
|
|
|
|
|
|
@ -550,7 +550,7 @@ full hour (UTC), or more correct, when the system time is evenly divisible |
|
|
|
|
by 3600. |
|
|
|
|
|
|
|
|
|
Another way to think about it (for the mathematically inclined) is that |
|
|
|
|
ev_periodic will try to run the callback in this mode at the next possible |
|
|
|
|
C<ev_periodic> will try to run the callback in this mode at the next possible |
|
|
|
|
time where C<time = at (mod interval)>, regardless of any time jumps. |
|
|
|
|
|
|
|
|
|
=item * manual reschedule mode (reschedule_cb = callback) |
|
|
|
@ -593,7 +593,7 @@ program when the crontabs have changed). |
|
|
|
|
|
|
|
|
|
=back |
|
|
|
|
|
|
|
|
|
=head2 ev_signal - signal me when a signal gets signalled |
|
|
|
|
=head2 C<ev_signal> - signal me when a signal gets signalled |
|
|
|
|
|
|
|
|
|
Signal watchers will trigger an event when the process receives a specific |
|
|
|
|
signal one or more times. Even though signals are very asynchronous, libev |
|
|
|
@ -618,7 +618,7 @@ of the C<SIGxxx> constants). |
|
|
|
|
|
|
|
|
|
=back |
|
|
|
|
|
|
|
|
|
=head2 ev_child - wait for pid status changes |
|
|
|
|
=head2 C<ev_child> - wait for pid status changes |
|
|
|
|
|
|
|
|
|
Child watchers trigger when your process receives a SIGCHLD in response to |
|
|
|
|
some child status changes (most typically when a child of yours dies). |
|
|
|
@ -637,7 +637,7 @@ contains the pid of the process causing the status change. |
|
|
|
|
|
|
|
|
|
=back |
|
|
|
|
|
|
|
|
|
=head2 ev_idle - when you've got nothing better to do |
|
|
|
|
=head2 C<ev_idle> - when you've got nothing better to do |
|
|
|
|
|
|
|
|
|
Idle watchers trigger events when there are no other I/O or timer (or |
|
|
|
|
periodic) events pending. That is, as long as your process is busy |
|
|
|
@ -674,8 +674,8 @@ could be used, for example, to track variable changes, implement your own |
|
|
|
|
watchers, integrate net-snmp or a coroutine library and lots more. |
|
|
|
|
|
|
|
|
|
This is done by examining in each prepare call which file descriptors need |
|
|
|
|
to be watched by the other library, registering ev_io watchers for them |
|
|
|
|
and starting an ev_timer watcher for any timeouts (many libraries provide |
|
|
|
|
to be watched by the other library, registering C<ev_io> watchers for them |
|
|
|
|
and starting an C<ev_timer> watcher for any timeouts (many libraries provide |
|
|
|
|
just this functionality). Then, in the check watcher you check for any |
|
|
|
|
events that occured (by making your callbacks set soem flags for example) |
|
|
|
|
and call back into the library. |
|
|
|
@ -712,16 +712,16 @@ or timeout without havign to allocate/configure/start/stop/free one or |
|
|
|
|
more watchers yourself. |
|
|
|
|
|
|
|
|
|
If C<fd> is less than 0, then no I/O watcher will be started and events is |
|
|
|
|
ignored. Otherwise, an ev_io watcher for the given C<fd> and C<events> set |
|
|
|
|
ignored. Otherwise, an C<ev_io> watcher for the given C<fd> and C<events> set |
|
|
|
|
will be craeted and started. |
|
|
|
|
|
|
|
|
|
If C<timeout> is less than 0, then no timeout watcher will be |
|
|
|
|
started. Otherwise an ev_timer watcher with after = C<timeout> (and repeat |
|
|
|
|
started. Otherwise an C<ev_timer> watcher with after = C<timeout> (and repeat |
|
|
|
|
= 0) will be started. |
|
|
|
|
|
|
|
|
|
The callback has the type C<void (*cb)(int revents, void *arg)> and |
|
|
|
|
gets passed an events set (normally a combination of EV_ERROR, EV_READ, |
|
|
|
|
EV_WRITE or EV_TIMEOUT) and the C<arg> value passed to C<ev_once>: |
|
|
|
|
gets passed an events set (normally a combination of C<EV_ERROR>, C<EV_READ>, |
|
|
|
|
C<EV_WRITE> or C<EV_TIMEOUT>) and the C<arg> value passed to C<ev_once>: |
|
|
|
|
|
|
|
|
|
static void stdin_ready (int revents, void *arg) |
|
|
|
|
{ |
|
|
|
|