]> source.dussan.org Git - rspamd.git/commitdiff
Preserve destructors order as LIFO.
authorVsevolod Stakhov <vsevolod@highsecure.ru>
Thu, 1 Jan 2015 15:45:22 +0000 (15:45 +0000)
committerVsevolod Stakhov <vsevolod@highsecure.ru>
Thu, 1 Jan 2015 15:45:22 +0000 (15:45 +0000)
src/libutil/mem_pool.c
src/libutil/mem_pool.h

index 6c9ee6f1637ab4cf3786bd73834eeb55d71f04ab..a292c082ac89ec167dea308cb18d369efc0431b6 100644 (file)
@@ -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) {
index 7403ced29bec05a1893885af52fd0c40602d52c8..4552e8ca330f866c2b2208546e52649e92bd84a7 100644 (file)
@@ -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                                                         */
 };
 
 /**