X-Git-Url: http://www.chiark.greenend.org.uk/ucgi/~mdw/git/disorder/blobdiff_plain/763d5e6ad88ef3ba1cd1d7742d060e4f1e54c6b8..ad2f8275a5fc0dba29ca97bc02342d1f1627e590:/lib/cache.c diff --git a/lib/cache.c b/lib/cache.c index 1379f66..faca540 100644 --- a/lib/cache.c +++ b/lib/cache.c @@ -17,6 +17,7 @@ * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 * USA */ +/** @file lib/cache.c @brief Object caching */ #include #include "types.h" @@ -28,18 +29,31 @@ #include "log.h" #include "cache.h" +/** @brief The global cache */ static hash *h; +/** @brief One cache entry */ struct cache_entry { + /** @brief What type of object this is */ const struct cache_type *type; + + /** @brief Pointer to object value */ const void *value; + + /** @brief Time that object was inserted into cache */ time_t birth; }; +/** @brief Return true if object @p c has expired */ static int expired(const struct cache_entry *c, time_t now) { return now - c->birth > c->type->lifetime; } +/** @brief Insert an object into the cache + * @param type Pointer to object type + * @param key Unique key + * @param value Pointer to value + */ void cache_put(const struct cache_type *type, const char *key, const void *value) { struct cache_entry *c; @@ -53,6 +67,11 @@ void cache_put(const struct cache_type *type, hash_add(h, key, c, HASH_INSERT_OR_REPLACE); } +/** @brief Look up an object in the cache + * @param type Pointer to object type + * @param key Unique key + * @return Pointer to object value or NULL if not found + */ const void *cache_get(const struct cache_type *type, const char *key) { const struct cache_entry *c; @@ -65,6 +84,7 @@ const void *cache_get(const struct cache_type *type, const char *key) { return 0; } +/** @brief Call used by from cache_expire() */ static int expiry_callback(const char *key, void *value, void *u) { const struct cache_entry *c = value; const time_t *now = u; @@ -74,6 +94,9 @@ static int expiry_callback(const char *key, void *value, void *u) { return 0; } +/** @brief Expire the cache + * + * Called from time to time to expire cache entries. */ void cache_expire(void) { time_t now; @@ -83,6 +106,7 @@ void cache_expire(void) { } } +/** @brief Callback used by cache_clean() */ static int clean_callback(const char *key, void *value, void *u) { const struct cache_entry *c = value; const struct cache_type *type = u; @@ -92,11 +116,24 @@ static int clean_callback(const char *key, void *value, void *u) { return 0; } +/** @brief Clean the cache + * @param type Pointer to type to clean + * + * Removes all entries of type @p type from the cache. + */ void cache_clean(const struct cache_type *type) { if(h) hash_foreach(h, clean_callback, (void *)type); } +/** @brief Report cache size + * + * Returns the number of objects in the cache + */ +size_t cache_count(void) { + return h ? hash_count(h) : 0; +} + /* Local Variables: c-basic-offset:2