]> source.dussan.org Git - rspamd.git/commitdiff
* Optimize memory pools allocator
authorcebka@mailsupport.rambler.ru <cebka@mailsupport.rambler.ru>
Sun, 21 Sep 2008 21:08:41 +0000 (01:08 +0400)
committercebka@mailsupport.rambler.ru <cebka@mailsupport.rambler.ru>
Sun, 21 Sep 2008 21:08:41 +0000 (01:08 +0400)
* Add test case for memory pools

mem_pool.c
mem_pool.h
test/Makefile.in
test/rspamd_mem_pool_test.c [new file with mode: 0644]
test/rspamd_test_suite.c
test/tests.h

index 3c583d07cac15b6e288124042f0a592f3e084de0..c6afbfa9fe81e3596390cae8c11042b0a8d72320 100644 (file)
@@ -2,16 +2,27 @@
 #include <glib.h>
 #include "mem_pool.h"
 
+static struct _pool_chain *
+pool_chain_new (size_t size) 
+{
+       struct _pool_chain *chain;
+       chain = g_malloc (sizeof (struct _pool_chain));
+       chain->begin = g_malloc (size);
+       chain->len = size;
+       chain->pos = chain->begin;
+       chain->next = NULL;
+
+       return chain;
+}
+
 memory_pool_t* 
 memory_pool_new (size_t size)
 {
        memory_pool_t *new;
 
        new = g_malloc (sizeof (memory_pool_t));
-       new->begin = g_malloc (size);
-       new->len = size;
-       new->pos = new->begin;
-       new->next = NULL;
+       new->cur_pool = pool_chain_new (size);
+       new->first_pool = new->cur_pool;
 
        return new;
 }
@@ -20,10 +31,10 @@ void *
 memory_pool_alloc (memory_pool_t *pool, size_t size)
 {
        u_char *tmp;
-       memory_pool_t *new, *cur;
+       struct _pool_chain *new, *cur;
 
        if (pool) {
-               cur = pool;
+               cur = pool->cur_pool;
                /* Find free space in pool chain */
                while (memory_pool_free (cur) < size && cur->next) {
                        cur = cur->next;
@@ -31,12 +42,14 @@ memory_pool_alloc (memory_pool_t *pool, size_t size)
                if (cur->next == NULL) {
                        /* Allocate new pool */
                        if (cur->len > size) {
-                               new = memory_pool_new (cur->len);
+                               new = pool_chain_new (cur->len);
                        }
                        else {
-                               new = memory_pool_new (size + cur->len);
+                               new = pool_chain_new (size + cur->len);
                        }
+                       /* Attach new pool to chain */
                        cur->next = new;
+                       pool->cur_pool = new;
                        new->pos += size;
                        return new->begin;
                }       
@@ -47,15 +60,17 @@ memory_pool_alloc (memory_pool_t *pool, size_t size)
        return NULL;
 }
 
-void memory_pool_delete (memory_pool_t *pool)
+void
+memory_pool_delete (memory_pool_t *pool)
 {
-       memory_pool_t *cur = pool, *tmp;
+       struct _pool_chain *cur = pool->first_pool, *tmp;
        while (cur) {
                tmp = cur;
                cur = cur->next;
                g_free (tmp->begin);
                g_free (tmp);
        }
+       g_free (pool);
 }
 
 /*
index fc487c97c183cdae3548140904c539b482048ff8..0927d919728a1a902d2153f8bc3d9c43137ba6b1 100644 (file)
@@ -3,12 +3,15 @@
 
 #include <sys/types.h>
 #include <glib.h>
-
+struct _pool_chain {
+               u_char *begin;
+               u_char *pos;
+               size_t len;
+               struct _pool_chain *next;
+};
 typedef struct memory_pool_s {
-       u_char *begin;
-       u_char *pos;
-       size_t len;
-       struct memory_pool_s *next;
+       struct _pool_chain *cur_pool;
+       struct _pool_chain *first_pool;
 } memory_pool_t;
 
 memory_pool_t* memory_pool_new (size_t size);
index ddd298c7ce423d097628ab22a701e70942ffb114..14a2646b9de422bd2f218db18b1c245a5b589a9b 100644 (file)
@@ -3,7 +3,7 @@
 all: rspamd_test_suite
 
 rspamd_test_suite: $(OBJECTS) ../url.o ../util.o ../memcached.o
-       $(CC) $(PTHREAD_LDFLAGS) $(LDFLAGS) $(OBJECTS) ../url.o ../util.o ../memcached.o $(LIBS) -o rspamd_test_suite
+       $(CC) $(PTHREAD_LDFLAGS) $(LDFLAGS) $(OBJECTS) ../url.o ../util.o ../memcached.o ../mem_pool.o $(LIBS) -o rspamd_test_suite
 
 run_test: rspamd_test_suite
        gtester --verbose -k -o=rspamd_test.xml ./rspamd_test_suite
diff --git a/test/rspamd_mem_pool_test.c b/test/rspamd_mem_pool_test.c
new file mode 100644 (file)
index 0000000..5b2bf37
--- /dev/null
@@ -0,0 +1,27 @@
+#include "../mem_pool.h"
+#include "tests.h"
+
+#include <stdio.h>
+#include <glib.h>
+
+#define TEST_BUF "test bufffer"
+#define TEST2_BUF "test bufffertest bufffer"
+
+void
+rspamd_mem_pool_test_func ()
+{
+       memory_pool_t *pool;
+       char *tmp, *tmp2;
+
+       pool = memory_pool_new (sizeof (TEST_BUF));
+       tmp = memory_pool_alloc (pool, sizeof (TEST_BUF));
+       tmp2 = memory_pool_alloc (pool, sizeof (TEST_BUF) * 2);
+
+       snprintf (tmp, sizeof (TEST_BUF), "%s", TEST_BUF);
+       snprintf (tmp2, sizeof (TEST_BUF) * 2, "%s", TEST2_BUF);
+
+       g_assert (strncmp (tmp, TEST_BUF, sizeof (TEST_BUF)) == 0);
+       g_assert (strncmp (tmp2, TEST2_BUF, sizeof (TEST2_BUF)) == 0);
+       
+       memory_pool_delete (pool);
+}
index 09db78496e372a9fc01ea5d3a280b0ec55843075..c7c239f8779bbdfcfa6d708e87df97705f4bfc2e 100644 (file)
@@ -20,8 +20,9 @@ main (int argc, char **argv)
 
        g_test_init (&argc, &argv, NULL);
 
-       g_test_add_func ("/rspamd/url", rspamd_url_test_func);
        g_test_add_func ("/rspamd/memcached", rspamd_memcached_test_func);
+       g_test_add_func ("/rspamd/mem_pool", rspamd_mem_pool_test_func);
+       g_test_add_func ("/rspamd/url", rspamd_url_test_func);
 
        g_test_run ();
 }
index 85e111b2b3c3188a034ac84b24acb31dacb0173d..3eddf92fc063d84210bbbd63f809508de5ed4e98 100644 (file)
@@ -8,7 +8,10 @@
 /* URL parser test */
 void rspamd_url_test_func ();
 
-/* Memceched library test */
+/* Memcached library test */
 void rspamd_memcached_test_func ();
 
+/* Memory pools */
+void rspamd_mem_pool_test_func ();
+
 #endif