mirror of
http://git.haproxy.org/git/haproxy.git/
synced 2025-02-05 21:11:53 +00:00
BUG/MINOR: pools: make sure to also destroy shared pools in pool_destroy_all()
In issue #1677, Tim reported that we don't correctly free some shared pools on exit. What happens in fact is that pool_destroy() is meant to be called once per pool *pointer*, as it decrements the use count for each pass and only releases the pool when it reaches zero. But since pool_destroy_all() iterates over the pools list, it visits each pool only once and will not eliminate some of them, which thus remain in the list. In an ideal case, the function should loop over all pools for as long as the list is not empty, but that's pointless as we know we're exiting, so let's just set the users count to 1 before the call so that pool_destroy() knows it can delete and release the entry. This could be backported to all versions (memory.c in 2.0 and older) but it's not a real problem in practice.
This commit is contained in:
parent
974358954b
commit
243e68b552
@ -837,8 +837,14 @@ void pool_destroy_all()
|
||||
{
|
||||
struct pool_head *entry, *back;
|
||||
|
||||
list_for_each_entry_safe(entry, back, &pools, list)
|
||||
list_for_each_entry_safe(entry, back, &pools, list) {
|
||||
/* there's only one occurrence of each pool in the list,
|
||||
* and we're existing instead of looping on the whole
|
||||
* list just to decrement users, force it to 1 here.
|
||||
*/
|
||||
entry->users = 1;
|
||||
pool_destroy(entry);
|
||||
}
|
||||
}
|
||||
|
||||
/* This function dumps memory usage information into the trash buffer. */
|
||||
|
Loading…
Reference in New Issue
Block a user