X-Git-Url: http://git.wpitchoune.net/gitweb/?a=blobdiff_plain;f=src%2Fcache.c;fp=src%2Fcache.c;h=d70e308c9e67fb46c99bc235945c6ef3bb5b1056;hb=f2b0384f6231324f53e78aa458b9a46b0e659c43;hp=0000000000000000000000000000000000000000;hpb=c310cd8ae145dad11d142eec17005d648144da42;p=ppastats.git diff --git a/src/cache.c b/src/cache.c new file mode 100644 index 0000000..d70e308 --- /dev/null +++ b/src/cache.c @@ -0,0 +1,87 @@ +/* + Copyright (C) 2011 jeanfi@gmail.com + + 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 + (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. + + 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., 51 Franklin Street, Fifth Floor, Boston, MA + 02110-1301 USA +*/ + +#include "cache.h" +#include "ppastats.h" + +#include +#include +#include + +/* + Stupid cache implementation but should be enough for storing LP data. +*/ + +struct entry { + const char *key; + const void *value; + void (*fct_cleanup)(void *); +}; + +#define CAPACITY 1024 + +struct cache { + int size; + struct entry entries[CAPACITY]; +}; + +static struct cache cache; + +const void *cache_get(const char *key) +{ + int i; + + for (i = 0; i < cache.size; i++) + if (!strcmp(cache.entries[i].key, key)) { + if (debug) + printf("DEBUG: cache hit %s\n", key); + + return cache.entries[i].value; + } + + if (debug) + printf("DEBUG: cache miss %s\n", key); + + return NULL; +} + +void cache_put(const char *key, const void *value, + void (*fct_cleanup)(void *)) +{ + if (cache.size == CAPACITY) { + fprintf(stderr, "WARNING: exceed cache capacity\n"); + return ; + } + + cache.entries[cache.size].key = strdup(key); + cache.entries[cache.size].value = value; + cache.entries[cache.size].fct_cleanup = fct_cleanup; + + cache.size++; +} + +void cache_cleanup() +{ + int i; + + for (i = 0; i < cache.size; i++) { + free((char *)cache.entries[i].key); + cache.entries[i].fct_cleanup((void *)cache.entries[i].value); + } +}