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;
#print STDERR "FOO\n";
STDIN->error and die $!;
complete_batch();
+ await_task while @tasks;
'