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.22 by root, Sun Dec 31 11:54:43 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.
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