]> git.wh0rd.org Git - tt-rss.git/commitdiff
update_daemon2: keep track of children PIDs
authorAndrew Dolgov <fox@madoka.spb.ru>
Thu, 24 Jan 2008 08:43:22 +0000 (09:43 +0100)
committerAndrew Dolgov <fox@madoka.spb.ru>
Thu, 24 Jan 2008 08:43:22 +0000 (09:43 +0100)
update_daemon2.php

index 5ce189863ec78738ff8b22c30849fc6ddebc1661..7e06cf9a9b64bc775fc182a34a3b3cab84bb781a 100644 (file)
@@ -38,7 +38,8 @@
 
        error_reporting(DEFAULT_ERROR_LEVEL);
 
-       $running_jobs = 0;
+       $children = array();
+
        $last_checkpoint = -1;
 
        function sigalrm_handler() {
        }
 
        function sigchld_handler($signal) {
-               global $running_jobs;
-               if ($running_jobs > 0) $running_jobs--;
-               print posix_getpid() . ": SIGCHLD received, jobs left: $running_jobs\n";
+               global $children;
+
+               $tmp = array();
+
+               foreach ($children as $pid) {
+                       if (pcntl_waitpid($pid, $status, WNOHANG) != $pid) {
+                               array_push($tmp, $pid);
+                       } else {
+                               _debug("[SIGCHLD] child $pid reaped.");
+                       }
+               }
+
+               $children = $tmp;
+
+               $running_jobs = count($children);
+
+               _debug("[SIGCHLD] jobs left: $running_jobs");
                pcntl_waitpid(-1, $status, WNOHANG);
        }
 
                $next_spawn = $last_checkpoint + SPAWN_INTERVAL - time();
 
                if ($next_spawn % 10 == 0) {
-                       print "[MASTER] active jobs: $running_jobs, next spawn at $next_spawn sec\n";
+                       $running_jobs = count($children);
+                       _debug("[MASTER] active jobs: $running_jobs, next spawn at $next_spawn sec.");
                }
 
                if ($last_checkpoint + SPAWN_INTERVAL < time()) {
 
-                       for ($j = $running_jobs; $j < MAX_JOBS; $j++) {
-                               print "[MASTER] spawning client $j...";
+                       for ($j = count($children); $j < MAX_JOBS; $j++) {
                                $pid = pcntl_fork();
                                if ($pid == -1) {
                                        die("fork failed!\n");
                                } else if ($pid) {
-                                       $running_jobs++;
-                                       print "OK [$running_jobs]\n";
+                                       _debug("[MASTER] spawned client $j [PID:$pid]...");
+                                       array_push($children, $pid);
                                } else {
                                        pcntl_signal(SIGCHLD, SIG_IGN);
                                        pcntl_signal(SIGINT, SIG_DFL);