On Thu, Mar 15, 2018 at 3:20 PM, Rainer Jung <rainer.j...@kippdata.de> wrote:
>
> For the sake of completeness, here are the full trace8 (failed) startup logs
> for this reproduction scenario:

Thanks Rainer!

Could you (or Steffen, or Lucas) try the attached patch? It's based on
2.4.x, but should work for trunk too..


Regards,
Yann.
Index: modules/slotmem/mod_slotmem_shm.c
===================================================================
--- modules/slotmem/mod_slotmem_shm.c	(revision 1826753)
+++ modules/slotmem/mod_slotmem_shm.c	(working copy)
@@ -274,11 +274,25 @@ static apr_status_t restore_slotmem(sharedslotdesc
     return rv;
 }
 
+static APR_INLINE int is_child_process(void)
+{
+#ifdef WIN32
+    return getenv("AP_PARENT_PID") != NULL;
+#else
+    return 0;
+#endif
+}
+
 static apr_status_t cleanup_slotmem(void *is_startup)
 {
     int is_exiting = (ap_state_query(AP_SQ_MAIN_STATE) == AP_SQ_MS_EXITING);
     ap_slotmem_instance_t *mem;
 
+    if (is_child_process()) {
+        *retained_globallistmem = globallistmem = NULL;
+        return APR_SUCCESS;
+    }
+
     /* When in startup/pre-config's cleanup, the retained data and global pool
      * are not used yet, but the SHMs contents were untouched hence they don't
      * need to be persisted, simply unlink them.
@@ -439,8 +453,13 @@ static apr_status_t slotmem_create(ap_slotmem_inst
 
     {
         if (fbased) {
-            apr_shm_remove(fname, pool);
-            rv = apr_shm_create(&shm, size, fname, gpool);
+            if (is_child_process()) {
+                rv = apr_shm_attach(&shm, fname, gpool);
+            }
+            else {
+                apr_shm_remove(fname, pool);
+                rv = apr_shm_create(&shm, size, fname, gpool);
+            }
         }
         else {
             rv = apr_shm_create(&shm, size, NULL, pool);
@@ -447,9 +466,9 @@ static apr_status_t slotmem_create(ap_slotmem_inst
         }
         ap_log_error(APLOG_MARK, rv == APR_SUCCESS ? APLOG_DEBUG : APLOG_ERR,
                      rv, ap_server_conf, APLOGNO(02611)
-                     "create: apr_shm_create(%s) %s",
-                     fname ? fname : "",
-                     rv == APR_SUCCESS ? "succeeded" : "failed");
+                     "create: apr_shm_%s(%s) %s",
+                     fbased && is_child_process() ? "attach" : "create",
+                     fname, rv == APR_SUCCESS ? "succeeded" : "failed");
         if (rv != APR_SUCCESS) {
             return rv;
         }
@@ -811,7 +830,10 @@ static int pre_config(apr_pool_t *pconf, apr_pool_
     }
     globallistmem = *retained_globallistmem;
 
-    if (ap_state_query(AP_SQ_MAIN_STATE) != AP_SQ_MS_CREATE_PRE_CONFIG) {
+    if (is_child_process()) {
+        gpool = pconf;
+    }
+    else if (ap_state_query(AP_SQ_MAIN_STATE) != AP_SQ_MS_CREATE_PRE_CONFIG) {
         gpool = ap_pglobal;
     }
     else {

Reply via email to