1 # Copyright (C) 2016-2020 all contributors <meta@public-inbox.org>
2 # License: AGPL-3.0+ <https://www.gnu.org/licenses/agpl-3.0.txt>
4 # a tied handle for auto reaping of children tied to a pipe, see perltie(1)
5 package PublicInbox::ProcessPipe;
10 my ($class, $pid, $fh, $cb, $arg) = @_;
11 bless { pid => $pid, fh => $fh, cb => $cb, arg => $arg }, $class;
14 sub READ { read($_[0]->{fh}, $_[1], $_[2], $_[3] || 0) }
16 sub READLINE { readline($_[0]->{fh}) }
20 syswrite($_[0]->{fh}, $_[1], $_[2] // length($_[1]), $_[3] // 0);
25 print { $self->{fh} } @_;
29 my $fh = delete($_[0]->{fh});
30 my $ret = defined $fh ? close($fh) : '';
31 my ($pid, $cb, $arg) = delete @{$_[0]}{qw(pid cb arg)};
33 # PublicInbox::DS may not be loaded
34 eval { PublicInbox::DS::dwaitpid($pid, $cb, $arg) };
36 if ($@) { # ok, not in the event loop, work synchronously
39 $cb->($arg, $pid) if $cb;
45 sub FILENO { fileno($_[0]->{fh}) }
52 sub pid { $_[0]->{pid} }