--- IO-AIO/bin/treescan 2019/08/23 07:20:21 1.19 +++ IO-AIO/bin/treescan 2020/12/29 15:16:28 1.20 @@ -133,6 +133,8 @@ @ARGV = "." unless @ARGV; +my @todo; # list of dirs/files still left to scan + $opt_grep &&= qr{$opt_grep}s; my ($n_dirs, $n_files, $n_stats) = (0, 0, 0); @@ -197,25 +199,37 @@ }; } - &scan ("$path$_") for @$dirs; + push @todo, "$path$_" + for sort { $b cmp $a } @$dirs; }; } IO::AIO::max_outstanding 100; # two fds per directory, so limit accordingly IO::AIO::min_parallel 20; -for my $seed (@ARGV) { - $seed =~ s/\/+$//; - aio_lstat "$seed/.", sub { - if ($_[0]) { - print STDERR "$seed: $!\n"; - } elsif (-d _) { - scan $seed; - } else { - printfn "", $seed, "/"; - } - }; -} +@todo = reverse @ARGV; -IO::AIO::flush; +while () { + if (@todo) { +printf "(%d)",scalar @todo;$|=1;#d# + my $seed = pop @todo; + $seed =~ s/\/+$//; + aio_lstat "$seed/.", sub { + if ($_[0]) { + print STDERR "$seed: $!\n"; + } elsif (-d _) { + scan $seed; + } else { + printfn "", $seed, "/"; + } + }; + } else { +print "w";$|=1;#d# + IO::AIO::poll_wait; + } + + last unless IO::AIO::nreqs; + + IO::AIO::poll_cb; +}