rbb         99/10/12 10:54:33

  Modified:    src/lib/apr/lib apr_pools.c
  Log:
  Fix a bug in pool locking.  The current logic requires recursive mutex's,
  which are non-portable.  This fix ensures that when clearing and destroying
  pools, we only try to grab the mutex once.  The fact that APR locks are
  not recursive will be documented in a later commit.
  
  Revision  Changes    Path
  1.18      +15 -5     apache-2.0/src/lib/apr/lib/apr_pools.c
  
  Index: apr_pools.c
  ===================================================================
  RCS file: /home/cvs/apache-2.0/src/lib/apr/lib/apr_pools.c,v
  retrieving revision 1.17
  retrieving revision 1.18
  diff -u -r1.17 -r1.18
  --- apr_pools.c       1999/10/11 22:39:36     1.17
  +++ apr_pools.c       1999/10/12 17:54:32     1.18
  @@ -557,15 +557,25 @@
   
   void ap_destroy_real_pool(ap_pool_t *);
   
  -static void ap_clear_real_pool(ap_pool_t *a)
  +/* We only want to lock the mutex if we are being called from ap_clear_pool.
  + * This is because if we also call this function from ap_destroy_real_pool,
  + * which also locks the same mutex, and recursive locks aren't portable.  
  + * This way, we are garaunteed that we only lock this mutex once when calling
  + * either one of these functions.
  + */
  +static void ap_clear_real_pool(ap_pool_t *a, int clearcaller)
   {
       ap_block_alarms();
   
  -    ap_lock(alloc_mutex);
  +    if (clearcaller) {
  +        ap_lock(alloc_mutex);
  +    }
       while (a->sub_pools) {
        ap_destroy_real_pool(a->sub_pools);
  +    }
  +    if (clearcaller) {
  +        ap_unlock(alloc_mutex);
       }
  -    ap_unlock(alloc_mutex);
       /*
        * Don't hold the mutex during cleanups.
        */
  @@ -598,13 +608,13 @@
   
   API_EXPORT(void) ap_clear_pool(struct context_t *a)
   {
  -    ap_clear_real_pool(a->pool);
  +    ap_clear_real_pool(a->pool, 1);
   }
   
   API_EXPORT(void) ap_destroy_real_pool(ap_pool_t *a)
   {
       ap_block_alarms();
  -    ap_clear_real_pool(a);
  +    ap_clear_real_pool(a, 0);
       ap_lock(alloc_mutex);
   
       if (a->parent) {
  
  
  

Reply via email to