#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;
}
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;
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;
}
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);
}
/*
#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);
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
--- /dev/null
+#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);
+}
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 ();
}
/* 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