From: Jeff Trawick Date: Wed, 30 Mar 2011 21:32:10 +0000 (+0000) Subject: Simplify the interface to ap_reclaim_child_processes() and X-Git-Tag: 2.3.12~130 X-Git-Url: http://git.ipfire.org/cgi-bin/gitweb.cgi?a=commitdiff_plain;h=3c0476fe509b3d8bc4839a266f5de9138c73acda;p=thirdparty%2Fapache%2Fhttpd.git Simplify the interface to ap_reclaim_child_processes() and 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 --- diff --git a/docs/manual/developer/new_api_2_4.xml b/docs/manual/developer/new_api_2_4.xml index 552bed19da0..3a7fe956a92 100644 --- a/docs/manual/developer/new_api_2_4.xml +++ b/docs/manual/developer/new_api_2_4.xml @@ -222,7 +222,9 @@
  • REMOVES: accept, lockfile, lock_mech, set_scoreboard (locking uses the new ap_mutex API)
  • NEW API to drop privileges (delegates this platform-dependent function to modules)
  • -
  • NEW Hooks: mpm_query, mpm_note_child_killed, timed_callback, and get_name
  • +
  • NEW Hooks: mpm_query, timed_callback, and get_name
  • +
  • CHANGED interfaces: monitor hook, + ap_reclaim_child_processes, ap_relieve_child_processes
  • diff --git a/include/ap_mmn.h b/include/ap_mmn.h index 3ea3e85d95c..711f2cb74af 100644 --- a/include/ap_mmn.h +++ b/include/ap_mmn.h @@ -313,6 +313,9 @@ * 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" */ diff --git a/include/mpm_common.h b/include/mpm_common.h index 3f66f793ea5..c77d4664a5f 100644 --- a/include/mpm_common.h +++ b/include/mpm_common.h @@ -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:
    - *  mpm_note_child_killed -- Note the child died in the scoreboard
    - * 
    * * @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:
    - *  mpm_note_child_killed -- Note the child died in the scoreboard
    - * 
    - * * @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)) diff --git a/server/mpm/event/event.c b/server/mpm/event/event.c index 9d9231ce1c4..6efd2f73e2a 100644 --- a/server/mpm/event/event.c +++ b/server/mpm/event/event.c @@ -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); diff --git a/server/mpm/prefork/prefork.c b/server/mpm/prefork/prefork.c index 87545bfc8f0..86c8d8c15dd 100644 --- a/server/mpm/prefork/prefork.c +++ b/server/mpm/prefork/prefork.c @@ -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); } diff --git a/server/mpm/worker/worker.c b/server/mpm/worker/worker.c index de98b52ad15..705451bd222 100644 --- a/server/mpm/worker/worker.c +++ b/server/mpm/worker/worker.c @@ -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); } diff --git a/server/mpm_common.c b/server/mpm_common.c index 11e5af185f5..99240a0b6ae 100644 --- a/server/mpm_common.c +++ b/server/mpm_common.c @@ -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) diff --git a/server/mpm_unix.c b/server/mpm_unix.c index b8981234246..32ad1f70a7d 100644 --- a/server/mpm_unix.c +++ b/server/mpm_unix.c @@ -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); } }