aboutsummaryrefslogtreecommitdiffstats
path: root/src/libutil
diff options
context:
space:
mode:
authorVsevolod Stakhov <vsevolod@highsecure.ru>2015-01-01 15:45:22 +0000
committerVsevolod Stakhov <vsevolod@highsecure.ru>2015-01-01 15:45:22 +0000
commit1f2c83f096f28ce79e828edd1ab545a341f10451 (patch)
tree23435217ea1c173b2932ff80f786a80da72b0d40 /src/libutil
parent9a92839e4e1a990c4054847460592b3bd42406bf (diff)
downloadrspamd-1f2c83f096f28ce79e828edd1ab545a341f10451.tar.gz
rspamd-1f2c83f096f28ce79e828edd1ab545a341f10451.zip
Preserve destructors order as LIFO.
Diffstat (limited to 'src/libutil')
-rw-r--r--src/libutil/mem_pool.c13
-rw-r--r--src/libutil/mem_pool.h2
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 */
};
/**