chiark / gitweb /
check parallel
authorIan Jackson <ijackson@chiark.greenend.org.uk>
Fri, 4 Nov 2016 14:21:54 +0000 (14:21 +0000)
committerIan Jackson <ijackson@chiark.greenend.org.uk>
Fri, 4 Nov 2016 14:21:54 +0000 (14:21 +0000)
check

diff --git a/check b/check
index a7ae489..7293371 100755 (executable)
--- 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 <batch"
-                and die $? < 0 ? $! : $?;
-        }
+        return unless $file;
+
+       close $file or die $!;
+
+        print STDERR "check closing $batch ($count)\n";
+
+       await_task if @tasks >= $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;
 '