You are viewing a plain text version of this content. The canonical link for it is here.
Posted to cvs@httpd.apache.org by co...@apache.org on 2005/08/28 00:16:54 UTC

svn commit: r240466 - /httpd/httpd/trunk/server/mpm/prefork/prefork.c

Author: colm
Date: Sat Aug 27 15:16:46 2005
New Revision: 240466

URL: http://svn.apache.org/viewcvs?rev=240466&view=rev
Log:

Remove as many ghastly scoreboard loops from the graceful-shutdown code, and
replace with the new ap_relieve_child_processes() call. Add a sleep() call now,
as we lost the timeout inherent in ap_wait_or_timeout(). 1 second seems a sane
choice.


Modified:
    httpd/httpd/trunk/server/mpm/prefork/prefork.c

Modified: httpd/httpd/trunk/server/mpm/prefork/prefork.c
URL: http://svn.apache.org/viewcvs/httpd/httpd/trunk/server/mpm/prefork/prefork.c?rev=240466&r1=240465&r2=240466&view=diff
==============================================================================
--- httpd/httpd/trunk/server/mpm/prefork/prefork.c (original)
+++ httpd/httpd/trunk/server/mpm/prefork/prefork.c Sat Aug 27 15:16:46 2005
@@ -1117,10 +1117,6 @@
          * all done to exit.
          */
         int active_children;
-        apr_exit_why_e exitwhy;
-        int status;
-        int child_slot;
-        apr_proc_t pid;
         apr_time_t cutoff = 0;
 
         /* Stop listening */
@@ -1133,25 +1129,14 @@
         active_children = 0;
         for (index = 0; index < ap_daemons_limit; ++index) {
             if (ap_scoreboard_image->servers[index][0].status != SERVER_DEAD) {
-                ap_scoreboard_image->servers[index][0].status = SERVER_GRACEFUL;
                 /* Ask each child to close its listeners. */
-                kill(ap_scoreboard_image->parent[index].pid, AP_SIG_GRACEFUL);
+                kill(MPM_CHILD_PID(index), AP_SIG_GRACEFUL);
                 active_children++;
             }
         }
 
         /* Allow each child which actually finished to exit */
-        for (; active_children; active_children--) {
-            ap_wait_or_timeout(&exitwhy, &status, &pid, pconf);
-            
-            if (pid.pid != -1) {
-                child_slot = find_child_by_pid(&pid);
-                if (child_slot >= 0) {
-                    (void) ap_update_child_status_from_indexes(child_slot, 0, 
-                                            SERVER_DEAD, (request_rec *) NULL);
-                }
-            }
-        }
+        ap_relieve_child_processes();
 
         /* cleanup pid file */
         {
@@ -1175,24 +1160,18 @@
         /* Don't really exit until each child has finished */
         shutdown_pending = 0;
         do {
+            /* Pause for a second */
+            sleep(1);
+                
+            /* Relieve any children which have now exited */
+            ap_relieve_child_processes();
+            
             active_children = 0;
             for (index = 0; index < ap_daemons_limit; ++index) {
-                if (ap_scoreboard_image->servers[index][0].status != SERVER_DEAD) {
-                    if (kill(ap_scoreboard_image->parent[index].pid, 0) == 0) {
-                        active_children++;
-                    }
-                }
-            }
-
-            for (index = 0; index < active_children; ++index) {
-                /* Gather any now finished children */
-                ap_wait_or_timeout(&exitwhy, &status, &pid, pconf);
-
-                if (pid.pid != -1) {
-                    child_slot = find_child_by_pid(&pid);
-                    if (child_slot >= 0) {
-                        (void) ap_update_child_status_from_indexes(child_slot, 
-                                         0, SERVER_DEAD, (request_rec *) NULL);
+                if (MPM_CHILD_PID(index) != 0) {
+                    if (kill(MPM_CHILD_PID(index), 0) == 0) {
+                            active_children = 1;
+                            /* Having just one child is enough to stay around */
                     }
                 }
             }