]> git.proxmox.com Git - libgit2.git/commitdiff
Refactor git_cache to use an rwlock
authorJustin Spahr-Summers <Justin.SpahrSummers@gmail.com>
Tue, 26 Aug 2014 22:12:43 +0000 (15:12 -0700)
committerJustin Spahr-Summers <Justin.SpahrSummers@gmail.com>
Tue, 26 Aug 2014 22:12:43 +0000 (15:12 -0700)
This significantly reduces contention when many threads are trying to
read from the cache simultaneously.

src/cache.c
src/cache.h

index 36ce6657063789155f6249369333674dc9b01ea2..8dc9cbf9c998e8b94b7c3d94c11f8e92e374e82a 100644 (file)
@@ -68,8 +68,8 @@ int git_cache_init(git_cache *cache)
 {
        memset(cache, 0, sizeof(*cache));
        cache->map = git_oidmap_alloc();
-       if (git_mutex_init(&cache->lock)) {
-               giterr_set(GITERR_OS, "Failed to initialize cache mutex");
+       if (git_rwlock_init(&cache->lock)) {
+               giterr_set(GITERR_OS, "Failed to initialize cache rwlock");
                return -1;
        }
        return 0;
@@ -94,19 +94,19 @@ static void clear_cache(git_cache *cache)
 
 void git_cache_clear(git_cache *cache)
 {
-       if (git_mutex_lock(&cache->lock) < 0)
+       if (git_rwlock_wrlock(&cache->lock) < 0)
                return;
 
        clear_cache(cache);
 
-       git_mutex_unlock(&cache->lock);
+       git_rwlock_wrunlock(&cache->lock);
 }
 
 void git_cache_free(git_cache *cache)
 {
        git_cache_clear(cache);
        git_oidmap_free(cache->map);
-       git_mutex_free(&cache->lock);
+       git_rwlock_free(&cache->lock);
        git__memzero(cache, sizeof(*cache));
 }
 
@@ -152,7 +152,7 @@ static void *cache_get(git_cache *cache, const git_oid *oid, unsigned int flags)
        khiter_t pos;
        git_cached_obj *entry = NULL;
 
-       if (!git_cache__enabled || git_mutex_lock(&cache->lock) < 0)
+       if (!git_cache__enabled || git_rwlock_rdlock(&cache->lock) < 0)
                return NULL;
 
        pos = kh_get(oid, cache->map, oid);
@@ -166,7 +166,7 @@ static void *cache_get(git_cache *cache, const git_oid *oid, unsigned int flags)
                }
        }
 
-       git_mutex_unlock(&cache->lock);
+       git_rwlock_rdunlock(&cache->lock);
 
        return entry;
 }
@@ -185,7 +185,7 @@ static void *cache_store(git_cache *cache, git_cached_obj *entry)
        if (!cache_should_store(entry->type, entry->size))
                return entry;
 
-       if (git_mutex_lock(&cache->lock) < 0)
+       if (git_rwlock_wrlock(&cache->lock) < 0)
                return entry;
 
        /* soften the load on the cache */
@@ -227,7 +227,7 @@ static void *cache_store(git_cache *cache, git_cached_obj *entry)
                }
        }
 
-       git_mutex_unlock(&cache->lock);
+       git_rwlock_wrunlock(&cache->lock);
        return entry;
 }
 
index 53fbcf4e99b4ab9b2ff43b62802991c47ccbc869..697123739795c937ebad58342d1443926881347d 100644 (file)
@@ -30,7 +30,7 @@ typedef struct {
 
 typedef struct {
        git_oidmap *map;
-       git_mutex   lock;
+       git_rwlock  lock;
        ssize_t     used_memory;
 } git_cache;