1 # Copyright (C) 2016 all contributors <meta@public-inbox.org>
2 # License: AGPL-3.0+ <https://www.gnu.org/licenses/agpl-3.0.txt>
3 package PublicInbox::Qspawn;
6 use PublicInbox::Spawn qw(popen_rd);
12 my ($class, $cmd, $env, $opt) = @_;
13 bless { args => [ $cmd, $env, $opt ] }, $class;
19 ($self->{rpipe}, $self->{pid}) = popen_rd(@{$self->{args}});
25 $cb->($self->{rpipe});
30 if (delete $self->{rpipe}) {
31 my $pid = delete $self->{pid};
32 $self->{err} = $pid == waitpid($pid, 0) ? $? :
33 "PID:$pid still running?";
36 if (my $next = shift @run_queue) {
45 if ($running < $LIMIT) {
46 _do_spawn($self, $cb);
48 push @run_queue, [ $self, $cb ];