--- AnyEvent/lib/AnyEvent.pm 2008/05/10 21:47:28 1.115 +++ AnyEvent/lib/AnyEvent.pm 2008/05/23 06:13:41 1.122 @@ -693,7 +693,7 @@ use Carp; -our $VERSION = '3.4'; +our $VERSION = '3.51'; our $MODEL; our $AUTOLOAD; @@ -732,12 +732,12 @@ push @post_detect, $cb; defined wantarray - ? bless \$cb, "AnyEvent::Util::Guard" + ? bless \$cb, "AnyEvent::Util::PostDetect" : () } } -sub AnyEvent::Util::Guard::DESTROY { +sub AnyEvent::Util::PostDetect::DESTROY { @post_detect = grep $_ != ${$_[0]}, @post_detect; } @@ -813,7 +813,7 @@ # default implementation for ->condvar sub condvar { - bless {}, "AnyEvent::Base::CondVar" + bless {}, AnyEvent::CondVar:: } # default implementation for ->signal @@ -897,16 +897,20 @@ undef $CHLD_W unless keys %PID_CB; } -package AnyEvent::Base::CondVar; +package AnyEvent::CondVar; + +our @ISA = AnyEvent::CondVar::Base::; + +package AnyEvent::CondVar::Base; -# wake up the waiter sub _send { - &{ delete $_[0]{_ae_cb} } if $_[0]{_ae_cb}; + # nop } sub send { my $cv = shift; $cv->{_ae_sent} = [@_]; + (delete $cv->{_ae_cb})->($cv) if $cv->{_ae_cb}; $cv->_send; } @@ -919,8 +923,12 @@ $_[0]{_ae_sent} } -sub recv { +sub _wait { AnyEvent->one_event while !$_[0]{_ae_sent}; +} + +sub recv { + $_[0]->_wait; Carp::croak $_[0]{_ae_croak} if $_[0]{_ae_croak}; wantarray ? @{ $_[0]{_ae_sent} } : $_[0]{_ae_sent}[0] @@ -943,7 +951,7 @@ # undocumented/compatibility with pre-3.4 *broadcast = \&send; -*wait = \&recv; +*wait = \&_wait; =head1 SUPPLYING YOUR OWN EVENT MODEL INTERFACE @@ -1042,7 +1050,7 @@ warn "io event <$_[0]>\n"; # will always output chomp (my $input = ); # read a line warn "read: $input\n"; # output what has been read - $cv->broadcast if $input =~ /^q/i; # quit program if /^q/i + $cv->send if $input =~ /^q/i; # quit program if /^q/i }, ); @@ -1057,7 +1065,7 @@ new_timer; # create first timer - $cv->wait; # wait until user enters /^q/i + $cv->recv; # wait until user enters /^q/i =head1 REAL-WORLD EXAMPLE @@ -1123,7 +1131,7 @@ if (end-of-file or data complete) { $txn->{result} = $txn->{buf}; - $txn->{finished}->broadcast; + $txn->{finished}->send; $txb->{cb}->($txn) of $txn->{cb}; # also call callback } @@ -1131,7 +1139,7 @@ request was already finished, it doesn't wait, of course, and returns the data: - $txn->{finished}->wait; + $txn->{finished}->recv; return $txn->{result}; The actual code goes further and collects all errors (Cs, exceptions) @@ -1176,10 +1184,10 @@ $fcp->txn_client_get ($url)->cb (sub { ... - $quit->broadcast; + $quit->send; }); - $quit->wait; + $quit->recv; =head1 BENCHMARKS @@ -1218,7 +1226,7 @@ I is the time, in microseconds, used to invoke a simple callback. The callback simply counts down a Perl variable and after it was -invoked "watcher" times, it would C<< ->broadcast >> a condvar once to +invoked "watcher" times, it would C<< ->send >> a condvar once to signal the end of this phase. I is the time, in microseconds, that it takes to destroy a single @@ -1489,6 +1497,8 @@ L, L, L. +Asynchronous DNS: L. + Coroutine support: L, L, L, L, Nontrivial usage examples: L, L.