X-Git-Url: http://www.chiark.greenend.org.uk/ucgi/~ian/git?p=version-charset-test.git;a=blobdiff_plain;f=check;h=72933711c3ad9a4a96e69b6722f89e212600c771;hp=a7ae489e6d0f17339317df2232902e04b6fe5c3d;hb=b71f045b8b03f5add58603c1285aa7867d4c5547;hpb=8562fabbfecb6a9635e90646c1a8b356cec2e375 diff --git a/check b/check index a7ae489..7293371 100755 --- a/check +++ b/check @@ -19,21 +19,53 @@ perl -we ' our $file; our $count; + our $batch=0; + our @tasks; + + my $ncpus = eval { + require Sys::CPU; + Sys::CPU::cpu_count(); + } // 3; + +$ncpus=1; + print STDERR "check using $ncpus cpus\n"; + + sub await_task () { + my ($pid, $oldbatch) = @{ shift @tasks }; + waitpid $pid, 0 == $pid or die $!; + die "$oldbatch $?" if $?; + unlink $oldbatch or die "$oldbatch $!"; + print STDERR "check completed $oldbatch [$pid]\n"; + } sub complete_batch () { - if ($file) { - print STDERR "check completing batch\n"; - close $file or die $!; - system "git update-ref --stdin = $ncpus; + + my $pid = fork // die $!; + if (!$pid) { + close STDIN; +# seek STDIN,0,1; +# flush STDIN; + open STDIN, "<", $batch or die $batch; + exec qw(git update-ref --stdin); + die $!; + } + print STDERR "check spawned $batch ($count) [$pid]\n"; + push @tasks, [ $pid, $batch ]; + $batch++; $file = undef; $count = 0; } while (<>) { #print STDERR ">$_<\n"; - $file ||= new IO::File "batch", ">" or die $!; + $file ||= new IO::File $batch, ">" or die $!; chomp; print $file "delete refs/tags/$_\n" or die $!; $count++ < 100000 or complete_batch; @@ -41,4 +73,5 @@ perl -we ' #print STDERR "FOO\n"; STDIN->error and die $!; complete_batch(); + await_task while @tasks; '