From aeeca6f809632755a87f82ab188612ce441c0b03 Mon Sep 17 00:00:00 2001 From: Yann Ylavic Date: Wed, 6 Jun 2018 10:53:16 +0000 Subject: [PATCH] Merge r1822537, r1830744 from trunk: mpm_unix(es): cleanup properly on exit in one_process mode. We can't destroy ap_pglobal in the MPMs because clean_child_exit() runs in a DSO which would be unloaded under us. So we defer an ap_terminate() with atexit() in ap_unixd_mpm_set_signals(), all this is static/builtin code in "os/unix/unixd.c". Follow up to r1822537: replace static variable with pool userdata. Also adds a comment and a CHANGES entry. Submitted by: ylavic Reviewed by: ylavic, jim, icing git-svn-id: https://svn.apache.org/repos/asf/httpd/httpd/branches/2.4.x@1833005 13f79535-47bb-0310-9956-ffa450edef68 --- CHANGES | 3 +++ os/unix/unixd.c | 18 ++++++++++++++++++ 2 files changed, 21 insertions(+) diff --git a/CHANGES b/CHANGES index 2aeebb1166..b9bbc876b9 100644 --- a/CHANGES +++ b/CHANGES @@ -1,6 +1,9 @@ -*- coding: utf-8 -*- Changes with Apache 2.4.34 + *) core: In ONE_PROCESS/debug mode, cleanup everything when exiting. + [Yann Ylavic] + *) mod_proxy_balancer: Add hot spare member type and corresponding flag (R). Hot spare members are used as drop-in replacements for unusable workers in the same load balancer set. This differs from hot standbys which are diff --git a/os/unix/unixd.c b/os/unix/unixd.c index 43645f09da..0245720aa0 100644 --- a/os/unix/unixd.c +++ b/os/unix/unixd.c @@ -18,6 +18,7 @@ #include "httpd.h" #include "http_config.h" #include "http_main.h" +#include "http_core.h" #include "http_log.h" #include "unixd.h" #include "mpm_common.h" @@ -509,6 +510,13 @@ static apr_status_t unset_signals(void *unused) return APR_SUCCESS; } +static void ap_terminate(void) +{ + ap_main_state = AP_SQ_MS_EXITING; + apr_pool_destroy(ap_pglobal); + apr_terminate(); +} + AP_DECLARE(void) ap_unixd_mpm_set_signals(apr_pool_t *pconf, int one_process) { #ifndef NO_USE_SIGACTION @@ -518,6 +526,16 @@ AP_DECLARE(void) ap_unixd_mpm_set_signals(apr_pool_t *pconf, int one_process) if (!one_process) { ap_fatal_signal_setup(ap_server_conf, pconf); } + else if (!ap_retained_data_get("ap_unixd_mpm_one_process_cleanup")) { + /* In one process mode (debug), httpd will exit immediately when asked + * to (SIGTERM/SIGINT) and never restart. We still want the cleanups to + * run though (such that e.g. temporary files/IPCs don't leak on the + * system), so the first time around we use atexit() to cleanup after + * ourselves. + */ + ap_retained_data_create("ap_unixd_mpm_one_process_cleanup", 1); + atexit(ap_terminate); + } /* Signals' handlers depend on retained data */ (void)ap_unixd_mpm_get_retained_data(); -- 2.40.0