From 6d6d658b5c5ea474fd551f63ff28d6da355c8cfd Mon Sep 17 00:00:00 2001 From: Yuxuan Shui Date: Mon, 6 May 2019 00:28:22 +0100 Subject: [PATCH] cache: cache_get can now return error Signed-off-by: Yuxuan Shui --- src/cache.c | 16 ++++++++++++++-- src/cache.h | 4 ++-- 2 files changed, 16 insertions(+), 4 deletions(-) diff --git a/src/cache.c b/src/cache.c index e455032f..d1ddda72 100644 --- a/src/cache.c +++ b/src/cache.c @@ -16,16 +16,28 @@ struct cache { struct cache_entry *entries; }; -void *cache_get(struct cache *c, const char *key) { +void *cache_get(struct cache *c, const char *key, int *err) { struct cache_entry *e; HASH_FIND_STR(c->entries, key, e); if (e) { return e->value; } + int tmperr; + if (!err) { + err = &tmperr; + } + + *err = 0; e = ccalloc(1, struct cache_entry); e->key = strdup(key); - e->value = c->getter(c->user_data, key); + e->value = c->getter(c->user_data, key, err); + if (*err) { + free(e->key); + free(e); + return NULL; + } + HASH_ADD_STR(c->entries, key, e); return e->value; } diff --git a/src/cache.h b/src/cache.h index 440f92f2..5876ee21 100644 --- a/src/cache.h +++ b/src/cache.h @@ -2,11 +2,11 @@ struct cache; -typedef void *(*cache_getter_t)(void *user_data, const char *key); +typedef void *(*cache_getter_t)(void *user_data, const char *key, int *err); typedef void (*cache_free_t)(void *user_data, void *data); struct cache *new_cache(void *user_data, cache_getter_t getter, cache_free_t f); -void *cache_get(struct cache *, const char *key); +void *cache_get(struct cache *, const char *key, int *err); void cache_invalidate(struct cache *, const char *key); void cache_invalidate_all(struct cache *);