1 /* 2 * Copyright (C) the libgit2 contributors. All rights reserved. 3 * 4 * This file is part of libgit2, distributed under the GNU GPL v2 with 5 * a Linking Exception. For full terms see the included COPYING file. 6 */ 7 #ifndef INCLUDE_cache_h__ 8 #define INCLUDE_cache_h__ 9 10 #include "common.h" 11 12 #include "git2/common.h" 13 #include "git2/oid.h" 14 #include "git2/odb.h" 15 16 #include "thread-utils.h" 17 #include "oidmap.h" 18 19 enum { 20 GIT_CACHE_STORE_ANY = 0, 21 GIT_CACHE_STORE_RAW = 1, 22 GIT_CACHE_STORE_PARSED = 2 23 }; 24 25 typedef struct { 26 git_oid oid; 27 int16_t type; /* git_object_t value */ 28 uint16_t flags; /* GIT_CACHE_STORE value */ 29 size_t size; 30 git_atomic refcount; 31 } git_cached_obj; 32 33 typedef struct { 34 git_oidmap *map; 35 git_rwlock lock; 36 ssize_t used_memory; 37 } git_cache; 38 39 extern bool git_cache__enabled; 40 extern ssize_t git_cache__max_storage; 41 extern git_atomic_ssize git_cache__current_storage; 42 43 int git_cache_set_max_object_size(git_object_t type, size_t size); 44 45 int git_cache_init(git_cache *cache); 46 void git_cache_free(git_cache *cache); 47 void git_cache_clear(git_cache *cache); 48 49 void *git_cache_store_raw(git_cache *cache, git_odb_object *entry); 50 void *git_cache_store_parsed(git_cache *cache, git_object *entry); 51 52 git_odb_object *git_cache_get_raw(git_cache *cache, const git_oid *oid); 53 git_object *git_cache_get_parsed(git_cache *cache, const git_oid *oid); 54 void *git_cache_get_any(git_cache *cache, const git_oid *oid); 55 git_cache_size(git_cache * cache)56GIT_INLINE(size_t) git_cache_size(git_cache *cache) 57 { 58 return (size_t)git_oidmap_size(cache->map); 59 } 60 git_cached_obj_incref(void * _obj)61GIT_INLINE(void) git_cached_obj_incref(void *_obj) 62 { 63 git_cached_obj *obj = _obj; 64 git_atomic_inc(&obj->refcount); 65 } 66 67 void git_cached_obj_decref(void *_obj); 68 69 #endif 70