]> granicus.if.org Git - apache/commitdiff
mpm_unix(es): cleanup properly on exit in one_process mode.
authorYann Ylavic <ylavic@apache.org>
Mon, 29 Jan 2018 17:00:23 +0000 (17:00 +0000)
committerYann Ylavic <ylavic@apache.org>
Mon, 29 Jan 2018 17:00:23 +0000 (17:00 +0000)
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

os/unix/unixd.c

index b939355289504067e7c48dd2f471d6b844910182..196f67bace88c1651d562223602217a56573f413 100644 (file)
@@ -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();