--- cvsroot/EV/EV.pm 2007/11/24 08:42:38 1.50 +++ cvsroot/EV/EV.pm 2007/12/07 18:09:38 1.62 @@ -41,6 +41,12 @@ my ($w, $revents) = @_; my $status = $w->rstatus; }; + + # STAT CHANGES + my $w = EV::stat "/etc/passwd", 10, sub { + my ($w, $revents) = @_; + warn $w->path, " has changed somehow.\n"; + }; # MAINLOOP EV::loop; # loop until EV::unloop is called or all watchers stop @@ -50,7 +56,12 @@ =head1 DESCRIPTION This module provides an interface to libev -(L). +(L). While the documentation +below is comprehensive, one might also consult the documentation of libev +itself (L) for more subtle details on +watcher semantics or some discussion on the available backends, or how to +force a specific backend with C, or just about in any case +because it has much more detailed information. =cut @@ -59,7 +70,7 @@ use strict; BEGIN { - our $VERSION = '1.2'; + our $VERSION = '1.7'; use XSLoader; XSLoader::load "EV", $VERSION; } @@ -68,10 +79,14 @@ @EV::Timer::ISA = @EV::Periodic::ISA = @EV::Signal::ISA = +@EV::Child::ISA = +@EV::Stat::ISA = @EV::Idle::ISA = @EV::Prepare::ISA = @EV::Check::ISA = -@EV::Child::ISA = "EV::Watcher"; +@EV::Embed::ISA = +@EV::Fork::ISA = + "EV::Watcher"; =head1 BASIC INTERFACE @@ -119,6 +134,11 @@ When called with an argument of EV::UNLOOP_ALL, all calls to EV::loop will return as fast as possible. +=item $count = EV::loop_count + +Return the number of times the event loop has polled for new +events. Sometiems useful as a generation counter. + =item EV::once $fh_or_undef, $events, $timeout, $cb->($revents) This function rolls together an I/O and a timer watcher for a single @@ -144,7 +164,7 @@ =back -=head2 WATCHER +=head2 WATCHER OBJECTS A watcher is an object that gets created to record your interest in some event. For instance, if you want to wait for STDIN to become readable, you @@ -163,7 +183,7 @@ Each watcher type has its associated bit in revents, so you can use the same callback for multiple watchers. The event mask is named after the type, i..e. EV::child sets EV::CHILD, EV::prepare sets EV::PREPARE, -EV::periodic sets EV::PERIODIC and so on, with the exception of IO events +EV::periodic sets EV::PERIODIC and so on, with the exception of I/O events (which can set both EV::READ and EV::WRITE bits), and EV::timer (which uses EV::TIMEOUT). @@ -179,14 +199,9 @@ ->fh and so on) automatically stop and start it again if it is active, which means pending events get lost. -=head2 WATCHER TYPES - -Now lets move to the existing watcher types and asociated methods. +=head2 COMMON WATCHER METHODS -The following methods are available for all watchers. Then followes a -description of each watcher constructor (EV::io, EV::timer, EV::periodic, -EV::signal, EV::child, EV::idle, EV::prepare and EV::check), followed by -any type-specific methods (if any). +This section lists methods common to all watchers. =over 4 @@ -200,7 +215,7 @@ Stop a watcher if it is active. Also clear any pending events (events that have been received but that didn't yet result in a callback invocation), -regardless of wether the watcher was active or not. +regardless of whether the watcher was active or not. =item $bool = $w->is_active @@ -265,19 +280,30 @@ The initial value for keepalive is true (enabled), and you cna change it any time. -Example: Register an IO watcher for some UDP socket but do not keep the +Example: Register an I/O watcher for some UDP socket but do not keep the event loop from running just because of that watcher. my $udp_socket = ... my $udp_watcher = EV::io $udp_socket, EV::READ, sub { ... }; $udp_watcher->keepalive (0); +=back + + +=head2 WATCHER TYPES + +Each of the following subsections describes a single watcher type. + +=head3 I/O WATCHERS - is this file descriptor readable or writable? + +=over 4 + =item $w = EV::io $fileno_or_fh, $eventmask, $callback =item $w = EV::io_ns $fileno_or_fh, $eventmask, $callback As long as the returned watcher object is alive, call the C<$callback> -when the events specified in C<$eventmask>. +when at least one of events specified in C<$eventmask> occurs. The $eventmask can be one or more of these constants ORed together: @@ -303,14 +329,20 @@ Returns the previously set event mask and optionally set a new one. +=back + + +=head3 TIMER WATCHERS - relative and optionally repeating timeouts + +=over 4 =item $w = EV::timer $after, $repeat, $callback =item $w = EV::timer_ns $after, $repeat, $callback -Calls the callback after C<$after> seconds. If C<$repeat> is non-zero, -the timer will be restarted (with the $repeat value as $after) after the -callback returns. +Calls the callback after C<$after> seconds (which may be fractional). If +C<$repeat> is non-zero, the timer will be restarted (with the $repeat +value as $after) after the callback returns. This means that the callback would be called roughly after C<$after> seconds, and then every C<$repeat> seconds. The timer does his best not @@ -326,7 +358,7 @@ =item $w->set ($after, $repeat) -Reconfigures the watcher, see the constructor above for details. Can be at +Reconfigures the watcher, see the constructor above for details. Can be called at any time. =item $w->again @@ -347,6 +379,12 @@ C<$repeat>, and then, in the read/write watcher, run the C method on the timeout. +=back + + +=head3 PERIODIC WATCHERS - to cron or not to cron? + +=over 4 =item $w = EV::periodic $at, $interval, $reschedule_cb, $callback @@ -428,25 +466,31 @@ =item $w->set ($at, $interval, $reschedule_cb) -Reconfigures the watcher, see the constructor above for details. Can be at +Reconfigures the watcher, see the constructor above for details. Can be called at any time. =item $w->again Simply stops and starts the watcher again. +=back + + +=head3 SIGNAL WATCHERS - signal me when a signal gets signalled! + +=over 4 =item $w = EV::signal $signal, $callback =item $w = EV::signal_ns $signal, $callback -Call the callback when $signal is received (the signal can be specified -by number or by name, just as with kill or %SIG). +Call the callback when $signal is received (the signal can be specified by +number or by name, just as with C or C<%SIG>). EV will grab the signal for the process (the kernel only allows one component to receive a signal at a time) when you start a signal watcher, and removes it again when you stop it. Perl does the same when you -add/remove callbacks to %SIG, so watch out. +add/remove callbacks to C<%SIG>, so watch out. You can have as many signal watchers per signal as you want. @@ -454,8 +498,8 @@ =item $w->set ($signal) -Reconfigures the watcher, see the constructor above for details. Can be at -any time. +Reconfigures the watcher, see the constructor above for details. Can be +called at any time. =item $current_signum = $w->signal @@ -464,26 +508,38 @@ Returns the previously set signal (always as a number not name) and optionally set a new one. +=back + + +=head3 CHILD WATCHERS - watch out for process status changes + +=over 4 =item $w = EV::child $pid, $callback =item $w = EV::child_ns $pid, $callback -Call the callback when a status change for pid C<$pid> (or any pid -if C<$pid> is 0) has been received. More precisely: when the process -receives a SIGCHLD, EV will fetch the outstanding exit/wait status for all +Call the callback when a status change for pid C<$pid> (or any pid if +C<$pid> is 0) has been received. More precisely: when the process receives +a C, EV will fetch the outstanding exit/wait status for all changed/zombie children and call the callback. -You can access both status and pid by using the C and C -methods on the watcher object. +It is valid (and fully supported) to install a child watcher after a child +has exited but before the event loop has started its next iteration (for +example, first you C, then the new child process might exit, and +only then do you install a child watcher in the parent for the new pid). + +You can access both exit (or tracing) status and pid by using the +C and C methods on the watcher object. -You can have as many pid watchers per pid as you want. +You can have as many pid watchers per pid as you want, they will all be +called. The C variant doesn't start (activate) the newly created watcher. =item $w->set ($pid) -Reconfigures the watcher, see the constructor above for details. Can be at +Reconfigures the watcher, see the constructor above for details. Can be called at any time. =item $current_pid = $w->pid @@ -502,19 +558,122 @@ Return the pid of the awaited child (useful when you have installed a watcher for all pids). +=back + + +=head3 STAT WATCHERS - did the file attributes just change? + +=over 4 + +=item $w = EV::stat $path, $interval, $callback + +=item $w = EV::stat_ns $path, $interval, $callback + +Call the callback when a file status change has been detected on +C<$path>. The C<$path> does not need to exist, changing from "path exists" +to "path does not exist" is a status change like any other. + +The C<$interval> is a recommended polling interval for systems where +OS-supported change notifications don't exist or are not supported. If +you use C<0> then an unspecified default is used (which is highly +recommended!), which is to be expected to be around five seconds usually. + +This watcher type is not meant for massive numbers of stat watchers, +as even with OS-supported change notifications, this can be +resource-intensive. + +The C variant doesn't start (activate) the newly created watcher. + +=item ... = $w->stat + +This call is very similar to the perl C built-in: It stats (using +C) the path specified in the watcher and sets perls stat cache (as +well as EV's idea of the current stat values) to the values found. + +In scalar context, a boolean is return indicating success or failure of +the stat. In list context, the same 13-value list as with stat is returned +(except that the blksize and blocks fields are not reliable). + +In the case of an error, errno is set to C (regardless of the +actual error value) and the C value is forced to zero (if the stat +was successful then nlink is guaranteed to be non-zero). + +See also the next two entries for more info. + +=item ... = $w->attr + +Just like C<< $w->stat >>, but without the initial stat'ing: this returns +the values most recently detected by EV. See the next entry for more info. + +=item ... = $w->prev + +Just like C<< $w->stat >>, but without the initial stat'ing: this returns +the previous set of values, before the change. + +That is, when the watcher callback is invoked, C<< $w->prev >> will be set +to the values found I a change was detected, while C<< $w->attr >> +returns the values found leading to the change detection. The difference (if any) +between C and C is what triggered the callback. + +If you did something to the filesystem object and do not want to trigger +yet another change, you can call C to update EV's idea of what the +current attributes are. + +=item $w->set ($path, $interval) + +Reconfigures the watcher, see the constructor above for details. Can be +called at any time. + +=item $current_path = $w->path + +=item $old_path = $w->path ($new_path) + +Returns the previously set path and optionally set a new one. + +=item $current_interval = $w->interval + +=item $old_interval = $w->interval ($new_interval) + +Returns the previously set interval and optionally set a new one. Can be +used to query the actual interval used. + +=back + + +=head3 IDLE WATCHERS - when you've got nothing better to do... + +=over 4 =item $w = EV::idle $callback =item $w = EV::idle_ns $callback -Call the callback when there are no pending io, timer/periodic, signal or -child events, i.e. when the process is idle. +Call the callback when there are no other pending watchers of the same or +higher priority (excluding check, prepare and other idle watchers of the +same or lower priority, of course). They are called idle watchers because +when the watcher is the highest priority pending event in the process, the +process is considered to be idle at that priority. + +If you want a watcher that is only ever called when I other events are +outstanding you have to set the priority to C. The process will not block as long as any idle watchers are active, and they will be called repeatedly until stopped. +For example, if you have idle watchers at priority C<0> and C<1>, and +an I/O watcher at priority C<0>, then the idle watcher at priority C<1> +and the I/O watcher will always run when ready. Only when the idle watcher +at priority C<1> is stopped and the I/O watcher at priority C<0> is not +pending with the C<0>-priority idle watcher be invoked. + The C variant doesn't start (activate) the newly created watcher. +=back + + +=head3 PREPARE WATCHERS - customise your event loop! + +=over 4 =item $w = EV::prepare $callback @@ -527,6 +686,12 @@ The C variant doesn't start (activate) the newly created watcher. +=back + + +=head3 CHECK WATCHERS - customise your event loop even more! + +=over 4 =item $w = EV::check $callback @@ -550,7 +715,7 @@ # make the dispatcher handle any outstanding stuff ... not shown - # create an IO watcher for each and every socket + # create an I/O watcher for each and every socket @snmp_watcher = ( (map { EV::io $_, EV::READ, sub { } } keys %{ $dispatcher->{_descriptors} }), @@ -582,6 +747,46 @@ =back + +=head3 FORK WATCHERS - the audacity to resume the event loop after a fork + +Fork watchers are called when a C was detected. The invocation +is done before the event loop blocks next and before C watchers +are being called, and only in the child after the fork. + +=over 4 + +=item $w = EV::fork $callback + +=item $w = EV::fork_ns $callback + +Call the callback before the event loop is resumed in the child process +after a fork. + +The C variant doesn't start (activate) the newly created watcher. + +=back + + +=head1 PERL SIGNALS + +While Perl signal handling (C<%SIG>) is not affected by EV, the behaviour +with EV is as the same as any other C library: Perl-signals will only be +handled when Perl runs, which means your signal handler might be invoked +only the next time an event callback is invoked. + +The solution is to use EV signal watchers (see C), which will +ensure proper operations with regards to other event watchers. + +If you cannot do this for whatever reason, you can also force a watcher +to be called on every event loop iteration by installing a C +watcher: + + my $async_check = EV::check sub { }; + +This ensures that perl shortly gets into control for a short time, and +also ensures slower overall operation. + =head1 THREADS Threads are not supported by this module in any way. Perl pseudo-threads @@ -618,7 +823,8 @@ =head1 SEE ALSO - L. +L (asynchronous dns), L (makes Glib/Gtk2 use EV as +event loop), L (efficient coroutines with EV). =head1 AUTHOR