diff --git a/src/pool.c b/src/pool.c index d788c6168..c69143a08 100644 --- a/src/pool.c +++ b/src/pool.c @@ -360,20 +360,19 @@ void pool_gc(struct pool_head *pool_ctx) */ void pool_flush(struct pool_head *pool) { - void *temp; + void *temp, **next; if (!pool) return; - while (1) { - HA_SPIN_LOCK(POOL_LOCK, &pool->lock); - temp = pool->free_list; - if (!temp) { - HA_SPIN_UNLOCK(POOL_LOCK, &pool->lock); - break; - } - pool->free_list = *POOL_LINK(pool, temp); - HA_SPIN_UNLOCK(POOL_LOCK, &pool->lock); + HA_SPIN_LOCK(POOL_LOCK, &pool->lock); + next = pool->free_list; + pool->free_list = NULL; + HA_SPIN_UNLOCK(POOL_LOCK, &pool->lock); + + while (next) { + temp = next; + next = *POOL_LINK(pool, temp); pool_put_to_os(pool, temp); } /* here, we should have pool->allocated == pool->used */