]> granicus.if.org Git - apache/commitdiff
Simplify the interface to ap_reclaim_child_processes() and
authorJeff Trawick <trawick@apache.org>
Wed, 30 Mar 2011 21:32:10 +0000 (21:32 +0000)
committerJeff Trawick <trawick@apache.org>
Wed, 30 Mar 2011 21:32:10 +0000 (21:32 +0000)
ap_relieve_child_processes(): instead of requiring the MPM
to implement an otherwise-useless hook, just use a callback
function.

As I don't expect third-party MPM devs are following our day
to day progress, the API changes are considered part of
yesterday's MMN change.

git-svn-id: https://svn.apache.org/repos/asf/httpd/httpd/trunk@1087085 13f79535-47bb-0310-9956-ffa450edef68

docs/manual/developer/new_api_2_4.xml
include/ap_mmn.h
include/mpm_common.h
server/mpm/event/event.c
server/mpm/prefork/prefork.c
server/mpm/worker/worker.c
server/mpm_common.c
server/mpm_unix.c

index 552bed19da06bbe8a8efd1e5404f17f12d9c8b35..3a7fe956a926365a103c5c051365e7d3cd2bb1d1 100644 (file)
       <li>REMOVES: accept, lockfile, lock_mech, set_scoreboard (locking uses the new ap_mutex API)</li>
       <li>NEW API to drop privileges (delegates this platform-dependent
           function to modules)</li>
-      <li>NEW Hooks: mpm_query, mpm_note_child_killed, timed_callback, and get_name</li>
+      <li>NEW Hooks: mpm_query, timed_callback, and get_name</li>
+      <li>CHANGED interfaces: monitor hook,
+      ap_reclaim_child_processes, ap_relieve_child_processes</li>
     </ul>
   </section>
 
index 3ea3e85d95c6c5cc97bb524433a55c27686c27b6..711f2cb74af601453359a9b4169d4c4609090580 100644 (file)
  *                         proxy and cache interfaces.
  *                         Change ap_configfile_t/ap_cfg_getline()/
  *                         ap_cfg_getc() API, add ap_pcfg_strerror()
+ *                         Axe mpm_note_child_killed hook, change
+ *                         ap_reclaim_child_process and ap_recover_child_process
+ *                         interfaces.
  */
 
 #define MODULE_MAGIC_COOKIE 0x41503234UL /* "AP24" */
index 3f66f793ea5dcea090a80f061d016fe260721351..c77d4664a5fbd42e83a858a194767f36937aa6f3 100644 (file)
@@ -80,35 +80,36 @@ extern "C" {
 /* Signal used to gracefully stop (as a quoted string) */
 #define AP_SIG_GRACEFUL_STOP_STRING "SIGWINCH"
 
+/**
+ * Callback function used for ap_reclaim_child_processes() and
+ * ap_relieve_child_processes().  The callback function will be
+ * called for each terminated child process.
+ */
+typedef void ap_reclaim_callback_fn_t(int childnum);
+
 /**
  * Make sure all child processes that have been spawned by the parent process
  * have died.  This includes process registered as "other_children".
  * @param terminate Either 1 or 0.  If 1, send the child processes SIGTERM
  *        each time through the loop.  If 0, give the process time to die
  *        on its own before signalling it.
- * @note This function requires that a hook is implemented by the MPM: <pre>
- *  mpm_note_child_killed -- Note the child died in the scoreboard
- * </pre>
  *
  * @note The MPM child processes which are reclaimed are those listed
  * in the scoreboard as well as those currently registered via
  * ap_register_extra_mpm_process().
  */
-void ap_reclaim_child_processes(int terminate);
+void ap_reclaim_child_processes(int terminate,
+                                ap_reclaim_callback_fn_t *mpm_callback);
 
 /**
  * Catch any child processes that have been spawned by the parent process
  * which have exited. This includes processes registered as "other_children".
  *
- * @note This function requires that a hook is implemented by the MPM: <pre>
- *  mpm_note_child_killed -- Note the child died in the scoreboard
- * </pre>
- *
  * @note The MPM child processes which are relieved are those listed
  * in the scoreboard as well as those currently registered via
  * ap_register_extra_mpm_process().
  */
-void ap_relieve_child_processes(void);
+void ap_relieve_child_processes(ap_reclaim_callback_fn_t *mpm_callback);
 
 /**
  * Tell ap_reclaim_child_processes() and ap_relieve_child_processes() about 
@@ -333,13 +334,6 @@ AP_DECLARE_HOOK(int, drop_privileges, (apr_pool_t * pchild, server_rec * s))
  */
 AP_DECLARE_HOOK(int, mpm_query, (int query_code, int *result, apr_status_t *rv))
 
-/* child specified by index has been killed; MPMs which use
- * ap_reclaim_child_processes() or ap_relieve_child_processes() must
- * implement this in order to update the scoreboard and handle any
- * MPM-specific actions
- */
-AP_DECLARE_HOOK(apr_status_t, mpm_note_child_killed, (int childnum))
-
 /* register the specified callback */
 AP_DECLARE_HOOK(apr_status_t, mpm_register_timed_callback,
                 (apr_time_t t, ap_mpm_callback_fn_t *cbfn, void *baton))
index 9d9231ce1c4eb452edfd729e1ac508faf0ca1207..6efd2f73e2a33123b5b65e524b3ce4c97e6df7d7 100644 (file)
@@ -424,10 +424,9 @@ static int event_query(int query_code, int *result, apr_status_t *rv)
     return OK;
 }
 
-static apr_status_t event_note_child_killed(int childnum)
+static void event_note_child_killed(int childnum)
 {
     ap_scoreboard_image->parent[childnum].pid = 0;
-    return APR_SUCCESS;
 }
 
 static const char *event_get_name(void)
@@ -2256,7 +2255,8 @@ static int event_run(apr_pool_t * _pconf, apr_pool_t * plog, server_rec * s)
          * Kill child processes, tell them to call child_exit, etc...
          */
         ap_event_pod_killpg(pod, ap_daemons_limit, FALSE);
-        ap_reclaim_child_processes(1);  /* Start with SIGTERM */
+        ap_reclaim_child_processes(1, /* Start with SIGTERM */
+                                   event_note_child_killed);
 
         if (!child_fatal) {
             /* cleanup pid file on normal shutdown */
@@ -2276,7 +2276,7 @@ static int event_run(apr_pool_t * _pconf, apr_pool_t * plog, server_rec * s)
         /* Close our listeners, and then ask our children to do same */
         ap_close_listeners();
         ap_event_pod_killpg(pod, ap_daemons_limit, TRUE);
-        ap_relieve_child_processes();
+        ap_relieve_child_processes(event_note_child_killed);
 
         if (!child_fatal) {
             /* cleanup pid file on normal shutdown */
@@ -2298,7 +2298,7 @@ static int event_run(apr_pool_t * _pconf, apr_pool_t * plog, server_rec * s)
             apr_sleep(apr_time_from_sec(1));
 
             /* Relieve any children which have now exited */
-            ap_relieve_child_processes();
+            ap_relieve_child_processes(event_note_child_killed);
 
             active_children = 0;
             for (index = 0; index < ap_daemons_limit; ++index) {
@@ -2316,7 +2316,7 @@ static int event_run(apr_pool_t * _pconf, apr_pool_t * plog, server_rec * s)
          * really dead.
          */
         ap_event_pod_killpg(pod, ap_daemons_limit, FALSE);
-        ap_reclaim_child_processes(1);
+        ap_reclaim_child_processes(1, event_note_child_killed);
 
         return DONE;
     }
@@ -2356,7 +2356,8 @@ static int event_run(apr_pool_t * _pconf, apr_pool_t * plog, server_rec * s)
          */
         ap_event_pod_killpg(pod, ap_daemons_limit, FALSE);
 
-        ap_reclaim_child_processes(1);  /* Start with SIGTERM */
+        ap_reclaim_child_processes(1,  /* Start with SIGTERM */
+                                   event_note_child_killed);
         ap_log_error(APLOG_MARK, APLOG_NOTICE, 0, ap_server_conf,
                      "SIGHUP received.  Attempting to restart");
     }
@@ -2720,7 +2721,6 @@ static void event_hooks(apr_pool_t * p)
     ap_hook_check_config(event_check_config, NULL, NULL, APR_HOOK_MIDDLE);
     ap_hook_mpm(event_run, NULL, NULL, APR_HOOK_MIDDLE);
     ap_hook_mpm_query(event_query, NULL, NULL, APR_HOOK_MIDDLE);
-    ap_hook_mpm_note_child_killed(event_note_child_killed, NULL, NULL, APR_HOOK_MIDDLE);
     ap_hook_mpm_register_timed_callback(event_register_timed_callback, NULL, NULL,
                                         APR_HOOK_MIDDLE);
     ap_hook_mpm_get_name(event_get_name, NULL, NULL, APR_HOOK_MIDDLE);
index 87545bfc8f0b058eb12f2b3a0bd3499aa8710cdc..86c8d8c15dd40bcc3beefee73593df420ad1b6fa 100644 (file)
@@ -306,10 +306,9 @@ static int prefork_query(int query_code, int *result, apr_status_t *rv)
     return OK;
 }
 
-static apr_status_t prefork_note_child_killed(int childnum)
+static void prefork_note_child_killed(int childnum)
 {
     ap_scoreboard_image->parent[childnum].pid = 0;
-    return APR_SUCCESS;
 }
 
 static const char *prefork_get_name(void)
@@ -1059,7 +1058,8 @@ static int prefork_run(apr_pool_t *_pconf, apr_pool_t *plog, server_rec *s)
         if (ap_unixd_killpg(getpgrp(), SIGTERM) < 0) {
             ap_log_error(APLOG_MARK, APLOG_WARNING, errno, ap_server_conf, "killpg SIGTERM");
         }
-        ap_reclaim_child_processes(1);          /* Start with SIGTERM */
+        ap_reclaim_child_processes(1, /* Start with SIGTERM */
+                                   prefork_note_child_killed);
 
         /* cleanup pid file on normal shutdown */
         ap_remove_pid(pconf, ap_pid_fname);
@@ -1093,7 +1093,7 @@ static int prefork_run(apr_pool_t *_pconf, apr_pool_t *plog, server_rec *s)
         }
 
         /* Allow each child which actually finished to exit */
-        ap_relieve_child_processes();
+        ap_relieve_child_processes(prefork_note_child_killed);
 
         /* cleanup pid file */
         ap_remove_pid(pconf, ap_pid_fname);
@@ -1112,7 +1112,7 @@ static int prefork_run(apr_pool_t *_pconf, apr_pool_t *plog, server_rec *s)
             sleep(1);
 
             /* Relieve any children which have now exited */
-            ap_relieve_child_processes();
+            ap_relieve_child_processes(prefork_note_child_killed);
 
             active_children = 0;
             for (index = 0; index < ap_daemons_limit; ++index) {
@@ -1180,7 +1180,8 @@ static int prefork_run(apr_pool_t *_pconf, apr_pool_t *plog, server_rec *s)
         if (ap_unixd_killpg(getpgrp(), SIGHUP) < 0) {
             ap_log_error(APLOG_MARK, APLOG_WARNING, errno, ap_server_conf, "killpg SIGHUP");
         }
-        ap_reclaim_child_processes(0);          /* Not when just starting up */
+        ap_reclaim_child_processes(0, /* Not when just starting up */
+                                   prefork_note_child_killed);
         ap_log_error(APLOG_MARK, APLOG_NOTICE, 0, ap_server_conf,
                     "SIGHUP received.  Attempting to restart");
     }
@@ -1415,7 +1416,6 @@ static void prefork_hooks(apr_pool_t *p)
     ap_hook_check_config(prefork_check_config, NULL, NULL, APR_HOOK_MIDDLE);
     ap_hook_mpm(prefork_run, NULL, NULL, APR_HOOK_MIDDLE);
     ap_hook_mpm_query(prefork_query, NULL, NULL, APR_HOOK_MIDDLE);
-    ap_hook_mpm_note_child_killed(prefork_note_child_killed, NULL, NULL, APR_HOOK_MIDDLE);
     ap_hook_mpm_get_name(prefork_get_name, NULL, NULL, APR_HOOK_MIDDLE);
 }
 
index de98b52ad150de333b65d022d404c68741e1139b..705451bd222b619446eaea19679ebd37342c68f4 100644 (file)
@@ -372,10 +372,9 @@ static int worker_query(int query_code, int *result, apr_status_t *rv)
     return OK;
 }
 
-static apr_status_t worker_note_child_killed(int childnum)
+static void worker_note_child_killed(int childnum)
 {
     ap_scoreboard_image->parent[childnum].pid = 0;
-    return APR_SUCCESS;
 }
 
 static const char *worker_get_name(void)
@@ -1774,7 +1773,8 @@ static int worker_run(apr_pool_t *_pconf, apr_pool_t *plog, server_rec *s)
          * Kill child processes, tell them to call child_exit, etc...
          */
         ap_worker_pod_killpg(pod, ap_daemons_limit, FALSE);
-        ap_reclaim_child_processes(1);                /* Start with SIGTERM */
+        ap_reclaim_child_processes(1, /* Start with SIGTERM */
+                                   worker_note_child_killed);
 
         if (!child_fatal) {
             /* cleanup pid file on normal shutdown */
@@ -1794,7 +1794,7 @@ static int worker_run(apr_pool_t *_pconf, apr_pool_t *plog, server_rec *s)
         /* Close our listeners, and then ask our children to do same */
         ap_close_listeners();
         ap_worker_pod_killpg(pod, ap_daemons_limit, TRUE);
-        ap_relieve_child_processes();
+        ap_relieve_child_processes(worker_note_child_killed);
 
         if (!child_fatal) {
             /* cleanup pid file on normal shutdown */
@@ -1816,7 +1816,7 @@ static int worker_run(apr_pool_t *_pconf, apr_pool_t *plog, server_rec *s)
             apr_sleep(apr_time_from_sec(1));
 
             /* Relieve any children which have now exited */
-            ap_relieve_child_processes();
+            ap_relieve_child_processes(worker_note_child_killed);
 
             active_children = 0;
             for (index = 0; index < ap_daemons_limit; ++index) {
@@ -1834,7 +1834,7 @@ static int worker_run(apr_pool_t *_pconf, apr_pool_t *plog, server_rec *s)
          * really dead.
          */
         ap_worker_pod_killpg(pod, ap_daemons_limit, FALSE);
-        ap_reclaim_child_processes(1);
+        ap_reclaim_child_processes(1, worker_note_child_killed);
 
         return DONE;
     }
@@ -1873,7 +1873,8 @@ static int worker_run(apr_pool_t *_pconf, apr_pool_t *plog, server_rec *s)
          */
         ap_worker_pod_killpg(pod, ap_daemons_limit, FALSE);
 
-        ap_reclaim_child_processes(1);                /* Start with SIGTERM */
+        ap_reclaim_child_processes(1, /* Start with SIGTERM */
+                                   worker_note_child_killed);
         ap_log_error(APLOG_MARK, APLOG_NOTICE, 0, ap_server_conf,
                     "SIGHUP received.  Attempting to restart");
     }
@@ -2227,7 +2228,6 @@ static void worker_hooks(apr_pool_t *p)
     ap_hook_check_config(worker_check_config, NULL, NULL, APR_HOOK_MIDDLE);
     ap_hook_mpm(worker_run, NULL, NULL, APR_HOOK_MIDDLE);
     ap_hook_mpm_query(worker_query, NULL, NULL, APR_HOOK_MIDDLE);
-    ap_hook_mpm_note_child_killed(worker_note_child_killed, NULL, NULL, APR_HOOK_MIDDLE);
     ap_hook_mpm_get_name(worker_get_name, NULL, NULL, APR_HOOK_MIDDLE);
 }
 
index 11e5af185f5bec0dcd49d0b24cb50914e3eae6ac..99240a0b6ae95cad89847bf60e0d60d7e70186d3 100644 (file)
@@ -65,7 +65,6 @@ APR_HOOK_STRUCT(
     APR_HOOK_LINK(drop_privileges)
     APR_HOOK_LINK(mpm)
     APR_HOOK_LINK(mpm_query)
-    APR_HOOK_LINK(mpm_note_child_killed)
     APR_HOOK_LINK(mpm_register_timed_callback)
     APR_HOOK_LINK(mpm_get_name)
 )
@@ -77,7 +76,6 @@ APR_HOOK_STRUCT(
     APR_HOOK_LINK(drop_privileges)
     APR_HOOK_LINK(mpm)
     APR_HOOK_LINK(mpm_query)
-    APR_HOOK_LINK(mpm_note_child_killed)
     APR_HOOK_LINK(mpm_register_timed_callback)
     APR_HOOK_LINK(mpm_get_name)
 )
@@ -93,9 +91,6 @@ AP_IMPLEMENT_HOOK_RUN_FIRST(int, mpm,
 AP_IMPLEMENT_HOOK_RUN_FIRST(int, mpm_query,
                             (int query_code, int *result, apr_status_t *_rv),
                             (query_code, result, _rv), DECLINED)
-AP_IMPLEMENT_HOOK_RUN_FIRST(apr_status_t, mpm_note_child_killed,
-                            (int childnum),
-                            (childnum), APR_ENOTIMPL)
 AP_IMPLEMENT_HOOK_RUN_FIRST(apr_status_t, mpm_register_timed_callback,
                             (apr_time_t t, ap_mpm_callback_fn_t *cbfn, void *baton),
                             (t, cbfn, baton), APR_ENOTIMPL)
index b89812342466f296c4288c8ce15a8206637bff40..32ad1f70a7df6d342fe92d15c49843c0435d53db 100644 (file)
@@ -165,7 +165,8 @@ static int reclaim_one_pid(pid_t pid, action_t action)
     return 0;
 }
 
-void ap_reclaim_child_processes(int terminate)
+void ap_reclaim_child_processes(int terminate,
+                                ap_reclaim_callback_fn_t *mpm_callback)
 {
     apr_time_t waittime = 1024 * 16;
     int i;
@@ -228,7 +229,7 @@ void ap_reclaim_child_processes(int terminate)
             }
 
             if (reclaim_one_pid(pid, action_table[cur_action].action)) {
-                ap_run_mpm_note_child_killed(i);
+                mpm_callback(i);
             }
             else {
                 ++not_dead_yet;
@@ -255,7 +256,7 @@ void ap_reclaim_child_processes(int terminate)
              action_table[cur_action].action != GIVEUP);
 }
 
-void ap_relieve_child_processes(void)
+void ap_relieve_child_processes(ap_reclaim_callback_fn_t *mpm_callback)
 {
     int i;
     extra_process_t *cur_extra;
@@ -273,7 +274,7 @@ void ap_relieve_child_processes(void)
         }
 
         if (reclaim_one_pid(pid, DO_NOTHING)) {
-            ap_run_mpm_note_child_killed(i);
+            mpm_callback(i);
         }
     }