]> git.proxmox.com Git - libgit2.git/commitdiff
Clear the cache when there are too many items to expire
authorVicent Marti <tanoku@gmail.com>
Fri, 5 Apr 2013 20:38:14 +0000 (22:38 +0200)
committerVicent Marti <tanoku@gmail.com>
Mon, 22 Apr 2013 14:50:51 +0000 (16:50 +0200)
src/cache.c

index f3ab8a68422e280df2bc23405c61b55d15a364d6..9f3290f01a3b756869fe31c2c8db542d0dfc77bf 100644 (file)
@@ -63,14 +63,33 @@ void git_cache_free(git_cache *cache)
        git_mutex_free(&cache->lock);
 }
 
+void git_cache_clear(git_cache *cache)
+{
+       git_cached_obj *evict = NULL;
+
+       if (git_mutex_lock(&cache->lock) < 0)
+               return;
+
+       kh_foreach_value(cache->map, evict, {
+               git_cached_obj_decref(evict);
+       });
+
+       kh_clear(oid, cache->map);
+       cache->used_memory = 0;
+
+       git_mutex_unlock(&cache->lock);
+}
+
 /* Call with lock, yo */
 static void cache_evict_entries(git_cache *cache, size_t evict_count)
 {
        uint32_t seed = rand();
 
        /* do not infinite loop if there's not enough entries to evict  */
-       if (evict_count > kh_size(cache->map))
+       if (evict_count > kh_size(cache->map)) {
+               git_cache_clear(cache);
                return;
+       }
 
        while (evict_count > 0) {
                khiter_t pos = seed++ % kh_end(cache->map);