From: Joey Hess Date: Sat, 20 Oct 2007 21:29:11 +0000 (-0400) Subject: -j bugfixes X-Git-Url: https://git.madduck.net/code/myrepos.git/commitdiff_plain/aa94649cdf0bdacde907604e031f73a92447a036 -j bugfixes No need to explicitly wait for processes, closing the filehandle to the child does that. --- diff --git a/mr b/mr index 9a33d40..1b66d82 100755 --- a/mr +++ b/mr @@ -569,15 +569,14 @@ sub action { #{{{ } #}}} # run actions on multiple repos, in parallel -my %jobs; sub mrs { #{{{ $| = 1; + my @active; my @fhs; my @out; my $running=0; while (@fhs or @repos) { while ($running < $jobs && @repos) { - $SIG{CHLD}='DEFAULT'; $running++; my $repo = shift @repos; my $pid = open(my $fh, "-|"); @@ -585,11 +584,9 @@ sub mrs { #{{{ open(STDERR, ">&STDOUT"); exit action($action, @$repo); } - $jobs{$pid}=$repo; + push @active, $repo; push @fhs, $fh; push @out, ""; - $SIG{CHLD}=\&reaper; - reaper(); } my ($rin, $rout) = ('','', ''); my $nfound; @@ -605,6 +602,7 @@ sub mrs { #{{{ my $r = ''; if (sysread($fh, $r, 1024) == 0) { close($fh); + record($active[$i], $? >> 8); $fhs[$i] = undef; $running--; print $out[$i]; @@ -614,18 +612,13 @@ sub mrs { #{{{ } } while (@fhs and !defined $fhs[0]) { + shift @active; shift @fhs; shift @out; } } } #}}} -sub reaper { #{{{ - while ((my $pid = waitpid(-1, &WNOHANG)) > 0) { - record($jobs{$pid}, $? >> 8) if exists $jobs{$pid}; - } -} #}}} - sub record { #{{{ my $dir=shift()->[0]; my $ret=shift;