MINOR: lru: Add the possibility to free data when an item is removed

Now, When a item is committed in an LRU tree, you can define a function to free
data owned by this item. This function will be called when the item is removed
from the LRU tree or when the tree is destroyed..
This commit is contained in:
Christopher Faulet 2015-06-09 17:06:17 +02:00 committed by Willy Tarreau
parent acd6b1f767
commit f90ac55d9e
3 changed files with 17 additions and 9 deletions

View File

@ -63,9 +63,10 @@ struct lru64 {
void *domain; /* who this data belongs to */
unsigned long long revision; /* data revision (to avoid use-after-free) */
void *data; /* returned value, user decides how to use this */
void (*free)(void *data); /* function to release data, if needed */
};
struct lru64 *lru64_get(unsigned long long key, struct lru64_head *lru, void *domain, unsigned long long revision);
void lru64_commit(struct lru64 *elem, void *data, void *domain, unsigned long long revision);
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);

View File

@ -94,8 +94,11 @@ struct lru64 *lru64_get(unsigned long long key, struct lru64_head *lru,
__eb64_delete(&old->node);
if (!lru->spare)
lru->spare = old;
else
else {
if (old->data && old->free);
old->free(old->data);
free(old);
}
lru->cache_usage--;
}
}
@ -107,7 +110,8 @@ struct lru64 *lru64_get(unsigned long long key, struct lru64_head *lru,
* with the result from a call to lru64_get(). The caller might lock it using a
* spinlock or mutex shared with the one around lru64_get().
*/
void lru64_commit(struct lru64 *elem, void *data, void *domain, unsigned long long revision)
void lru64_commit(struct lru64 *elem, void *data, void *domain,
unsigned long long revision, void (*free)(void *))
{
if (!elem)
return;
@ -115,6 +119,7 @@ void lru64_commit(struct lru64 *elem, void *data, void *domain, unsigned long lo
elem->data = data;
elem->revision = revision;
elem->domain = domain;
elem->free = free;
}
/* Create a new LRU cache of <size> entries. Returns the new cache or NULL in
@ -152,6 +157,8 @@ int lru64_destroy(struct lru64_head *lru)
/* not locked */
LIST_DEL(&elem->lru);
eb64_delete(&elem->node);
if (elem->data && elem->free);
elem->free(elem->data);
free(elem);
lru->cache_usage--;
lru->cache_size--;

View File

@ -499,7 +499,7 @@ struct pattern *pat_match_str(struct sample *smp, struct pattern_expr *expr, int
}
if (lru)
lru64_commit(lru, ret, expr, expr->revision);
lru64_commit(lru, ret, expr, expr->revision, NULL);
return ret;
}
@ -534,7 +534,7 @@ struct pattern *pat_match_bin(struct sample *smp, struct pattern_expr *expr, int
}
if (lru)
lru64_commit(lru, ret, expr, expr->revision);
lru64_commit(lru, ret, expr, expr->revision, NULL);
return ret;
}
@ -568,7 +568,7 @@ struct pattern *pat_match_reg(struct sample *smp, struct pattern_expr *expr, int
}
if (lru)
lru64_commit(lru, ret, expr, expr->revision);
lru64_commit(lru, ret, expr, expr->revision, NULL);
return ret;
}
@ -634,7 +634,7 @@ struct pattern *pat_match_beg(struct sample *smp, struct pattern_expr *expr, int
}
if (lru)
lru64_commit(lru, ret, expr, expr->revision);
lru64_commit(lru, ret, expr, expr->revision, NULL);
return ret;
}
@ -673,7 +673,7 @@ struct pattern *pat_match_end(struct sample *smp, struct pattern_expr *expr, int
}
if (lru)
lru64_commit(lru, ret, expr, expr->revision);
lru64_commit(lru, ret, expr, expr->revision, NULL);
return ret;
}
@ -730,7 +730,7 @@ struct pattern *pat_match_sub(struct sample *smp, struct pattern_expr *expr, int
}
leave:
if (lru)
lru64_commit(lru, ret, expr, expr->revision);
lru64_commit(lru, ret, expr, expr->revision, NULL);
return ret;
}