You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@subversion.apache.org by st...@apache.org on 2013/11/13 00:21:32 UTC

svn commit: r1541307 - /subversion/trunk/subversion/libsvn_subr/object_pool.c

Author: stefan2
Date: Tue Nov 12 23:21:31 2013
New Revision: 1541307

URL: http://svn.apache.org/r1541307
Log:
Fix object pool's internal reference counting.

* subversion/libsvn_subr/object_pool.c
  (remove_unused_objects): only decrement the counter if we actually
                           destoryed an entry because ref-counting is
                           not synchronized with hash access
  (object_ref_cleanup): use the actual counters since hash buckets may
                        contain more than one entry
  (insert): new entries count as "unused" until actually handed out 

Modified:
    subversion/trunk/subversion/libsvn_subr/object_pool.c

Modified: subversion/trunk/subversion/libsvn_subr/object_pool.c
URL: http://svn.apache.org/viewvc/subversion/trunk/subversion/libsvn_subr/object_pool.c?rev=1541307&r1=1541306&r2=1541307&view=diff
==============================================================================
--- subversion/trunk/subversion/libsvn_subr/object_pool.c (original)
+++ subversion/trunk/subversion/libsvn_subr/object_pool.c Tue Nov 12 23:21:31 2013
@@ -209,6 +209,7 @@ remove_unused_objects(svn_object_pool__t
           next = object_ref->next;
           if (object_ref->ref_count == 0)
             {
+              svn_atomic_dec(&object_pool->unused_count);
               svn_pool_destroy(object_ref->pool);
             }
           else
@@ -226,8 +227,6 @@ remove_unused_objects(svn_object_pool__t
   svn_pool_destroy(object_pool->objects_hash_pool);
   object_pool->objects = new_hash;
   object_pool->objects_hash_pool = new_pool;
-
-  object_pool->unused_count = 0;
 }
 
 /* Cleanup function called when an object_ref_t gets released.
@@ -251,8 +250,8 @@ object_ref_cleanup(void *baton)
 
   /* Release unused configurations if there are relatively frequent. */
   if (   object_pool->unused_count > object_pool->max_unused
-      || object_pool->used_count * 2 + object_pool->min_unused
-         < apr_hash_count(object_pool->objects))
+      ||   object_pool->used_count * 2 + object_pool->min_unused
+         < object_pool->unused_count)
     {
       remove_unused_objects(object_pool);
     }
@@ -393,6 +392,11 @@ insert(void **object,
 
       apr_hash_set(object_pool->objects, object_ref->key.data,
                    object_ref->key.size, object_ref);
+
+      /* the new entry is *not* in use yet.
+       * add_object_ref will update counters again. 
+       */
+      svn_atomic_inc(&object_ref->object_pool->unused_count);
     }
 
   /* return a reference to the object we just added */