MT#55283 use mmap for long running arenas

Rel: #2165

Change-Id: I5e529dbd5920870cbff09c7002aadc1f499abf82
master
Richard Fuchs 5 days ago
parent 40b17bd933
commit 7f69e7f527

@ -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();

@ -1,3 +1,13 @@
#include "memory_arena.h"
#include <sys/mman.h>
__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);
}

@ -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);

@ -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;

Loading…
Cancel
Save