ViewVC Help
View File | Revision Log | Show Annotations | Download File
/cvs/IO-AIO/AIO.pm
(Generate patch)

Comparing IO-AIO/AIO.pm (file contents):
Revision 1.59 by root, Sun Oct 22 10:33:26 2006 UTC vs.
Revision 1.60 by root, Sun Oct 22 13:33:28 2006 UTC

445 my (@dirs, @nondirs); 445 my (@dirs, @nondirs);
446 446
447 my ($statcb, $schedcb); 447 my ($statcb, $schedcb);
448 my $nreq = 0; 448 my $nreq = 0;
449 449
450 my $statgrp = add $grp aio_group;
451
450 $schedcb = sub { 452 $schedcb = sub {
451 if (@$entries) { 453 if (@$entries) {
452 if ($nreq < $maxreq) { 454 if ($nreq < $maxreq) {
453 my $ent = pop @$entries; 455 my $ent = pop @$entries;
454 $nreq++; 456 $nreq++;
455 add $grp aio_stat "$path/$ent/.", sub { $statcb->($_[0], $ent) }; 457 add $statgrp aio_stat "$path/$ent/.", sub { $statcb->($_[0], $ent) };
456 } 458 }
457 } elsif (!$nreq) { 459 } elsif (!$nreq) {
458 # finished 460 # finished
461 $statgrp->cancel;
459 undef $statcb; 462 undef $statcb;
460 undef $schedcb; 463 undef $schedcb;
461 $grp->result (\@dirs, \@nondirs) if $cb; 464 $grp->result (\@dirs, \@nondirs);
462 undef $cb;
463 } 465 }
464 }; 466 };
465 $statcb = sub { 467 $statcb = sub {
466 my ($status, $entry) = @_; 468 my ($status, $entry) = @_;
467 469
609They can be canceled like any other request. Canceling will cancel not 611They can be canceled like any other request. Canceling will cancel not
610only the request itself, but also all requests it contains. 612only the request itself, but also all requests it contains.
611 613
612They can also can also be added to other IO::AIO::GRP objects. 614They can also can also be added to other IO::AIO::GRP objects.
613 615
616You must not add requests to a group from within the group callback (or
617any later time).
618
614Their lifetime, simplified, looks like this: when they are empty, they 619Their lifetime, simplified, looks like this: when they are empty, they
615will finish very quickly. If they contain only requests that are in the 620will finish very quickly. If they contain only requests that are in the
616C<done> state, they will also finish. Otherwise they will continue to 621C<done> state, they will also finish. Otherwise they will continue to
617exist. 622exist.
618 623
635 640
636=item $grp->result (...) 641=item $grp->result (...)
637 642
638Set the result value(s) that will be passed to the group callback when all 643Set the result value(s) that will be passed to the group callback when all
639subrequests have finished. By default, no argument will be passed. 644subrequests have finished. By default, no argument will be passed.
645
646=item $grp->set_feeder ($callback->($grp))
647
648[VERY EXPERIMENTAL]
649
650Sets a feeder/generator on this group: every group can have an attached
651generator that generates requests if idle. The idea behind this is that,
652although you could just queue as many requests as you want in a group,
653this might starve other requests for a potentially long time. For
654example, C<aio_scandir> might generate hundreds of thousands C<aio_stat>
655requests, delaying any later requests for a long time.
656
657To avoid this, and allow incremental generation of requests, you can
658instead a group and set a feeder on it that generates those requests. The
659feeder will be called whenever there are few enough (see C<feeder_limit>,
660below) requests active in the group itself and is expected to queue more
661requests.
662
663The feeder can queue as many requests as it likes (i.e. C<add> does not
664impose any limits).
665
666If the feeder does not queue more requests when called, it will be
667automatically removed from the group.
668
669If the feeder limit is C<0>, it will be set to C<2> automatically.
670
671Example:
672
673 # stat all files in @files, but only ever use four aio requests concurrently:
674
675 my $grp = aio_group sub { print "finished\n" };
676 $grp->feeder_limit (4);
677 $grp->set_feeder (sub {
678 my $file = pop @files
679 or return;
680
681 add $grp aio_stat $file, sub { ... };
682 });
683
684=item $grp->feeder_limit ($num)
685
686Sets the feeder limit for the group: The feeder will be called whenever
687the group contains less than this many requests.
688
689Setting the limit to C<0> will pause the feeding process.
640 690
641=back 691=back
642 692
643=head2 SUPPORT FUNCTIONS 693=head2 SUPPORT FUNCTIONS
644 694
787 837
788In short: the parent will, after a short pause, continue as if fork had 838In short: the parent will, after a short pause, continue as if fork had
789not been called, while the child will act as if IO::AIO has not been used 839not been called, while the child will act as if IO::AIO has not been used
790yet. 840yet.
791 841
842=head2 MEMORY USAGE
843
844Each aio request uses - depending on your architecture - around 128 bytes
845of memory. In addition, stat requests need a stat buffer (possibly a few
846hundred bytes). Perl scalars and other data passed into aio requests will
847also be locked.
848
849This is now awfully much, so queuing lots of requests is not usually a
850problem.
851
852Each thread needs a stack area which is usually around 16k, sometimes much
853larger, depending on the OS.
854
792=head1 SEE ALSO 855=head1 SEE ALSO
793 856
794L<Coro>, L<Linux::AIO> (obsolete). 857L<Coro>, L<Linux::AIO> (obsolete).
795 858
796=head1 AUTHOR 859=head1 AUTHOR

Diff Legend

Removed lines
+ Added lines
< Changed lines
> Changed lines