]> Sergey Matveev's repositories - public-inbox.git/commitdiff
qspawn: decode $? for user-friendliness
authorEric Wong <e@80x24.org>
Sun, 27 Jan 2019 03:30:30 +0000 (03:30 +0000)
committerEric Wong <e@80x24.org>
Sun, 27 Jan 2019 03:30:30 +0000 (03:30 +0000)
The raw value of $? isn't very useful, generally.

lib/PublicInbox/Qspawn.pm
t/qspawn.t

index 6859a8af31017d5d53d30a69475a48ae3fe06fcd..913fac817c9046d61651cf3846ab9e44fe652760 100644 (file)
@@ -30,13 +30,22 @@ sub _do_spawn {
        $cb->($self->{rpipe});
 }
 
+sub child_err ($) {
+       my ($child_error) = @_; # typically $?
+       my $exitstatus = ($child_error >> 8) or return;
+       my $sig = $child_error & 127;
+       my $msg = "exit status=$exitstatus";
+       $msg .= " signal=$sig" if $sig;
+       $msg;
+}
+
 sub finish ($) {
        my ($self) = @_;
        my $limiter = $self->{limiter};
        my $running;
        if (delete $self->{rpipe}) {
                my $pid = delete $self->{pid};
-               $self->{err} = $pid == waitpid($pid, 0) ? $? :
+               $self->{err} = $pid == waitpid($pid, 0) ? child_err($?) :
                                "PID:$pid still running?";
                $running = --$limiter->{running};
        }
index 745ec4d8134cf6c3662d2596fa6e9abf4bf29e04..ab6e37586fb14bc6ed57bc19da3f2c0474f9564c 100644 (file)
@@ -31,7 +31,7 @@ my $limiter = PublicInbox::Qspawn::Limiter->new(1);
                my ($rpipe) = @_;
                is(0, sysread($rpipe, my $buf, 1), 'read zero bytes from false');
                my $err = $x->finish;
-               is($err, 256, 'error on finish');
+               ok($err, 'error on finish');
                $run = 1;
        });
        is($run, 1, 'callback ran alright');