--- AnyEvent/lib/AnyEvent.pm 2008/09/04 10:58:58 1.179 +++ AnyEvent/lib/AnyEvent.pm 2009/02/12 17:33:37 1.193 @@ -342,11 +342,18 @@ You can also watch on a child process exit and catch its exit status. The child process is specified by the C argument (if set to C<0>, it -watches for any child process exit). The watcher will trigger as often -as status change for the child are received. This works by installing a -signal handler for C. The callback will be called with the pid -and exit status (as returned by waitpid), so unlike other watcher types, -you I rely on child watcher callback arguments. +watches for any child process exit). The watcher will triggered only when +the child process has finished and an exit status is available, not on +any trace events (stopped/continued). + +The callback will be called with the pid and exit status (as returned by +waitpid), so unlike other watcher types, you I rely on child watcher +callback arguments. + +This watcher type works by installing a signal handler for C, +and since it cannot be shared, nothing else should use SIGCHLD or reap +random child processes (waiting for specific child processes, e.g. inside +C, is just fine). There is a slight catch to child watchers, however: you usually start them I the child process was created, and this means the process could @@ -820,9 +827,9 @@ A non-blocking interface to the Internet Go Server protocol (used by L). -=item L +=item L -AnyEvent based IRC client module family. +AnyEvent based IRC client module family (replacing the older Net::IRC3). =item L @@ -852,11 +859,11 @@ package AnyEvent; no warnings; -use strict; +use strict qw(vars subs); use Carp; -our $VERSION = 4.233; +our $VERSION = 4.34; our $MODEL; our $AUTOLOAD; @@ -1023,7 +1030,7 @@ *_time = \&Time::HiRes::time; # if (eval "use POSIX (); (POSIX::times())... } else { - *_time = \&CORE::time; # epic fail + *_time = sub { time }; # epic fail } } @@ -1177,52 +1184,28 @@ *broadcast = \&send; *wait = \&_wait; -=head1 SUPPLYING YOUR OWN EVENT MODEL INTERFACE - -This is an advanced topic that you do not normally need to use AnyEvent in -a module. This section is only of use to event loop authors who want to -provide AnyEvent compatibility. - -If you need to support another event library which isn't directly -supported by AnyEvent, you can supply your own interface to it by -pushing, before the first watcher gets created, the package name of -the event module and the package name of the interface to use onto -C<@AnyEvent::REGISTRY>. You can do that before and even without loading -AnyEvent, so it is reasonably cheap. - -Example: +=head1 ERROR AND EXCEPTION HANDLING - push @AnyEvent::REGISTRY, [urxvt => urxvt::anyevent::]; - -This tells AnyEvent to (literally) use the C -package/class when it finds the C package/module is already loaded. - -When AnyEvent is loaded and asked to find a suitable event model, it -will first check for the presence of urxvt by trying to C the -C module. - -The class should provide implementations for all watcher types. See -L (source code), L (Source code) -and so on for actual examples. Use C to -see the sources. - -If you don't provide C and C watchers than AnyEvent will -provide suitable (hopefully) replacements. - -The above example isn't fictitious, the I (a.k.a. urxvt) -terminal emulator uses the above line as-is. An interface isn't included -in AnyEvent because it doesn't make sense outside the embedded interpreter -inside I, and it is updated and maintained as part of the -I distribution. - -I also cheats a bit by not providing blocking access to -condition variables: code blocking while waiting for a condition will -C. This still works with most modules/usages, and blocking calls must -not be done in an interactive application, so it makes sense. +In general, AnyEvent does not do any error handling - it relies on the +caller to do that if required. The L module (see also +the C environment variable, below) provides strict +checking of all AnyEvent methods, however, which is highly useful during +development. + +As for exception handling (i.e. runtime errors and exceptions thrown while +executing a callback), this is not only highly event-loop specific, but +also not in any way wrapped by this module, as this is the job of the main +program. + +The pure perl event loop simply re-throws the exception (usually +within C<< condvar->recv >>), the L and L modules call C<< +$Event/EV::DIED->() >>, L uses C<< install_exception_handler >> and +so on. =head1 ENVIRONMENT VARIABLES -The following environment variables are used by this module: +The following environment variables are used by this module or its +submodules: =over 4 @@ -1249,8 +1232,9 @@ In other words, enables "strict" mode. -Unlike C it is definitely recommended ot keep it off in -production. +Unlike C, it is definitely recommended ot keep it off in +production. Keeping C in your environment while +developing programs can be very useful, however. =item C @@ -1306,6 +1290,49 @@ =back +=head1 SUPPLYING YOUR OWN EVENT MODEL INTERFACE + +This is an advanced topic that you do not normally need to use AnyEvent in +a module. This section is only of use to event loop authors who want to +provide AnyEvent compatibility. + +If you need to support another event library which isn't directly +supported by AnyEvent, you can supply your own interface to it by +pushing, before the first watcher gets created, the package name of +the event module and the package name of the interface to use onto +C<@AnyEvent::REGISTRY>. You can do that before and even without loading +AnyEvent, so it is reasonably cheap. + +Example: + + push @AnyEvent::REGISTRY, [urxvt => urxvt::anyevent::]; + +This tells AnyEvent to (literally) use the C +package/class when it finds the C package/module is already loaded. + +When AnyEvent is loaded and asked to find a suitable event model, it +will first check for the presence of urxvt by trying to C the +C module. + +The class should provide implementations for all watcher types. See +L (source code), L (Source code) +and so on for actual examples. Use C to +see the sources. + +If you don't provide C and C watchers than AnyEvent will +provide suitable (hopefully) replacements. + +The above example isn't fictitious, the I (a.k.a. urxvt) +terminal emulator uses the above line as-is. An interface isn't included +in AnyEvent because it doesn't make sense outside the embedded interpreter +inside I, and it is updated and maintained as part of the +I distribution. + +I also cheats a bit by not providing blocking access to +condition variables: code blocking while waiting for a condition will +C. This still works with most modules/usages, and blocking calls must +not be done in an interactive application, so it makes sense. + =head1 EXAMPLE PROGRAM The following program uses an I/O watcher to read data from STDIN, a timer @@ -1508,16 +1535,16 @@ =head3 Results name watchers bytes create invoke destroy comment - EV/EV 400000 244 0.56 0.46 0.31 EV native interface - EV/Any 100000 244 2.50 0.46 0.29 EV + AnyEvent watchers - CoroEV/Any 100000 244 2.49 0.44 0.29 coroutines + Coro::Signal - Perl/Any 100000 513 4.92 0.87 1.12 pure perl implementation - Event/Event 16000 516 31.88 31.30 0.85 Event native interface - Event/Any 16000 590 35.75 31.42 1.08 Event + AnyEvent watchers - Glib/Any 16000 1357 98.22 12.41 54.00 quadratic behaviour - Tk/Any 2000 1860 26.97 67.98 14.00 SEGV with >> 2000 watchers - POE/Event 2000 6644 108.64 736.02 14.73 via POE::Loop::Event - POE/Select 2000 6343 94.13 809.12 565.96 via POE::Loop::Select + EV/EV 400000 224 0.47 0.35 0.27 EV native interface + EV/Any 100000 224 2.88 0.34 0.27 EV + AnyEvent watchers + CoroEV/Any 100000 224 2.85 0.35 0.28 coroutines + Coro::Signal + Perl/Any 100000 452 4.13 0.73 0.95 pure perl implementation + Event/Event 16000 517 32.20 31.80 0.81 Event native interface + Event/Any 16000 590 35.85 31.55 1.06 Event + AnyEvent watchers + Glib/Any 16000 1357 102.33 12.31 51.00 quadratic behaviour + Tk/Any 2000 1860 27.20 66.31 14.00 SEGV with >> 2000 watchers + POE/Event 2000 6328 109.99 751.67 14.02 via POE::Loop::Event + POE/Select 2000 6027 94.54 809.13 579.80 via POE::Loop::Select =head3 Discussion @@ -1729,6 +1756,42 @@ =back +=head1 SIGNALS + +AnyEvent currently installs handlers for these signals: + +=over 4 + +=item SIGCHLD + +A handler for C is installed by AnyEvent's child watcher +emulation for event loops that do not support them natively. Also, some +event loops install a similar handler. + +=item SIGPIPE + +A no-op handler is installed for C when C<$SIG{PIPE}> is C +when AnyEvent gets loaded. + +The rationale for this is that AnyEvent users usually do not really depend +on SIGPIPE delivery (which is purely an optimisation for shell use, or +badly-written programs), but C can cause spurious and rare +program exits as a lot of people do not expect C when writing to +some random socket. + +The rationale for installing a no-op handler as opposed to ignoring it is +that this way, the handler will be restored to defaults on exec. + +Feel free to install your own handler, or reset it to defaults. + +=back + +=cut + +$SIG{PIPE} = sub { } + unless defined $SIG{PIPE}; + + =head1 FORK Most event libraries are not fork-safe. The ones who are usually are