From: Stefan Fritsch Date: Mon, 21 Nov 2016 20:32:40 +0000 (+0000) Subject: ap_reclaim_child_processes(): Implement terminate immediately X-Git-Tag: 2.5.0-alpha~996 X-Git-Url: http://git.ipfire.org/?a=commitdiff_plain;h=7d6d92947b104cceaf6f721795c28443691b3093;p=thirdparty%2Fapache%2Fhttpd.git ap_reclaim_child_processes(): Implement terminate immediately The behavior for terminate == 1 was documented but not implemented. Do that now. git-svn-id: https://svn.apache.org/repos/asf/httpd/httpd/trunk@1770750 13f79535-47bb-0310-9956-ffa450edef68 --- diff --git a/include/mpm_common.h b/include/mpm_common.h index 30927ed196c..b366a08b12b 100644 --- a/include/mpm_common.h +++ b/include/mpm_common.h @@ -94,8 +94,7 @@ typedef void ap_reclaim_callback_fn_t(int childnum, pid_t pid, * Make sure all child processes that have been spawned by the parent process * have died. This includes process registered as "other_children". * - * @param terminate Not Implemented, value is ignored !!! - * Either 1 or 0. If 1, send the child processes SIGTERM + * @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. * @param mpm_callback Callback invoked for each dead child process diff --git a/server/mpm_unix.c b/server/mpm_unix.c index 140d4e8f684..cd3bc52d51f 100644 --- a/server/mpm_unix.c +++ b/server/mpm_unix.c @@ -63,7 +63,13 @@ #undef APLOG_MODULE_INDEX #define APLOG_MODULE_INDEX AP_CORE_MODULE_INDEX -typedef enum {DO_NOTHING, SEND_SIGTERM, SEND_SIGKILL, GIVEUP} action_t; +typedef enum { + DO_NOTHING, + SEND_SIGTERM, + SEND_SIGTERM_NOLOG, + SEND_SIGKILL, + GIVEUP +} action_t; typedef struct extra_process_t { struct extra_process_t *next; @@ -142,6 +148,8 @@ static int reclaim_one_pid(pid_t pid, action_t action) " still did not exit, " "sending a SIGTERM", pid); + /* FALLTHROUGH */ + case SEND_SIGTERM_NOLOG: kill(pid, SIGTERM); break; @@ -173,7 +181,6 @@ static int reclaim_one_pid(pid_t pid, action_t action) return 0; } -/* XXX The terminate argument is ignored. Implement or remove? */ AP_DECLARE(void) ap_reclaim_child_processes(int terminate, ap_reclaim_callback_fn_t *mpm_callback) { @@ -194,6 +201,7 @@ AP_DECLARE(void) ap_reclaim_child_processes(int terminate, * children but take no action against * stragglers */ + {SEND_SIGTERM_NOLOG, 0}, /* skipped if terminate == 0 */ {SEND_SIGTERM, apr_time_from_sec(3)}, {SEND_SIGTERM, apr_time_from_sec(5)}, {SEND_SIGTERM, apr_time_from_sec(7)}, @@ -203,19 +211,21 @@ AP_DECLARE(void) ap_reclaim_child_processes(int terminate, int cur_action; /* index of action we decided to take this * iteration */ - int next_action = 1; /* index of first real action */ + int next_action = terminate ? 1 : 2; /* index of first real action */ ap_mpm_query(AP_MPMQ_MAX_DAEMON_USED, &max_daemons); do { - apr_sleep(waittime); - /* don't let waittime get longer than 1 second; otherwise, we don't - * react quickly to the last child exiting, and taking action can - * be delayed - */ - waittime = waittime * 4; - if (waittime > apr_time_from_sec(1)) { - waittime = apr_time_from_sec(1); + if (action_table[next_action].action_time > 0) { + apr_sleep(waittime); + /* don't let waittime get longer than 1 second; otherwise, we don't + * react quickly to the last child exiting, and taking action can + * be delayed + */ + waittime = waittime * 4; + if (waittime > apr_time_from_sec(1)) { + waittime = apr_time_from_sec(1); + } } /* see what action to take, if any */