]> source.dussan.org Git - rspamd.git/commitdiff
* Avoid realloc for memory pools by making memory pool chains
authorcebka@mailsupport.rambler.ru <cebka@mailsupport.rambler.ru>
Thu, 18 Sep 2008 15:46:21 +0000 (19:46 +0400)
committercebka@mailsupport.rambler.ru <cebka@mailsupport.rambler.ru>
Thu, 18 Sep 2008 15:46:21 +0000 (19:46 +0400)
mem_pool.c
mem_pool.h
worker.c

index 8a6c9d0a5a6ebd956ce01d6503180a6527ab35b3..3c583d07cac15b6e288124042f0a592f3e084de0 100644 (file)
@@ -11,6 +11,7 @@ memory_pool_new (size_t size)
        new->begin = g_malloc (size);
        new->len = size;
        new->pos = new->begin;
+       new->next = NULL;
 
        return new;
 }
@@ -18,31 +19,42 @@ memory_pool_new (size_t size)
 void *
 memory_pool_alloc (memory_pool_t *pool, size_t size)
 {
-       u_char *tmp; 
+       u_char *tmp;
+       memory_pool_t *new, *cur;
+
        if (pool) {
-               if (pool->len < (pool->pos - pool->begin) + size) {
-                       /* Grow pool */
-                       if (pool->len > size) {
-                               pool->len *= 2;
+               cur = pool;
+               /* Find free space in pool chain */
+               while (memory_pool_free (cur) < size && cur->next) {
+                       cur = cur->next;
+               }
+               if (cur->next == NULL) {
+                       /* Allocate new pool */
+                       if (cur->len > size) {
+                               new = memory_pool_new (cur->len);
                        }
                        else {
-                               pool->len += size + pool->len;
+                               new = memory_pool_new (size + cur->len);
                        }
-                       pool->begin = g_realloc (pool->begin, pool->len);
-                       return memory_pool_alloc (pool, size);
+                       cur->next = new;
+                       new->pos += size;
+                       return new->begin;
                }       
-               tmp = pool->pos;
-               pool->pos += size;
+               tmp = cur->pos;
+               cur->pos += size;
                return tmp;
        }
        return NULL;
 }
 
-void memory_pool_free (memory_pool_t *pool)
+void memory_pool_delete (memory_pool_t *pool)
 {
-       if (pool) {
-               g_free (pool->begin);
-               g_free (pool);
+       memory_pool_t *cur = pool, *tmp;
+       while (cur) {
+               tmp = cur;
+               cur = cur->next;
+               g_free (tmp->begin);
+               g_free (tmp);
        }
 }
 
index e86e418dd138d4c79a4e6934066288529fad5c12..fc487c97c183cdae3548140904c539b482048ff8 100644 (file)
@@ -8,11 +8,13 @@ typedef struct memory_pool_s {
        u_char *begin;
        u_char *pos;
        size_t len;
-       size_t used;
+       struct memory_pool_s *next;
 } memory_pool_t;
 
 memory_pool_t* memory_pool_new (size_t size);
 void* memory_pool_alloc (memory_pool_t* pool, size_t size);
-void memory_pool_free (memory_pool_t* pool);
+void memory_pool_delete (memory_pool_t* pool);
+
+#define memory_pool_free(x) ((x)->pos - (x)->begin)
 
 #endif
index 8493aff258301b62b8285a4940dbbeeb4a457455..ea22ffbe271cdf69426277a08bf8afe5c6ffbb84 100644 (file)
--- a/worker.c
+++ b/worker.c
@@ -98,7 +98,7 @@ free_task (struct worker_task *task)
                        free (task->memc_ctx);
                }
                if (task->task_pool) {
-                       memory_pool_free (task->task_pool);
+                       memory_pool_delete (task->task_pool);
                }
                while (!TAILQ_EMPTY (&task->urls)) {
                        cur = TAILQ_FIRST (&task->urls);