--- cvsroot/EV/EV.pm 2007/11/23 05:00:44 1.46 +++ cvsroot/EV/EV.pm 2007/11/28 19:22:16 1.58 @@ -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,11 @@ =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. =cut @@ -59,19 +69,23 @@ use strict; BEGIN { - our $VERSION = '1.2'; + our $VERSION = '1.5'; use XSLoader; XSLoader::load "EV", $VERSION; } -@EV::Io::ISA = +@EV::IO::ISA = @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,9 +133,32 @@ When called with an argument of EV::UNLOOP_ALL, all calls to EV::loop will return as fast as possible. +=item EV::once $fh_or_undef, $events, $timeout, $cb->($revents) + +This function rolls together an I/O and a timer watcher for a single +one-shot event without the need for managing a watcher object. + +If C<$fh_or_undef> is a filehandle or file descriptor, then C<$events> +must be a bitset containing either C, C or C, indicating the type of I/O event you want to wait for. If +you do not want to wait for some I/O event, specify C for +C<$fh_or_undef> and C<0> for C<$events>). + +If timeout is C or negative, then there will be no +timeout. Otherwise a EV::timer with this value will be started. + +When an error occurs or either the timeout or I/O watcher triggers, then +the callback will be called with the received event set (in general +you can expect it to be a combination of C, C, +C and C). + +EV::once doesn't return anything: the watchers stay active till either +of them triggers, then they will be stopped and freed, and the callback +invoked. + =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 @@ -156,14 +193,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 @@ -212,19 +244,60 @@ -2). If the priority is outside this range it will automatically be normalised to the nearest valid priority. -The default priority of any newly-created weatcher is 0. +The default priority of any newly-created watcher is 0. + +Note that the priority semantics have not yet been fleshed out and are +subject to almost certain change. =item $w->trigger ($revents) Call the callback *now* with the given event mask. +=item $previous_state = $w->keepalive ($bool) + +Normally, C will return when there are no active watchers +(which is a "deadlock" because no progress can be made anymore). This is +convinient because it allows you to start your watchers (and your jobs), +call C once and when it returns you know that all your jobs are +finished (or they forgot to register some watchers for their task :). + +Sometimes, however, this gets in your way, for example when you the module +that calls C (usually the main program) is not the same module +as a long-living watcher (for example a DNS client module written by +somebody else even). Then you might want any outstanding requests to be +handled, but you would not want to keep C from returning just +because you happen to have this long-running UDP port watcher. + +In this case you can clear the keepalive status, which means that even +though your watcher is active, it won't keep C from returning. + +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 +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 IO 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: @@ -250,14 +323,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 @@ -273,7 +352,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 @@ -294,6 +373,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 @@ -375,25 +460,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. @@ -401,8 +492,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 @@ -411,26 +502,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 @@ -449,6 +552,91 @@ 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 @@ -462,6 +650,12 @@ 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 @@ -474,6 +668,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 @@ -529,6 +729,27 @@ =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 THREADS Threads are not supported by this module in any way. Perl pseudo-threads @@ -565,7 +786,7 @@ =head1 SEE ALSO - L. +L. =head1 AUTHOR