From b71f045b8b03f5add58603c1285aa7867d4c5547 Mon Sep 17 00:00:00 2001 From: Ian Jackson Date: Fri, 4 Nov 2016 14:21:54 +0000 Subject: [PATCH] check parallel --- check | 47 ++++++++++++++++++++++++++++++++++++++++------- 1 file changed, 40 insertions(+), 7 deletions(-) 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; ' -- 2.30.2