Browse Source

Fix an awful memory leak

tags/1.1.0
Vsevolod Stakhov 8 years ago
parent
commit
b739110358
1 changed files with 18 additions and 6 deletions
  1. 18
    6
      src/libutil/mem_pool.c

+ 18
- 6
src/libutil/mem_pool.c View File

@@ -120,8 +120,9 @@ rspamd_mempool_chain_new (gsize size, enum rspamd_mempool_chain_type pool_type)
g_atomic_int_add (&mem_pool_stat->bytes_allocated, size);
}
else {
chain = g_slice_alloc (sizeof (struct _pool_chain));
chain->begin = g_slice_alloc (size);
map = g_slice_alloc (sizeof (struct _pool_chain) + size);
chain = map;
chain->begin = ((guint8 *) chain) + sizeof (struct _pool_chain);
g_atomic_int_add (&mem_pool_stat->bytes_allocated, size);
g_atomic_int_inc (&mem_pool_stat->chunks_allocated);
}
@@ -515,6 +516,7 @@ rspamd_mempool_delete (rspamd_mempool_t * pool)
struct _pool_destructors *destructor;
gpointer ptr;
guint i, j;
gsize len;

POOL_MTX_LOCK ();

@@ -533,13 +535,17 @@ rspamd_mempool_delete (rspamd_mempool_t * pool)
if (pool->pools[i]) {
for (j = 0; j < pool->pools[i]->len; j++) {
cur = g_ptr_array_index (pool->pools[i], j);
g_atomic_int_add (&mem_pool_stat->bytes_allocated,
-((gint)cur->len));
g_atomic_int_add (&mem_pool_stat->chunks_allocated, -1);

len = cur->len + sizeof (struct _pool_chain);

if (i == RSPAMD_MEMPOOL_SHARED) {
munmap ((void *)cur, cur->len +
sizeof (struct _pool_chain));
munmap ((void *)cur, len);
}
else {
g_slice_free1 (sizeof (*cur), cur);
g_slice_free1 (len, cur);
}
}

@@ -570,13 +576,19 @@ rspamd_mempool_cleanup_tmp (rspamd_mempool_t * pool)
{
struct _pool_chain *cur;
guint i;
gsize len;

POOL_MTX_LOCK ();

if (pool->pools[RSPAMD_MEMPOOL_TMP]) {
for (i = 0; i < pool->pools[RSPAMD_MEMPOOL_TMP]->len; i++) {
cur = g_ptr_array_index (pool->pools[RSPAMD_MEMPOOL_TMP], i);
g_slice_free1 (sizeof (*cur), cur);
g_atomic_int_add (&mem_pool_stat->bytes_allocated,
-((gint)cur->len));
g_atomic_int_add (&mem_pool_stat->chunks_allocated, -1);
len = cur->len + sizeof (struct _pool_chain);

g_slice_free1 (len, cur);
}

g_ptr_array_free (pool->pools[RSPAMD_MEMPOOL_TMP], TRUE);

Loading…
Cancel
Save