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.38 by root, Sun Nov 25 14:08:12 2007 UTC

70You can create I/O watcher by calling the C<< AnyEvent->io >> method with 70You can create I/O watcher by calling the C<< AnyEvent->io >> method with
71the following mandatory arguments: 71the following mandatory arguments:
72 72
73C<fh> the Perl I<filehandle> (not filedescriptor) to watch for 73C<fh> the Perl I<filehandle> (not filedescriptor) to watch for
74events. C<poll> must be a string that is either C<r> or C<w>, that creates 74events. C<poll> must be a string that is either C<r> or C<w>, that creates
75a watcher waiting for "r"eadable or "w"ritable events. C<cb> teh callback 75a watcher waiting for "r"eadable or "w"ritable events. C<cb> the callback
76to invoke everytime the filehandle becomes ready. 76to invoke everytime the filehandle becomes ready.
77 77
78Only one io watcher per C<fh> and C<poll> combination is allowed (i.e. on 78Only one io watcher per C<fh> and C<poll> combination is allowed (i.e. on
79a socket you can have one r + one w, not any more (limitation comes from 79a socket you can have one r + one w, not any more (limitation comes from
80Tk - if you are sure you are not using Tk this limitation is gone). 80Tk - if you are sure you are not using Tk this limitation is gone).
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.
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 AnyEvent::Impl::CoroEV based on Coro::EV, best choice.
203 AnyEvent::Impl::EV based on EV (an interface to libev, also best choice).
200 AnyEvent::Impl::Coro based on Coro::Event, best choise. 204 AnyEvent::Impl::Coro based on Coro::Event, second best choice.
201 AnyEvent::Impl::Event based on Event, also best choice :) 205 AnyEvent::Impl::Event based on Event, also second best choice :)
202 AnyEvent::Impl::Glib based on Glib, second-best choice. 206 AnyEvent::Impl::Glib based on Glib, second-best choice.
203 AnyEvent::Impl::Tk based on Tk, very bad choice. 207 AnyEvent::Impl::Tk based on Tk, very bad choice.
204 AnyEvent::Impl::Perl pure-perl implementation, inefficient. 208 AnyEvent::Impl::Perl pure-perl implementation, inefficient.
205 209
206=item AnyEvent::detect 210=item AnyEvent::detect
245 249
246package AnyEvent; 250package AnyEvent;
247 251
248no warnings; 252no warnings;
249use strict; 253use strict;
254
250use Carp; 255use Carp;
251 256
252our $VERSION = '2.51'; 257our $VERSION = '2.8';
253our $MODEL; 258our $MODEL;
254 259
255our $AUTOLOAD; 260our $AUTOLOAD;
256our @ISA; 261our @ISA;
257 262
258our $verbose = $ENV{PERL_ANYEVENT_VERBOSE}*1; 263our $verbose = $ENV{PERL_ANYEVENT_VERBOSE}*1;
259 264
260our @REGISTRY; 265our @REGISTRY;
261 266
262my @models = ( 267my @models = (
268 [Coro::EV:: => AnyEvent::Impl::CoroEV::],
269 [EV:: => AnyEvent::Impl::EV::],
263 [Coro::Event:: => AnyEvent::Impl::Coro::], 270 [Coro::Event:: => AnyEvent::Impl::Coro::],
264 [Event:: => AnyEvent::Impl::Event::], 271 [Event:: => AnyEvent::Impl::Event::],
265 [Glib:: => AnyEvent::Impl::Glib::], 272 [Glib:: => AnyEvent::Impl::Glib::],
266 [Tk:: => AnyEvent::Impl::Tk::], 273 [Tk:: => AnyEvent::Impl::Tk::],
267 [AnyEvent::Impl::Perl:: => AnyEvent::Impl::Perl::], 274 [AnyEvent::Impl::Perl:: => AnyEvent::Impl::Perl::],
298 last; 305 last;
299 } 306 }
300 } 307 }
301 308
302 $MODEL 309 $MODEL
303 or die "No event module selected for AnyEvent and autodetect failed. Install any one of these modules: Event (or Coro+Event), Glib or Tk."; 310 or die "No event module selected for AnyEvent and autodetect failed. Install any one of these modules: EV (or Coro+EV), Event (or Coro+Event), Glib or Tk.";
304 } 311 }
305 312
306 unshift @ISA, $MODEL; 313 unshift @ISA, $MODEL;
307 push @{"$MODEL\::ISA"}, "AnyEvent::Base"; 314 push @{"$MODEL\::ISA"}, "AnyEvent::Base";
308 } 315 }
366 373
367# default implementation for ->child 374# default implementation for ->child
368 375
369our %PID_CB; 376our %PID_CB;
370our $CHLD_W; 377our $CHLD_W;
378our $CHLD_DELAY_W;
371our $PID_IDLE; 379our $PID_IDLE;
372our $WNOHANG; 380our $WNOHANG;
373 381
374sub _child_wait { 382sub _child_wait {
375 while (0 < (my $pid = waitpid -1, $WNOHANG)) { 383 while (0 < (my $pid = waitpid -1, $WNOHANG)) {
376 $_->() for values %{ (delete $PID_CB{$pid}) || {} }; 384 $_->($pid, $?) for (values %{ $PID_CB{$pid} || {} }),
385 (values %{ $PID_CB{0} || {} });
377 } 386 }
378 387
379 undef $PID_IDLE; 388 undef $PID_IDLE;
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 });
380} 397}
381 398
382sub child { 399sub child {
383 my (undef, %arg) = @_; 400 my (undef, %arg) = @_;
384 401
385 my $pid = uc $arg{pid} 402 defined (my $pid = $arg{pid} + 0)
386 or Carp::croak "required option 'pid' is missing"; 403 or Carp::croak "required option 'pid' is missing";
387 404
388 $PID_CB{$pid}{$arg{cb}} = $arg{cb}; 405 $PID_CB{$pid}{$arg{cb}} = $arg{cb};
389 406
390 unless ($WNOHANG) { 407 unless ($WNOHANG) {
391 $CHLD_W = AnyEvent->signal (signal => 'CHLD', cb => \&_child_wait);
392 $WNOHANG = eval { require POSIX; &POSIX::WNOHANG } || 1; 408 $WNOHANG = eval { require POSIX; &POSIX::WNOHANG } || 1;
393 } 409 }
394 410
395 # child could be a zombie already 411 unless ($CHLD_W) {
396 $PID_IDLE ||= AnyEvent->timer (after => 0, cb => \&_child_wait); 412 $CHLD_W = AnyEvent->signal (signal => 'CHLD', cb => \&_sigchld);
413 # child could be a zombie already, so make at least one round
414 &_sigchld;
415 }
397 416
398 bless [$pid, $arg{cb}], "AnyEvent::Base::Child" 417 bless [$pid, $arg{cb}], "AnyEvent::Base::Child"
399} 418}
400 419
401sub AnyEvent::Base::Child::DESTROY { 420sub AnyEvent::Base::Child::DESTROY {
437I<rxvt-unicode> distribution. 456I<rxvt-unicode> distribution.
438 457
439I<rxvt-unicode> also cheats a bit by not providing blocking access to 458I<rxvt-unicode> also cheats a bit by not providing blocking access to
440condition variables: code blocking while waiting for a condition will 459condition variables: code blocking while waiting for a condition will
441C<die>. This still works with most modules/usages, and blocking calls must 460C<die>. This still works with most modules/usages, and blocking calls must
442not be in an interactive appliation, so it makes sense. 461not be in an interactive application, so it makes sense.
443 462
444=head1 ENVIRONMENT VARIABLES 463=head1 ENVIRONMENT VARIABLES
445 464
446The following environment variables are used by this module: 465The following environment variables are used by this module:
447 466

Diff Legend

Removed lines
+ Added lines
< Changed lines
> Changed lines