diff options
Diffstat (limited to 'src/cache.h')
| -rw-r--r-- | src/cache.h | 51 |
1 files changed, 31 insertions, 20 deletions
diff --git a/src/cache.h b/src/cache.h index 7034ec268..1715c7220 100644 --- a/src/cache.h +++ b/src/cache.h @@ -12,43 +12,54 @@ #include "git2/odb.h" #include "thread-utils.h" +#include "oidmap.h" -#define GIT_DEFAULT_CACHE_SIZE 128 - -typedef void (*git_cached_obj_freeptr)(void *); +enum { + GIT_CACHE_STORE_ANY = 0, + GIT_CACHE_STORE_RAW = 1, + GIT_CACHE_STORE_PARSED = 2 +}; typedef struct { - git_oid oid; + git_oid oid; + int16_t type; /* git_otype value */ + uint16_t flags; /* GIT_CACHE_STORE value */ + size_t size; git_atomic refcount; } git_cached_obj; typedef struct { - git_cached_obj **nodes; - git_mutex lock; - - unsigned int lru_count; - size_t size_mask; - git_cached_obj_freeptr free_obj; + git_oidmap *map; + git_mutex lock; + size_t used_memory; } git_cache; -int git_cache_init(git_cache *cache, size_t size, git_cached_obj_freeptr free_ptr); +extern bool git_cache__enabled; +extern size_t git_cache__max_storage; + +int git_cache_set_max_object_size(git_otype type, size_t size); + +int git_cache_init(git_cache *cache); void git_cache_free(git_cache *cache); -void *git_cache_try_store(git_cache *cache, void *entry); -void *git_cache_get(git_cache *cache, const git_oid *oid); +void *git_cache_store_raw(git_cache *cache, git_odb_object *entry); +void *git_cache_store_parsed(git_cache *cache, git_object *entry); -GIT_INLINE(void) git_cached_obj_incref(void *_obj) +git_odb_object *git_cache_get_raw(git_cache *cache, const git_oid *oid); +git_object *git_cache_get_parsed(git_cache *cache, const git_oid *oid); +void *git_cache_get_any(git_cache *cache, const git_oid *oid); + +GIT_INLINE(size_t) git_cache_size(git_cache *cache) { - git_cached_obj *obj = _obj; - git_atomic_inc(&obj->refcount); + return (size_t)kh_size(cache->map); } -GIT_INLINE(void) git_cached_obj_decref(void *_obj, git_cached_obj_freeptr free_obj) +GIT_INLINE(void) git_cached_obj_incref(void *_obj) { git_cached_obj *obj = _obj; - - if (git_atomic_dec(&obj->refcount) == 0) - free_obj(obj); + git_atomic_inc(&obj->refcount); } +void git_cached_obj_decref(void *_obj); + #endif |
