--- AnyEvent/lib/AnyEvent.pm 2008/05/01 12:35:54 1.105 +++ AnyEvent/lib/AnyEvent.pm 2008/05/01 13:45:22 1.106 @@ -17,8 +17,8 @@ }); my $w = AnyEvent->condvar; # stores whether a condition was flagged - $w->wait; # enters "main loop" till $condvar gets ->broadcast - $w->broadcast; # wake up current and all future wait's + $w->wait; # enters "main loop" till $condvar gets ->send + $w->send; # wake up current and all future wait's =head1 WHY YOU SHOULD USE THIS MODULE (OR NOT) @@ -290,7 +290,7 @@ cb => sub { my ($pid, $status) = @_; warn "pid $pid exited with status $status"; - $done->broadcast; + $done->send; }, ); @@ -315,7 +315,7 @@ becomes true. After creation, the conditon variable is "false" until it becomes "true" -by calling the C method. +by calling the C method. Condition variables are similar to callbacks, except that you can optionally wait for them. They can also be called merge points - points @@ -333,7 +333,7 @@ You can also use them to simulate traditional event loops - for example, you can block your main program until an event occurs - for example, you could C<< ->wait >> in your main program until the user clicks the Quit -button of your app, which would C<< ->broadcast >> the "quit" event. +button of your app, which would C<< ->send >> the "quit" event. Note that condition variables recurse into the event loop - if you have two pieces of code that call C<< ->wait >> in a round-robbin fashion, you @@ -348,8 +348,8 @@ it's C method in your own C method. There are two "sides" to a condition variable - the "producer side" which -eventually calls C<< -> broadcast >>, and the "consumer side", which waits -for the broadcast to occur. +eventually calls C<< -> send >>, and the "consumer side", which waits +for the send to occur. Example: @@ -357,42 +357,42 @@ my $result_ready = AnyEvent->condvar; # do something such as adding a timer - # or socket watcher the calls $result_ready->broadcast + # or socket watcher the calls $result_ready->send # when the "result" is ready. # in this case, we simply use a timer: my $w = AnyEvent->timer ( after => 1, - cb => sub { $result_ready->broadcast }, + cb => sub { $result_ready->send }, ); # this "blocks" (while handling events) till the callback - # calls broadcast + # calls send $result_ready->wait; =head3 METHODS FOR PRODUCERS These methods should only be used by the producing side, i.e. the -code/module that eventually broadcasts the signal. Note that it is also +code/module that eventually sends the signal. Note that it is also the producer side which creates the condvar in most cases, but it isn't uncommon for the consumer to create it as well. =over 4 -=item $cv->broadcast (...) +=item $cv->send (...) Flag the condition as ready - a running C<< ->wait >> and all further calls to C will (eventually) return after this method has been -called. If nobody is waiting the broadcast will be remembered. +called. If nobody is waiting the send will be remembered. If a callback has been set on the condition variable, it is called -immediately from within broadcast. +immediately from within send. -Any arguments passed to the C call will be returned by all +Any arguments passed to the C call will be returned by all future C<< ->wait >> calls. =item $cv->croak ($error) -Similar to broadcast, but causes all call's wait C<< ->wait >> to invoke +Similar to send, but causes all call's wait C<< ->wait >> to invoke C with the given error message/object/scalar. This can be used to signal any errors to the condition variable @@ -409,15 +409,15 @@ Every call to C<< ->begin >> will increment a counter, and every call to C<< ->end >> will decrement it. If the counter reaches C<0> in C<< ->end >>, the (last) callback passed to C will be executed. That callback -is I to call C<< ->broadcast >>, but that is not required. If no -callback was set, C will be called without any arguments. +is I to call C<< ->send >>, but that is not required. If no +callback was set, C will be called without any arguments. Let's clarify this with the ping example: my $cv = AnyEvent->condvar; my %result; - $cv->begin (sub { $cv->broadcast (\%result) }); + $cv->begin (sub { $cv->send (\%result) }); for my $host (@list_of_hosts) { $cv->begin; @@ -430,7 +430,7 @@ $cv->end; This code fragment supposedly pings a number of hosts and calls -C after results for all then have have been gathered - in any +C after results for all then have have been gathered - in any order. To achieve this, the code issues a call to C when it starts each ping request and calls C when it has received some result for it. Since C and C only maintain a counter, the order in which @@ -439,7 +439,7 @@ There is an additional bracketing call to C and C outside the loop, which serves two important purposes: first, it sets the callback to be called once the counter reaches C<0>, and second, it ensures that -broadcast is called even when C hosts are being pinged (the loop +C is called even when C hosts are being pinged (the loop doesn't execute once). This is the general pattern when you "fan out" into multiple subrequests: @@ -454,9 +454,11 @@ These methods should only be used by the consuming side, i.e. the code awaits the condition. +=over 4 + =item $cv->wait -Wait (blocking if necessary) until the C<< ->broadcast >> or C<< ->croak +Wait (blocking if necessary) until the C<< ->send >> or C<< ->croak >> methods have been called on c<$cv>, while servicing other watchers normally. @@ -466,7 +468,7 @@ If an error condition has been set by calling C<< ->croak >>, then this function will call C. -In list context, all parameters passed to C will be returned, +In list context, all parameters passed to C will be returned, in scalar context only the first one will be returned. Not all event models support a blocking wait - some die in that case @@ -489,6 +491,20 @@ time). This will work even when the event loop does not support blocking waits otherwise. +=item $bool = $cv->ready + +Returns true when the condition is "true", i.e. whether C or +C have been called. + +=item $cb = $cv->cb ([new callback]) + +This is a mutator function that returns the callback set and optionally +replaces it before doing so. + +The callback will be called when the condition becomes "true", i.e. when +C or C are called. Calling C inside the callback +or at any later time is guaranteed not to block. + =back =head1 GLOBAL VARIABLES AND FUNCTIONS @@ -546,7 +562,7 @@ to load the event module first. Never call C<< ->wait >> on a condition variable unless you I that -the C<< ->broadcast >> method has been called on it already. This is +the C<< ->send >> method has been called on it already. This is because it will stall the whole program, and the whole point of using events is to stay interactive. @@ -683,7 +699,7 @@ [POE::Kernel:: => AnyEvent::Impl::POE::], # lasciate ogni speranza ); -our %method = map +($_ => 1), qw(io timer signal child condvar broadcast wait one_event DESTROY); +our %method = map +($_ => 1), qw(io timer signal child condvar one_event DESTROY); sub detect() { unless ($MODEL) {