diff --git a/daemon/call.c b/daemon/call.c index dba72c67f..638d99dc3 100644 --- a/daemon/call.c +++ b/daemon/call.c @@ -5551,7 +5551,7 @@ static call_t *call_create(const str *callid) { ilog(LOG_NOTICE, "Creating new call"); c = obj_alloc0(call_t, __call_free); - arena_init(&c->buffer, g_malloc, g_free); + arena_init(&c->buffer, memory_arena_malloc, memory_arena_free); rwlock_init(&c->master_lock); c->tags = str_ml_ht_new(); c->viabranches = str_ml_ht_new(); diff --git a/daemon/memory_arena.c b/daemon/memory_arena.c index f5fb9066b..eaea35137 100644 --- a/daemon/memory_arena.c +++ b/daemon/memory_arena.c @@ -1,3 +1,13 @@ #include "memory_arena.h" +#include __thread memory_arena_t *memory_arena; + +void *memory_arena_malloc(size_t size) { + return mmap(NULL, size, PROT_READ | PROT_WRITE, MAP_PRIVATE | MAP_ANONYMOUS, -1, 0); +} + +void memory_arena_free(void *p) { + size_t *s = p; // first element is the size + munmap(p, *s); +} diff --git a/include/memory_arena.h b/include/memory_arena.h index 4abe0e85c..0d7a2be69 100644 --- a/include/memory_arena.h +++ b/include/memory_arena.h @@ -8,6 +8,9 @@ typedef arena_t memory_arena_t; extern __thread memory_arena_t *memory_arena; +void *memory_arena_malloc(size_t); +void memory_arena_free(void *); + INLINE void *__memory_arena_alloc(size_t len) { void *ret; ret = arena_alloc(memory_arena, len); diff --git a/lib/arena.c b/lib/arena.c index fcf2e9e5d..01fadeb1c 100644 --- a/lib/arena.c +++ b/lib/arena.c @@ -7,7 +7,9 @@ // enable to perform each allocation separately, to make debugging (valgrind...) easier //#define ARENA_ALLOC_DEBUG + struct arena_piece { + size_t size; // must be first char *tail; size_t left; struct arena_piece *next; @@ -38,6 +40,7 @@ static struct arena_piece *arena_piece_new(arena_t *arena, size_t size, void *(* if (!ret) return NULL; + ret->size = alloc_size; ret->tail = ret->buf; ret->left = alloc_size - overhead; ret->next = NULL;