ViewVC Help
View File | Revision Log | Show Annotations | Download File
/cvs/AnyEvent/lib/AnyEvent.pm
(Generate patch)

Comparing AnyEvent/lib/AnyEvent.pm (file contents):
Revision 1.21 by root, Mon Dec 11 20:36:50 2006 UTC vs.
Revision 1.32 by root, Sat Nov 3 09:29:51 2007 UTC

161 161
162=head2 SIGNAL WATCHERS 162=head2 SIGNAL WATCHERS
163 163
164You can listen for signals using a signal watcher, C<signal> is the signal 164You can listen for signals using a signal watcher, C<signal> is the signal
165I<name> without any C<SIG> prefix. Multiple signals events can be clumped 165I<name> without any C<SIG> prefix. Multiple signals events can be clumped
166together into one callback invocation, and callbakc invocation might or 166together into one callback invocation, and callback invocation might or
167might not be asynchronous. 167might not be asynchronous.
168 168
169These watchers might use C<%SIG>, so programs overwriting those signals 169These watchers might use C<%SIG>, so programs overwriting those signals
170directly will likely not work correctly. 170directly will likely not work correctly.
171 171
174 my $w = AnyEvent->signal (signal => "INT", cb => sub { exit 1 }); 174 my $w = AnyEvent->signal (signal => "INT", cb => sub { exit 1 });
175 175
176=head2 CHILD PROCESS WATCHERS 176=head2 CHILD PROCESS WATCHERS
177 177
178You can also listen for the status of a child process specified by the 178You can also listen for the status of a child process specified by the
179C<pid> argument. The watcher will only trigger once. This works by 179C<pid> argument (or any child if the pid argument is 0). The watcher will
180installing a signal handler for C<SIGCHLD>. 180trigger as often as status change for the child are received. This works
181by installing a signal handler for C<SIGCHLD>. The callback will be called with
182the pid and exit status (as returned by waitpid).
181 183
182Example: wait for pid 1333 184Example: wait for pid 1333
183 185
184 my $w = AnyEvent->child (pid => 1333, cb => sub { warn "exit status $?" }); 186 my $w = AnyEvent->child (pid => 1333, cb => sub { warn "exit status $?" });
185 187
195C<AnyEvent::Impl:xxx> modules, but can be any other class in the case 197C<AnyEvent::Impl:xxx> modules, but can be any other class in the case
196AnyEvent has been extended at runtime (e.g. in I<rxvt-unicode>). 198AnyEvent has been extended at runtime (e.g. in I<rxvt-unicode>).
197 199
198The known classes so far are: 200The known classes so far are:
199 201
202 EV::AnyEvent based on EV (an interface to libev, best choice)
200 AnyEvent::Impl::Coro based on Coro::Event, best choise. 203 AnyEvent::Impl::Coro based on Coro::Event, second best choice.
201 AnyEvent::Impl::Event based on Event, also best choice :) 204 AnyEvent::Impl::Event based on Event, also second best choice :)
202 AnyEvent::Impl::Glib based on Glib, second-best choice. 205 AnyEvent::Impl::Glib based on Glib, second-best choice.
203 AnyEvent::Impl::Tk based on Tk, very bad choice. 206 AnyEvent::Impl::Tk based on Tk, very bad choice.
204 AnyEvent::Impl::Perl pure-perl implementation, inefficient. 207 AnyEvent::Impl::Perl pure-perl implementation, inefficient.
205 208
206=item AnyEvent::detect 209=item AnyEvent::detect
245 248
246package AnyEvent; 249package AnyEvent;
247 250
248no warnings; 251no warnings;
249use strict; 252use strict;
253
250use Carp; 254use Carp;
251 255
252our $VERSION = '2.51'; 256our $VERSION = '2.55';
253our $MODEL; 257our $MODEL;
254 258
255our $AUTOLOAD; 259our $AUTOLOAD;
256our @ISA; 260our @ISA;
257 261
259 263
260our @REGISTRY; 264our @REGISTRY;
261 265
262my @models = ( 266my @models = (
263 [Coro::Event:: => AnyEvent::Impl::Coro::], 267 [Coro::Event:: => AnyEvent::Impl::Coro::],
268 [EV:: => EV::AnyEvent::],
264 [Event:: => AnyEvent::Impl::Event::], 269 [Event:: => AnyEvent::Impl::Event::],
265 [Glib:: => AnyEvent::Impl::Glib::], 270 [Glib:: => AnyEvent::Impl::Glib::],
266 [Tk:: => AnyEvent::Impl::Tk::], 271 [Tk:: => AnyEvent::Impl::Tk::],
267 [AnyEvent::Impl::Perl:: => AnyEvent::Impl::Perl::], 272 [AnyEvent::Impl::Perl:: => AnyEvent::Impl::Perl::],
268); 273);
370our $CHLD_W; 375our $CHLD_W;
371our $PID_IDLE; 376our $PID_IDLE;
372our $WNOHANG; 377our $WNOHANG;
373 378
374sub _child_wait { 379sub _child_wait {
375 while (0 < (my $pid = waitpid -1, $WNOHANG)) { 380 while (0 <= (my $pid = waitpid -1, $WNOHANG)) {
376 $_->() for values %{ (delete $PID_CB{$pid}) || {} }; 381 $_->($pid, $?) for (values %{ $PID_CB{$pid} || {} }),
382 (values %{ $PID_CB{0} || {} });
377 } 383 }
378 384
379 undef $PID_IDLE; 385 undef $PID_IDLE;
380} 386}
381 387
382sub child { 388sub child {
383 my (undef, %arg) = @_; 389 my (undef, %arg) = @_;
384 390
385 my $pid = uc $arg{pid} 391 defined (my $pid = $arg{pid} + 0)
386 or Carp::croak "required option 'pid' is missing"; 392 or Carp::croak "required option 'pid' is missing";
387 393
388 $PID_CB{$pid}{$arg{cb}} = $arg{cb}; 394 $PID_CB{$pid}{$arg{cb}} = $arg{cb};
389 395
390 unless ($WNOHANG) { 396 unless ($WNOHANG) {
391 $CHLD_W = AnyEvent->signal (signal => 'CHLD', cb => \&_child_wait);
392 $WNOHANG = eval { require POSIX; &POSIX::WNOHANG } || 1; 397 $WNOHANG = eval { require POSIX; &POSIX::WNOHANG } || 1;
393 } 398 }
394 399
400 unless ($CHLD_W) {
401 $CHLD_W = AnyEvent->signal (signal => 'CHLD', cb => \&_child_wait);
395 # child could be a zombie already 402 # child could be a zombie already
396 $PID_IDLE ||= AnyEvent->timer (after => 0, cb => \&_child_wait); 403 $PID_IDLE ||= AnyEvent->timer (after => 0, cb => \&_child_wait);
404 }
397 405
398 bless [$pid, $arg{cb}], "AnyEvent::Base::Child" 406 bless [$pid, $arg{cb}], "AnyEvent::Base::Child"
399} 407}
400 408
401sub AnyEvent::Base::Child::DESTROY { 409sub AnyEvent::Base::Child::DESTROY {
437I<rxvt-unicode> distribution. 445I<rxvt-unicode> distribution.
438 446
439I<rxvt-unicode> also cheats a bit by not providing blocking access to 447I<rxvt-unicode> also cheats a bit by not providing blocking access to
440condition variables: code blocking while waiting for a condition will 448condition variables: code blocking while waiting for a condition will
441C<die>. This still works with most modules/usages, and blocking calls must 449C<die>. This still works with most modules/usages, and blocking calls must
442not be in an interactive appliation, so it makes sense. 450not be in an interactive application, so it makes sense.
443 451
444=head1 ENVIRONMENT VARIABLES 452=head1 ENVIRONMENT VARIABLES
445 453
446The following environment variables are used by this module: 454The following environment variables are used by this module:
447 455

Diff Legend

Removed lines
+ Added lines
< Changed lines
> Changed lines