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)56 GIT_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)61 GIT_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