MINOR: lru: new function to delete <nb> least recently used keys

Introduction of a new function in the LRU cache source file.
Purpose of this function is to be used to delete a number of entries in
the cache. 'number' is defined by the caller and the key removed are
taken at the tail of the tree
This commit is contained in:
Baptiste Assmann 2016-01-07 02:28:50 +01:00 committed by Willy Tarreau
parent b631c291c9
commit 22c4ed6937
2 changed files with 26 additions and 0 deletions

View File

@ -72,3 +72,4 @@ struct lru64 *lru64_get(unsigned long long key, struct lru64_head *lru, void *do
void lru64_commit(struct lru64 *elem, void *data, void *domain, unsigned long long revision, void (*free)(void *));
struct lru64_head *lru64_new(int size);
int lru64_destroy(struct lru64_head *lru);
void lru64_kill_oldest(struct lru64_head *lru, unsigned long int nb);

View File

@ -199,6 +199,31 @@ int lru64_destroy(struct lru64_head *lru)
return 0;
}
/* kill the <nb> least used entries from the <lru> cache */
void lru64_kill_oldest(struct lru64_head *lru, unsigned long int nb)
{
struct lru64 *elem, *next;
for (elem = container_of(lru->list.p, typeof(*elem), lru);
nb && (&elem->lru != &lru->list);
elem = next) {
next = container_of(elem->lru.p, typeof(*next), lru);
if (!elem->domain)
continue; /* locked entry */
LIST_DEL(&elem->lru);
eb64_delete(&elem->node);
if (elem->data && elem->free)
elem->free(elem->data);
if (!lru->spare)
lru->spare = elem;
else
free(elem);
lru->cache_usage--;
nb--;
}
}
/* The code below is just for validation and performance testing. It's an
* example of a function taking some time to return results that could be
* cached.