- my $tmp = $WaitPids;
- $WaitPids = [];
- $reap_timer = undef;
- foreach my $ary (@$tmp) {
- my ($pid, $cb, $arg) = @$ary;
- my $ret = waitpid($pid, WNOHANG);
- if ($ret == 0) {
- push @$WaitPids, $ary;
- } elsif ($cb) {
- eval { $cb->($arg, $pid) };
- }
- }
- if (@$WaitPids) {
- # we may not be donea, and we may miss our
- $reap_timer = add_timer(1, \&reap_pids);
- }
+ $reap_armed = undef;
+ my $tmp = $wait_pids or return;
+ $wait_pids = undef;
+ $Stack{reap_runq} = $tmp;
+ my $oldset = block_signals();
+ foreach my $ary (@$tmp) {
+ my ($pid, $cb, $arg) = @$ary;
+ my $ret = waitpid($pid, WNOHANG);
+ if ($ret == 0) {
+ push @$wait_pids, $ary; # autovivifies @$wait_pids
+ } elsif ($ret == $pid) {
+ if ($cb) {
+ eval { $cb->($arg, $pid) };
+ warn "E: dwaitpid($pid) in_loop: $@" if $@;
+ }
+ } else {
+ warn "waitpid($pid, WNOHANG) = $ret, \$!=$!, \$?=$?";
+ }
+ }
+ sig_setmask($oldset);
+ delete $Stack{reap_runq};