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.36 by root, Fri Nov 16 09:13:11 2007 UTC vs.
Revision 1.37 by root, Fri Nov 23 10:42:00 2007 UTC

109 my $w = AnyEvent->timer (after => 7.7, cb => sub { 109 my $w = AnyEvent->timer (after => 7.7, cb => sub {
110 warn "timeout\n"; 110 warn "timeout\n";
111 }); 111 });
112 112
113 # to cancel the timer: 113 # to cancel the timer:
114 undef $w 114 undef $w;
115 115
116=head2 CONDITION WATCHERS 116=head2 CONDITION WATCHERS
117 117
118Condition watchers can be created by calling the C<< AnyEvent->condvar >> 118Condition watchers can be created by calling the C<< AnyEvent->condvar >>
119method without any arguments. 119method without any arguments.
252no warnings; 252no warnings;
253use strict; 253use strict;
254 254
255use Carp; 255use Carp;
256 256
257our $VERSION = '2.6'; 257our $VERSION = '2.7';
258our $MODEL; 258our $MODEL;
259 259
260our $AUTOLOAD; 260our $AUTOLOAD;
261our @ISA; 261our @ISA;
262 262
373 373
374# default implementation for ->child 374# default implementation for ->child
375 375
376our %PID_CB; 376our %PID_CB;
377our $CHLD_W; 377our $CHLD_W;
378our $CHLD_DELAY_W;
378our $PID_IDLE; 379our $PID_IDLE;
379our $WNOHANG; 380our $WNOHANG;
380 381
381sub _child_wait { 382sub _child_wait {
382 while (0 <= (my $pid = waitpid -1, $WNOHANG)) { 383 while (0 <= (my $pid = waitpid -1, $WNOHANG)) {
385 } 386 }
386 387
387 undef $PID_IDLE; 388 undef $PID_IDLE;
388} 389}
389 390
391sub _sigchld {
392 # make sure we deliver these changes "synchronous" with the event loop.
393 $CHLD_DELAY_W ||= AnyEvent->timer (after => 0, cb => sub {
394 undef $CHLD_DELAY_W;
395 &_child_wait;
396 });
397}
398
390sub child { 399sub child {
391 my (undef, %arg) = @_; 400 my (undef, %arg) = @_;
392 401
393 defined (my $pid = $arg{pid} + 0) 402 defined (my $pid = $arg{pid} + 0)
394 or Carp::croak "required option 'pid' is missing"; 403 or Carp::croak "required option 'pid' is missing";
398 unless ($WNOHANG) { 407 unless ($WNOHANG) {
399 $WNOHANG = eval { require POSIX; &POSIX::WNOHANG } || 1; 408 $WNOHANG = eval { require POSIX; &POSIX::WNOHANG } || 1;
400 } 409 }
401 410
402 unless ($CHLD_W) { 411 unless ($CHLD_W) {
403 $CHLD_W = AnyEvent->signal (signal => 'CHLD', cb => \&_child_wait); 412 $CHLD_W = AnyEvent->signal (signal => 'CHLD', cb => \&_sigchld);
404 # child could be a zombie already 413 # child could be a zombie already, so make at least one round
405 $PID_IDLE ||= AnyEvent->timer (after => 0, cb => \&_child_wait); 414 &_sigchld;
406 } 415 }
407 416
408 bless [$pid, $arg{cb}], "AnyEvent::Base::Child" 417 bless [$pid, $arg{cb}], "AnyEvent::Base::Child"
409} 418}
410 419

Diff Legend

Removed lines
+ Added lines
< Changed lines
> Changed lines