summaryrefslogtreecommitdiffstats
path: root/os
diff options
context:
space:
mode:
authorYann Ylavic <ylavic@apache.org>2018-01-29 18:00:23 +0100
committerYann Ylavic <ylavic@apache.org>2018-01-29 18:00:23 +0100
commit7fa2267d94367c44ed663b4a88572ef8b81d9ee2 (patch)
tree51586233a12d9d544379da8a72ddad2ba0696f4d /os
parentRevert r1814112, it does not work for threaded MPMs. (diff)
downloadapache2-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.c15
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();