1
0
Fork 0
mirror of https://github.com/yshui/picom.git synced 2024-11-11 13:51:02 -05:00

cache: slight refactor

Added a pure version of `cache_get` which does not change the cache, and
renamed the old `cache_get` to `cache_get_or_fetch`.

Remove unused `cache_set`, and remove prefix underscore from function
names.

Signed-off-by: Yuxuan Shui <yshuiv7@gmail.com>
This commit is contained in:
Yuxuan Shui 2024-02-15 20:05:09 +00:00
parent bb097730c7
commit 0dcca2228e
No known key found for this signature in database
GPG key ID: D3A4405BE6CC17F4
4 changed files with 23 additions and 25 deletions

View file

@ -29,7 +29,8 @@ static inline void *atom_getter(void *ud, const char *atom_name, int *err) {
struct atom *init_atoms(xcb_connection_t *c) { struct atom *init_atoms(xcb_connection_t *c) {
auto atoms = ccalloc(1, struct atom); auto atoms = ccalloc(1, struct atom);
atoms->c = new_cache((void *)c, atom_getter, NULL); atoms->c = new_cache((void *)c, atom_getter, NULL);
#define ATOM_GET(x) atoms->a##x = (xcb_atom_t)(intptr_t)cache_get(atoms->c, #x, NULL) #define ATOM_GET(x) \
atoms->a##x = (xcb_atom_t)(intptr_t)cache_get_or_fetch(atoms->c, #x, NULL)
LIST_APPLY(ATOM_GET, SEP_COLON, ATOM_LIST1); LIST_APPLY(ATOM_GET, SEP_COLON, ATOM_LIST1);
LIST_APPLY(ATOM_GET, SEP_COLON, ATOM_LIST2); LIST_APPLY(ATOM_GET, SEP_COLON, ATOM_LIST2);
#undef ATOM_GET #undef ATOM_GET

View file

@ -61,7 +61,7 @@ struct atom {
struct atom *init_atoms(xcb_connection_t *); struct atom *init_atoms(xcb_connection_t *);
static inline xcb_atom_t get_atom(struct atom *a, const char *key) { static inline xcb_atom_t get_atom(struct atom *a, const char *key) {
return (xcb_atom_t)(intptr_t)cache_get(a->c, key, NULL); return (xcb_atom_t)(intptr_t)cache_get_or_fetch(a->c, key, NULL);
} }
static inline void destroy_atoms(struct atom *a) { static inline void destroy_atoms(struct atom *a) {

View file

@ -17,20 +17,19 @@ struct cache {
struct cache_entry *entries; struct cache_entry *entries;
}; };
void cache_set(struct cache *c, const char *key, void *data) { static inline struct cache_entry *cache_get_entry(struct cache *c, const char *key) {
struct cache_entry *e = NULL;
HASH_FIND_STR(c->entries, key, e);
CHECK(!e);
e = ccalloc(1, struct cache_entry);
e->key = strdup(key);
e->value = data;
HASH_ADD_STR(c->entries, key, e);
}
void *cache_get(struct cache *c, const char *key, int *err) {
struct cache_entry *e; struct cache_entry *e;
HASH_FIND_STR(c->entries, key, e); HASH_FIND_STR(c->entries, key, e);
return e;
}
void *cache_get(struct cache *c, const char *key) {
struct cache_entry *e = cache_get_entry(c, key);
return e ? e->value : NULL;
}
void *cache_get_or_fetch(struct cache *c, const char *key, int *err) {
struct cache_entry *e = cache_get_entry(c, key);
if (e) { if (e) {
return e->value; return e->value;
} }
@ -54,7 +53,7 @@ void *cache_get(struct cache *c, const char *key, int *err) {
return e->value; return e->value;
} }
static inline void _cache_invalidate(struct cache *c, struct cache_entry *e) { static inline void cache_invalidate_impl(struct cache *c, struct cache_entry *e) {
if (c->free) { if (c->free) {
c->free(c->user_data, e->value); c->free(c->user_data, e->value);
} }
@ -68,14 +67,14 @@ void cache_invalidate(struct cache *c, const char *key) {
HASH_FIND_STR(c->entries, key, e); HASH_FIND_STR(c->entries, key, e);
if (e) { if (e) {
_cache_invalidate(c, e); cache_invalidate_impl(c, e);
} }
} }
void cache_invalidate_all(struct cache *c) { void cache_invalidate_all(struct cache *c) {
struct cache_entry *e, *tmpe; struct cache_entry *e, *tmpe;
HASH_ITER(hh, c->entries, e, tmpe) { HASH_ITER(hh, c->entries, e, tmpe) {
_cache_invalidate(c, e); cache_invalidate_impl(c, e);
} }
} }

View file

@ -11,9 +11,13 @@ typedef void (*cache_free_t)(void *user_data, void *data);
/// `user_data` will be passed to `getter` and `f` when they are called. /// `user_data` will be passed to `getter` and `f` when they are called.
struct cache *new_cache(void *user_data, cache_getter_t getter, cache_free_t f); struct cache *new_cache(void *user_data, cache_getter_t getter, cache_free_t f);
/// Fetch a value from the cache. If the value doesn't present in the cache yet, the /// Get a value from the cache. If the value doesn't present in the cache yet, the
/// getter will be called, and the returned value will be stored into the cache. /// getter will be called, and the returned value will be stored into the cache.
void *cache_get(struct cache *, const char *key, int *err); void *cache_get_or_fetch(struct cache *, const char *key, int *err);
/// Get a value from the cache. If the value doesn't present in the cache, NULL will be
/// returned.
void *cache_get(struct cache *, const char *key);
/// Invalidate a value in the cache. /// Invalidate a value in the cache.
void cache_invalidate(struct cache *, const char *key); void cache_invalidate(struct cache *, const char *key);
@ -24,9 +28,3 @@ void cache_invalidate_all(struct cache *);
/// Invalidate all values in the cache and free it. Returns the user data passed to /// Invalidate all values in the cache and free it. Returns the user data passed to
/// `new_cache` /// `new_cache`
void *cache_free(struct cache *); void *cache_free(struct cache *);
/// Insert a key-value pair into the cache. Only used for internal testing. Takes
/// ownership of `data`
///
/// If `key` already exists in the cache, this function will abort the program.
void cache_set(struct cache *c, const char *key, void *data);