Only in apr-sms/memory/unix: apr_sms_pool.c
diff -ru apr/memory/unix/apr_sms_tracking.c apr-sms/memory/unix/apr_sms_tracking.c
--- apr/memory/unix/apr_sms_tracking.c	Sun Jun 10 20:22:03 2001
+++ apr-sms/memory/unix/apr_sms_tracking.c	Sun Jun 10 21:59:41 2001
@@ -66,7 +66,6 @@
 #include "apr_sms.h"
 #include "apr_sms_tracking.h"
 #include "apr_lock.h"
-#include <stdlib.h>
 
 static const char *module_identity = "TRACKING";
 
@@ -100,7 +99,9 @@
         return NULL;
 
     tms = (apr_sms_tracking_t *)sms;
-    apr_lock_acquire(tms->lock);
+
+    if (tms->lock)
+        apr_lock_acquire(tms->lock);
 
     node->next = tms->nodes;
     tms->nodes = node;
@@ -108,7 +109,8 @@
     if (node->next)
         node->next->ref = &node->next;
 
-    apr_lock_release(tms->lock);
+    if (tms->lock)
+        apr_lock_release(tms->lock);
 
     node++;
 
@@ -127,7 +129,9 @@
         return NULL;
 
     tms = (apr_sms_tracking_t *)sms;
-    apr_lock_acquire(tms->lock);
+
+    if (tms->lock)
+        apr_lock_acquire(tms->lock);
 
     node->next = tms->nodes;
     tms->nodes = node;
@@ -135,7 +139,8 @@
     if (node->next)
         node->next->ref = &node->next;
 
-    apr_lock_release(tms->lock);
+    if (tms->lock)
+        apr_lock_release(tms->lock);
 
     node++;
 
@@ -150,18 +155,20 @@
 
     tms = (apr_sms_tracking_t *)sms;
 
-
     node = (apr_track_node_t *)mem;
 
     if (node) {
         node--;
-        apr_lock_acquire(tms->lock);
+        
+        if (tms->lock)
+            apr_lock_acquire(tms->lock);
         
         *(node->ref) = node->next;
         if (node->next)
             node->next->ref = node->ref;
         
-        apr_lock_release(tms->lock);
+        if (tms->lock)
+            apr_lock_release(tms->lock);
     }
 
     node = apr_sms_realloc(sms->parent,
@@ -169,7 +176,8 @@
     if (!node)
         return NULL;
 
-    apr_lock_acquire(tms->lock);
+    if (tms->lock)
+        apr_lock_acquire(tms->lock);
     
     node->next = tms->nodes;
     tms->nodes = node;
@@ -177,7 +185,8 @@
     if (node->next)
         node->next->ref = &node->next;
 
-    apr_lock_release(tms->lock);
+    if (tms->lock)
+        apr_lock_release(tms->lock);
     
     node++;
 
@@ -195,13 +204,15 @@
 
     tms = (apr_sms_tracking_t *)sms;
  
-    apr_lock_acquire(tms->lock);
+    if (tms->lock)
+        apr_lock_acquire(tms->lock);
 
     *(node->ref) = node->next;
     if (node->next)
         node->next->ref = node->ref;
  
-    apr_lock_release(tms->lock);
+    if (tms->lock)
+        apr_lock_release(tms->lock);
          
     return apr_sms_free(sms->parent, node);
 }
@@ -214,7 +225,8 @@
  
     tms = (apr_sms_tracking_t *)sms;
 
-    apr_lock_acquire(tms->lock);
+    if (tms->lock)
+        apr_lock_acquire(tms->lock);
     
     while (tms->nodes) {
         node = tms->nodes;
@@ -223,12 +235,14 @@
             node->next->ref = node->ref;
         if ((rv = apr_sms_free(sms->parent, 
                                node)) != APR_SUCCESS) {
-            apr_lock_release(tms->lock);
+            if (tms->lock)
+                apr_lock_release(tms->lock);
             return rv;
         }
     }
     
-    apr_lock_release(tms->lock);
+    if (tms->lock)
+        apr_lock_release(tms->lock);
 
     return APR_SUCCESS;
 }
@@ -244,9 +258,12 @@
     apr_sms_tracking_t *tms;
  
     tms = (apr_sms_tracking_t *)sms;
-    apr_lock_acquire(tms->lock);
-    apr_lock_destroy(tms->lock);
-    tms->lock = NULL;
+
+    if (tms->lock) {
+        apr_lock_acquire(tms->lock);
+        apr_lock_destroy(tms->lock);
+        tms->lock = NULL;
+    }
     
     return APR_SUCCESS;    
 }
@@ -254,24 +271,9 @@
 static apr_status_t apr_sms_tracking_destroy(apr_sms_t *sms)
 {
     apr_status_t rv;
-    apr_sms_tracking_t *tms;
-    apr_track_node_t *node;
-    
-    tms = (apr_sms_tracking_t *)sms;
- 
-    /* XXX - As we've already had the lock we've been using destroyed
-     * in the pre_destroy function we can't use it.  However, if we
-     * have threads trying to use the sms while another is trying to
-     * destroy it, then we have serious problems anyway.
-     */
-    while (tms->nodes) {
-        node = tms->nodes;
-        *(node->ref) = node->next;
-        if (node->next)
-            node->next->ref = node->ref;
-        if ((rv = apr_sms_free(sms->parent, node)) != APR_SUCCESS)
-            return rv;
-    }
+        
+    if ((rv = apr_sms_reset(sms)) != APR_SUCCESS)
+        return rv;
     
     return apr_sms_free(sms->parent, sms);
 }
