]> git.ipfire.org Git - thirdparty/rspamd.git/commitdiff
Fix issues with debug mode of mempool
authorVsevolod Stakhov <vsevolod@highsecure.ru>
Thu, 14 Jan 2016 14:11:50 +0000 (14:11 +0000)
committerVsevolod Stakhov <vsevolod@highsecure.ru>
Thu, 14 Jan 2016 14:11:50 +0000 (14:11 +0000)
src/libutil/mem_pool.c
src/libutil/mem_pool.h

index b89d0d11084e22b4b0cc58d8a3e7c733bb028ce1..5ef6f9de891dff259f290f5b7658ca4937afb49d 100644 (file)
@@ -259,13 +259,11 @@ rspamd_mempool_new (gsize size, const gchar *tag)
                env_checked = TRUE;
        }
 
-       new = g_slice_alloc (sizeof (rspamd_mempool_t));
-       memset (new->pools, 0, sizeof (gpointer) * RSPAMD_MEMPOOL_MAX);
+       new = g_slice_alloc0 (sizeof (rspamd_mempool_t));
        new->destructors = g_array_sized_new (FALSE, FALSE,
                        sizeof (struct _pool_destructors), 32);
        rspamd_mempool_create_pool_type (new, RSPAMD_MEMPOOL_NORMAL);
        /* Set it upon first call of set variable */
-       new->variables = NULL;
        new->elt_len = size;
 
        if (tag) {
@@ -303,7 +301,12 @@ memory_pool_alloc_common (rspamd_mempool_t * pool, gsize size,
 
                        ptr = g_malloc (size);
                        POOL_MTX_UNLOCK ();
-                       rspamd_mempool_add_destructor (pool, g_free, ptr);
+
+                       if (pool->trash_stack == NULL) {
+                               pool->trash_stack = g_ptr_array_sized_new (128);
+                       }
+
+                       g_ptr_array_add (pool->trash_stack, ptr);
 
                        return ptr;
                }
@@ -510,6 +513,7 @@ rspamd_mempool_delete (rspamd_mempool_t * pool)
 {
        struct _pool_chain *cur;
        struct _pool_destructors *destructor;
+       gpointer ptr;
        guint i, j;
 
        POOL_MTX_LOCK ();
@@ -547,6 +551,15 @@ rspamd_mempool_delete (rspamd_mempool_t * pool)
                g_hash_table_destroy (pool->variables);
        }
 
+       if (pool->trash_stack) {
+               for (i = 0; i < pool->trash_stack->len; i++) {
+                       ptr = g_ptr_array_index (pool->trash_stack, i);
+                       g_free (ptr);
+               }
+
+               g_ptr_array_free (pool->trash_stack, TRUE);
+       }
+
        g_atomic_int_inc (&mem_pool_stat->pools_freed);
        POOL_MTX_UNLOCK ();
        g_slice_free (rspamd_mempool_t, pool);
@@ -758,6 +771,7 @@ rspamd_mempool_get_mutex (rspamd_mempool_t * pool)
                pthread_mutex_init (res, &mattr);
                rspamd_mempool_add_destructor (pool,
                                (rspamd_mempool_destruct_t)pthread_mutex_destroy, res);
+               pthread_mutexattr_destroy (&mattr);
 
                return res;
        }
@@ -791,6 +805,7 @@ rspamd_mempool_get_rwlock (rspamd_mempool_t * pool)
                pthread_rwlock_init (res, &mattr);
                rspamd_mempool_add_destructor (pool,
                                (rspamd_mempool_destruct_t)pthread_rwlock_destroy, res);
+               pthread_rwlockattr_destroy (&mattr);
 
                return res;
        }
index fb54133b4f4cde72385e9082f64cdea09b76d4b9..6f631e35d8fc39425900d37ee1d29c04050fe2f1 100644 (file)
@@ -93,6 +93,7 @@ struct rspamd_mutex_s;
 typedef struct memory_pool_s {
        GPtrArray *pools[RSPAMD_MEMPOOL_MAX];
        GArray *destructors;
+       GPtrArray *trash_stack;
        GHashTable *variables;                  /**< private memory pool variables                      */
        gsize elt_len;                                                  /**< size of an element                                         */
        struct rspamd_mempool_tag tag;          /**< memory pool tag                                            */