about summary refs log tree commit homepage
path: root/lib/PublicInbox/Qspawn.pm
diff options
context:
space:
mode:
authorEric Wong <e@80x24.org>2017-01-07 01:44:44 +0000
committerEric Wong <e@80x24.org>2017-01-07 01:45:39 +0000
commit3360a4deaef499211fa7dee368d07f0b26e49458 (patch)
tree4b7e70265df4ed1c219054939ff0cc086d575431 /lib/PublicInbox/Qspawn.pm
parentf62f27ddd89720215e929af4ead2f97b750664b6 (diff)
downloadpublic-inbox-3360a4deaef499211fa7dee368d07f0b26e49458.tar.gz
We may allow the {max} value of a limiter to be changed
in the future, so lets start accounting for it before we
spawn followup processes.
Diffstat (limited to 'lib/PublicInbox/Qspawn.pm')
-rw-r--r--lib/PublicInbox/Qspawn.pm11
1 files changed, 8 insertions, 3 deletions
diff --git a/lib/PublicInbox/Qspawn.pm b/lib/PublicInbox/Qspawn.pm
index 697c55a1..4950da25 100644
--- a/lib/PublicInbox/Qspawn.pm
+++ b/lib/PublicInbox/Qspawn.pm
@@ -31,14 +31,19 @@ sub _do_spawn {
 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) ? $? :
                                 "PID:$pid still running?";
-                $limiter->{running}--;
+                $running = --$limiter->{running};
         }
-        if (my $next = shift @{$limiter->{run_queue}}) {
-                _do_spawn(@$next);
+
+        # limiter->{max} may change dynamically
+        if (($running || $limiter->{running}) < $limiter->{max}) {
+                if (my $next = shift @{$limiter->{run_queue}}) {
+                        _do_spawn(@$next);
+                }
         }
         $self->{err};
 }