Refine LRU cache by clearing old objects

This commit is contained in:
Max Lv
2016-10-26 08:53:21 +08:00
parent e0cfa6945a
commit 85a5c86637
9 changed files with 84 additions and 12 deletions
+43 -1
View File
@@ -94,7 +94,7 @@ cache_delete(struct cache *cache, int keep_data)
if (cache->free_cb) {
cache->free_cb(entry->data);
} else {
ss_free(tmp->data);
ss_free(entry->data);
}
}
ss_free(entry->key);
@@ -106,6 +106,45 @@ cache_delete(struct cache *cache, int keep_data)
return 0;
}
/** Clear old cache object
*
* @param cache
* The cache object to clear
*
* @param age
* Clear only objects older than the age (sec)
*
* @return EINVAL if cache is NULL, 0 otherwise
*/
int
cache_clear(struct cache *cache, ev_tstamp age)
{
struct cache_entry *entry, *tmp;
if (!cache) {
return EINVAL;
}
ev_tstamp now = ev_time();
HASH_ITER(hh, cache->entries, entry, tmp){
if (now - entry->ts > age) {
HASH_DEL(cache->entries, entry);
if (entry->data != NULL) {
if (cache->free_cb) {
cache->free_cb(entry->data);
} else {
ss_free(entry->data);
}
}
ss_free(entry->key);
ss_free(entry);
}
}
return 0;
}
/** Removes a cache entry
*
* @param cache
@@ -179,6 +218,7 @@ cache_lookup(struct cache *cache, char *key, size_t key_len, void *result)
HASH_FIND(hh, cache->entries, key, key_len, tmp);
if (tmp) {
HASH_DELETE(hh, cache->entries, tmp);
tmp->ts = ev_time();
HASH_ADD_KEYPTR(hh, cache->entries, tmp->key, key_len, tmp);
*dirty_hack = tmp->data;
} else {
@@ -200,6 +240,7 @@ cache_key_exist(struct cache *cache, char *key, size_t key_len)
HASH_FIND(hh, cache->entries, key, key_len, tmp);
if (tmp) {
HASH_DELETE(hh, cache->entries, tmp);
tmp->ts = ev_time();
HASH_ADD_KEYPTR(hh, cache->entries, tmp->key, key_len, tmp);
return 1;
} else {
@@ -242,6 +283,7 @@ cache_insert(struct cache *cache, char *key, size_t key_len, void *data)
entry->key = ss_malloc(key_len);
memcpy(entry->key, key, key_len);
entry->data = data;
entry->ts = ev_time();
HASH_ADD_KEYPTR(hh, cache->entries, entry->key, key_len, entry);
if (HASH_COUNT(cache->entries) >= cache->max_entries) {