--- IO-AIO/AIO.pm 2006/10/24 16:35:04 1.73 +++ IO-AIO/AIO.pm 2006/10/24 20:10:26 1.75 @@ -522,55 +522,35 @@ my (@dirs, @nondirs); - my ($statcb, $schedcb); - my $nreq = 0; - - my $statgrp = add $grp aio_group; - - $schedcb = sub { - if (@$entries) { - if ($nreq < $maxreq) { - my $ent = pop @$entries; - $nreq++; - add $statgrp aio_stat "$path/$ent/.", sub { $statcb->($_[0], $ent) }; - } - } elsif (!$nreq) { - # finished - $statgrp->cancel; - undef $statcb; - undef $schedcb; - $grp->result (\@dirs, \@nondirs); - } + my $statgrp = add $grp aio_group sub { + $grp->result (\@dirs, \@nondirs); }; - $statcb = sub { - my ($status, $entry) = @_; - if ($status < 0) { - $nreq--; - push @nondirs, $entry; - &$schedcb; - } else { - # need to check for real directory - add $grp aio_lstat "$path/$entry", sub { - $nreq--; - - if (-d _) { - push @dirs, $entry; - - if (!--$ndirs) { - push @nondirs, @$entries; - $entries = []; + limit $statgrp $maxreq; + feed $statgrp sub { + return unless @$entries; + my $entry = pop @$entries; + + add $statgrp aio_stat "$path/$entry/.", sub { + if ($_[0] < 0) { + push @nondirs, $entry; + } else { + # need to check for real directory + add $statgrp aio_lstat "$path/$entry", sub { + if (-d _) { + push @dirs, $entry; + + unless (--$ndirs) { + push @nondirs, @$entries; + feed $statgrp; + } + } else { + push @nondirs, $entry; } - } else { - push @nondirs, $entry; } - - &$schedcb; } - } + }; }; - - &$schedcb while @$entries && $nreq < $maxreq; }; }; }; @@ -593,8 +573,6 @@ =item aio_group $callback->(...) -[EXPERIMENTAL] - This is a very special aio request: Instead of doing something, it is a container for other aio requests, which is useful if you want to bundle many requests into a single, composite, request with a definite callback @@ -734,6 +712,11 @@ Returns all its arguments. +=item $grp->cancel_subs + +Cancel all subrequests and clears any feeder, but not the group request +itself. Useful when you queued a lot of events but got a result early. + =item $grp->result (...) Set the result value(s) that will be passed to the group callback when all @@ -741,8 +724,6 @@ =item feed $grp $callback->($grp) -[VERY EXPERIMENTAL] - Sets a feeder/generator on this group: every group can have an attached generator that generates requests if idle. The idea behind this is that, although you could just queue as many requests as you want in a group,