X-Git-Url: http://www.chiark.greenend.org.uk/ucgi/~mdw/git/disorder/blobdiff_plain/460b9539a7c15580e41a71bbc0f47ae776238915..efd23a800d05515c519fdd7f00e7d0015ba73f5a:/lib/cache.c diff --git a/lib/cache.c b/lib/cache.c index df8fa68..e0f69ef 100644 --- a/lib/cache.c +++ b/lib/cache.c @@ -1,25 +1,23 @@ /* * This file is part of DisOrder - * Copyright (C) 2006 Richard Kettlewell + * Copyright (C) 2006-2008 Richard Kettlewell * - * This program is free software; you can redistribute it and/or modify + * This program is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by - * the Free Software Foundation; either version 2 of the License, or + * the Free Software Foundation, either version 3 of the License, or * (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, but - * WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU - * General Public License for more details. - * + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * * You should have received a copy of the GNU General Public License - * along with this program; if not, write to the Free Software - * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 - * USA + * along with this program. If not, see . */ +/** @file lib/cache.c @brief Object caching */ -#include -#include "types.h" +#include "common.h" #include @@ -28,18 +26,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 +64,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 +81,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 +91,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 +103,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 +113,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 @@ -105,4 +139,3 @@ fill-column:79 indent-tabs-mode:nil End: */ -/* arch-tag:uoFZfd12rkQj/ppG5g3BtQ */