--- srclib/apr/memory/unix/apr_pools.c~	Sat Aug 25 21:58:05 2001
+++ srclib/apr/memory/unix/apr_pools.c	Sat Aug 25 22:23:16 2001
@@ -157,6 +157,7 @@
     apr_pool_t           *child;
     apr_pool_t           *sibling;
     apr_pool_t          **ref;
+    apr_lock_t           *lock;
     cleanup_t            *cleanups;
     struct process_chain *subprocesses;
     apr_abortfunc_t       abort_fn;
@@ -296,12 +297,17 @@
     char *endp;
 
     size = ALIGN_DEFAULT(size);
-    active = pool->mactive;
 
+    LOCK(pool->lock)
+    
+    active = pool->mactive;
     endp = active->first_avail + size;
     if (endp < active->endp) {
         mem = active->first_avail;
         active->first_avail = endp;
+
+        UNLOCK(pool->lock)
+        
         return mem;
     }
 
@@ -316,6 +322,8 @@
         if (pool->abort_fn)
             pool->abort_fn(APR_ENOMEM);
 
+        UNLOCK(pool->lock)
+
         return NULL;
     }
 
@@ -324,6 +332,8 @@
     mem = node->first_avail;
     node->first_avail += size;
 
+    UNLOCK(pool->lock)
+
     return mem;
 }
 
@@ -334,12 +344,17 @@
     char *endp;
 
     size = ALIGN_DEFAULT(size);
-    active = pool->mactive;
 
+    LOCK(pool->lock)
+    
+    active = pool->mactive;
     endp = active->first_avail + size;
     if (endp < active->endp) {
         mem = active->first_avail;
         active->first_avail = endp;
+
+        UNLOCK(pool->lock)
+        
         memset(mem, 0, size);
         return mem;
     }
@@ -355,6 +370,8 @@
         if (pool->abort_fn)
             pool->abort_fn(APR_ENOMEM);
 
+        UNLOCK(pool->lock)
+        
         return NULL;
     }
 
@@ -362,8 +379,10 @@
 
     mem = node->first_avail;
     node->first_avail += size;
+    
+    UNLOCK(pool->lock)
+        
     memset(mem, 0, size);
-
     return mem;
 }
 
@@ -435,7 +454,8 @@
      * Remove the pool from the parents child list
      */
     if (pool->parent) {
-        lock = pool->parent->allocator->lock;
+        if ((lock = pool->parent->lock) == NULL)
+            lock = pool->parent->allocator->lock;
 
         LOCK(lock)
 
@@ -543,6 +563,7 @@
         node->endp = (char *)pool + MIN_ALLOC;
         node->next = NULL;
         pool->allocator = allocator;
+        pool->lock = NULL;
         pool->mactive = pool->self = node;
         pool->abort_fn = abort_fn;
         pool->child = NULL;
@@ -562,9 +583,21 @@
             }
         }
 
+        if ((flags & POOL_FSHARED) == POOL_FSHARED) {
+            if ((rv = apr_lock_create(&pool->lock, 
+                                      APR_MUTEX, APR_INTRAPROCESS,
+                                      NULL, pool)) != APR_SUCCESS) {
+                if (allocator->lock)
+                    apr_lock_destroy(allocator->lock);
+
+                free(pool);
+                return rv;
+            }
+        }
 
         if ((pool->parent = parent) != NULL) {
-            lock = parent->allocator->lock;
+            if ((lock = pool->parent->lock) == NULL)
+                lock = parent->allocator->lock;
             
             LOCK(lock)
 
@@ -613,8 +646,20 @@
     pool->tag = NULL;
 #endif
     
+    if ((flags & POOL_FSHARED) == POOL_FSHARED) {
+        if ((rv = apr_lock_create(&pool->lock, 
+                                  APR_MUTEX, APR_INTRAPROCESS,
+                                  NULL, pool)) != APR_SUCCESS) {
+            free(pool);
+            return rv;
+        }
+    }
+        
     if ((pool->parent = parent) != NULL) {
-        LOCK(allocator->lock)
+        if ((lock = pool->parent->lock) == NULL)
+            lock = allocator->lock;
+
+        LOCK(lock)
 
         if ((pool->sibling = parent->child) != NULL)
             pool->sibling->ref = &pool->sibling;
@@ -622,7 +667,7 @@
         parent->child = pool;
         pool->ref = &parent->child;
 
-        UNLOCK(allocator->lock)
+        UNLOCK(lock)
     }
     else {
         pool->sibling = NULL;
@@ -952,6 +997,8 @@
     apr_size_t size;
     node_t *active;
 
+    LOCK(pool->lock)
+    
     ps.node = active = pool->mactive;
     ps.allocator = pool->allocator;
     ps.vbuff.curpos  = ps.node->first_avail;
@@ -964,6 +1011,8 @@
         if (pool->abort_fn)
             pool->abort_fn(APR_ENOMEM);
 
+        UNLOCK(pool->lock)
+        
         return NULL;
     }
 
@@ -981,9 +1030,11 @@
     if (ps.got_a_new_block)
         active->next = pool->mactive = ps.node;
 
+    UNLOCK(pool->lock)
+    
     if (ps.free)
         node_free(ps.allocator, ps.free);
-
+    
     return strp;
 }
 
