diff options
author | Yann Ylavic <ylavic@apache.org> | 2018-01-29 18:00:23 +0100 |
---|---|---|
committer | Yann Ylavic <ylavic@apache.org> | 2018-01-29 18:00:23 +0100 |
commit | 7fa2267d94367c44ed663b4a88572ef8b81d9ee2 (patch) | |
tree | 51586233a12d9d544379da8a72ddad2ba0696f4d /os | |
parent | Revert r1814112, it does not work for threaded MPMs. (diff) | |
download | apache2-7fa2267d94367c44ed663b4a88572ef8b81d9ee2.tar.xz apache2-7fa2267d94367c44ed663b4a88572ef8b81d9ee2.zip |
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".
git-svn-id: https://svn.apache.org/repos/asf/httpd/httpd/trunk@1822537 13f79535-47bb-0310-9956-ffa450edef68
Diffstat (limited to 'os')
-rw-r--r-- | os/unix/unixd.c | 15 |
1 files changed, 15 insertions, 0 deletions
diff --git a/os/unix/unixd.c b/os/unix/unixd.c index b939355289..196f67bace 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" @@ -515,6 +516,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 @@ -524,6 +532,13 @@ 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 { + static int once = 0; + if (!once) { + atexit(ap_terminate); + once = 1; + } + } /* Signals' handlers depend on retained data */ (void)ap_unixd_mpm_get_retained_data(); |