From 1f2c83f096f28ce79e828edd1ab545a341f10451 Mon Sep 17 00:00:00 2001 From: Vsevolod Stakhov Date: Thu, 1 Jan 2015 15:45:22 +0000 Subject: [PATCH] Preserve destructors order as LIFO. --- src/libutil/mem_pool.c | 13 +++++-------- src/libutil/mem_pool.h | 2 +- 2 files changed, 6 insertions(+), 9 deletions(-) diff --git a/src/libutil/mem_pool.c b/src/libutil/mem_pool.c index 6c9ee6f16..a292c082a 100644 --- a/src/libutil/mem_pool.c +++ b/src/libutil/mem_pool.c @@ -27,6 +27,7 @@ #include "fstring.h" #include "logger.h" #include "util.h" +#include "utlist.h" #include "main.h" /* Sleep time for spin lock in nanoseconds */ @@ -540,8 +541,7 @@ rspamd_mempool_add_destructor_full (rspamd_mempool_t * pool, cur->data = data; cur->function = function; cur->loc = line; - cur->prev = pool->destructors; - pool->destructors = cur; + DL_APPEND (pool->destructors, cur); POOL_MTX_UNLOCK (); } } @@ -554,14 +554,12 @@ rspamd_mempool_replace_destructor (rspamd_mempool_t * pool, { struct _pool_destructors *tmp; - tmp = pool->destructors; - while (tmp) { + DL_FOREACH (pool->destructors, tmp) { if (tmp->func == func && tmp->data == old_data) { tmp->func = func; tmp->data = new_data; break; } - tmp = tmp->prev; } } @@ -571,16 +569,15 @@ rspamd_mempool_delete (rspamd_mempool_t * pool) { struct _pool_chain *cur = pool->first_pool, *tmp; struct _pool_chain_shared *cur_shared = pool->shared_pool, *tmp_shared; - struct _pool_destructors *destructor = pool->destructors; + struct _pool_destructors *destructor; POOL_MTX_LOCK (); /* Call all pool destructors */ - while (destructor) { + DL_FOREACH (pool->destructors, destructor) { /* Avoid calling destructors for NULL pointers */ if (destructor->data != NULL) { destructor->func (destructor->data); } - destructor = destructor->prev; } while (cur) { diff --git a/src/libutil/mem_pool.h b/src/libutil/mem_pool.h index 7403ced29..4552e8ca3 100644 --- a/src/libutil/mem_pool.h +++ b/src/libutil/mem_pool.h @@ -78,7 +78,7 @@ struct _pool_destructors { void *data; /**< data to free */ const gchar *function; /**< function from which this destructor was added */ const gchar *loc; /**< line number */ - struct _pool_destructors *prev; /**< chain link */ + struct _pool_destructors *prev, *next; /**< chain link */ }; /** -- 2.39.5