diff options
author | Eric Wong <e@80x24.org> | 2020-12-31 13:51:49 +0000 |
---|---|---|
committer | Eric Wong <e@80x24.org> | 2021-01-01 05:00:40 +0000 |
commit | d59a9cb667f106b29363795539b55116077bcd80 (patch) | |
tree | 759a3964b8f74a5a6a99c6c2545f467e465813e8 /lib/PublicInbox/ProcessPipe.pm | |
parent | 2b5d41f3a1b55ae513e9d5510d830074234fda37 (diff) | |
download | public-inbox-d59a9cb667f106b29363795539b55116077bcd80.tar.gz |
This simplifies our code and provides a more consistent API for error handling. PublicInbox::DS can be loaded nowadays on all *BSDs and Linux distros easily without extra packages to install. The downside is possibly increased startup time, but it's probably not as a big problem with lei being a daemon (and -mda possibly following suite).
Diffstat (limited to 'lib/PublicInbox/ProcessPipe.pm')
-rw-r--r-- | lib/PublicInbox/ProcessPipe.pm | 17 |
1 files changed, 10 insertions, 7 deletions
diff --git a/lib/PublicInbox/ProcessPipe.pm b/lib/PublicInbox/ProcessPipe.pm index c9234f42..afbb048d 100644 --- a/lib/PublicInbox/ProcessPipe.pm +++ b/lib/PublicInbox/ProcessPipe.pm @@ -5,6 +5,7 @@ package PublicInbox::ProcessPipe; use strict; use v5.10.1; +use PublicInbox::DS qw(dwaitpid); sub TIEHANDLE { my ($class, $pid, $fh, $cb, $arg) = @_; @@ -25,19 +26,21 @@ sub PRINT { print { $self->{fh} } @_; } +sub adjust_ret { # dwaitpid callback + my ($retref, $pid) = @_; + $$retref = '' if $? +} + sub CLOSE { my $fh = delete($_[0]->{fh}); my $ret = defined $fh ? close($fh) : ''; my ($pid, $cb, $arg) = delete @{$_[0]}{qw(pid cb arg)}; if (defined $pid) { - # PublicInbox::DS may not be loaded - eval { PublicInbox::DS::dwaitpid($pid, $cb, $arg) }; - - if ($@) { # ok, not in the event loop, work synchronously - waitpid($pid, 0); - $ret = '' if $?; - $cb->($arg, $pid) if $cb; + unless ($cb) { + $cb = \&adjust_ret; + $arg = \$ret; } + dwaitpid $pid, $cb, $arg; } $ret; } |