--- src/main/http_main.c  1999/04/13 10:19:08     1.22
+++ src/main/http_main.c  1999/06/24 09:36:46
@@ -4661,12 +4661,16 @@
 #endif /* TPF */

 #ifdef EAPI
-    ap_init_alloc_shared();
+    ap_init_alloc_shared(TRUE);
 #endif

     ap_suexec_enabled = init_suexec();
     server_conf = ap_read_config(pconf, ptrans, ap_server_confname);

+#ifdef EAPI
+    ap_init_alloc_shared(FALSE);
+#endif
+
     if (configtestonly) {
         fprintf(stderr, "Syntax OK\n");
         exit(0);
@@ -6045,7 +6049,7 @@
     }

 #ifdef EAPI
-    ap_init_alloc_shared();
+    ap_init_alloc_shared(TRUE);
 #endif

     if (!child && run_as_service) {
@@ -6053,6 +6057,10 @@
     }

     server_conf = ap_read_config(pconf, ptrans, ap_server_confname);
+
+#ifdef EAPI
+    ap_init_alloc_shared(FALSE);
+#endif

     if (configtestonly) {
         fprintf(stderr, "Syntax OK\n");
--- src/include/alloc.h   1999/04/13 10:18:27     1.2
+++ src/include/alloc.h   1999/06/24 09:34:27
@@ -96,7 +96,7 @@
 #if defined(EAPI)
 typedef enum { AP_POOL_RD, AP_POOL_RW } ap_pool_lock_mode;
 int ap_shared_pool_possible(void);
-void ap_init_alloc_shared(void);
+void ap_init_alloc_shared(int);
 API_EXPORT(pool *) ap_make_shared_sub_pool(pool *);
 API_EXPORT(int) ap_acquire_pool(pool *, ap_pool_lock_mode);
 API_EXPORT(int) ap_release_pool(pool *);
--- src/main/alloc.c.orig	Fri Jun 25 17:29:59 1999
+++ src/main/alloc.c	Fri Jun 25 17:34:18 1999
@@ -65,6 +65,9 @@
 #include "httpd.h"
 #ifdef EAPI
 #include "http_config.h"
+#if defined(EAPI_MM)
+#include "http_conf_globals.h"
+#endif
 #endif
 #include "multithread.h"
 #include "http_log.h"
@@ -553,20 +556,31 @@
 }
 
 #if defined(EAPI)
-void ap_init_alloc_shared(void)
+void ap_init_alloc_shared(int early)
 {
 #if defined(EAPI_MM)
     int mm_size;
     char *mm_path;
 
-    mm_size = ap_mm_maxsize();
-    if (mm_size > EAPI_MM_CORE_MAXSIZE)
-        mm_size = EAPI_MM_CORE_MAXSIZE;
-    mm_path = ap_server_root_relative(permanent_pool, EAPI_MM_CORE_PATH);
-    if ((mm = ap_mm_create(mm_size, mm_path)) == NULL) {
-        fprintf(stderr, "Ouch! ap_mm_create() failed\n");
-        abort();
-        exit(1);
+    if (early) {
+        /* process very early on startup */
+        mm_size = ap_mm_maxsize();
+        if (mm_size > EAPI_MM_CORE_MAXSIZE)
+            mm_size = EAPI_MM_CORE_MAXSIZE;
+        mm_path = ap_server_root_relative(permanent_pool, EAPI_MM_CORE_PATH);
+        if ((mm = ap_mm_create(mm_size, mm_path)) == NULL) {
+            fprintf(stderr, "Ouch! ap_mm_create() failed\n");
+            abort();
+            exit(1);
+        }
+    }
+    else {
+        /* process a lot later on startup */
+#ifdef WIN32
+        ap_mm_permission(mm, (_S_IREAD|_S_IWRITE), ap_user_id, -1);
+#else
+        ap_mm_permission(mm, (S_IRUSR|S_IWUSR), ap_user_id, -1);
+#endif
     }
 #endif /* EAPI_MM */
     return; 
