X-Git-Url: http://git.wpitchoune.net/gitweb/?a=blobdiff_plain;f=trunk%2Fsrc%2Fcache.c;fp=trunk%2Fsrc%2Fcache.c;h=940294e92f92ae88ed965433dce56f79b24c2d4f;hb=b19be7b6db9f737f9a9a22b3079abc774cc7583c;hp=0000000000000000000000000000000000000000;hpb=b19f912053682528d7efa15aa5641a1f055f3038;p=ppastats.git diff --git a/trunk/src/cache.c b/trunk/src/cache.c new file mode 100644 index 0000000..940294e --- /dev/null +++ b/trunk/src/cache.c @@ -0,0 +1,88 @@ +/* + 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 + +#include "cache.h" +#include "ppastats.h" + +#include +#include + +/* + Simple 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); + } +}