From a3fdf44e42b988185d1bedd9521b17b34969e75e Mon Sep 17 00:00:00 2001 From: "@syxhe" Date: Mon, 24 Mar 2025 22:45:27 -0500 Subject: Add a flag to control whether arena alloc functions are xalloc or normal. Improve error handling --- src/arena.c | 56 +++++++++++++++++++++----------------------------------- src/arena.h | 4 ++++ 2 files changed, 25 insertions(+), 35 deletions(-) diff --git a/src/arena.c b/src/arena.c index d340f3a..870edca 100644 --- a/src/arena.c +++ b/src/arena.c @@ -7,6 +7,8 @@ #include #include +#define VALLOC(nmemb, size) ((___VXGG___USE_XALLOC_FOR_ARENAS___ > 0) ? xcalloc((nmemb), (size)) : malloc((nmemb) * (size))) + typedef struct an { void *membase; void *memcur; @@ -25,7 +27,7 @@ typedef struct arena { } arena; int arenanode_init(arenanode **an, size_t bytes) { - (*an) = xcalloc(1, sizeof(**an)); + (*an) = VALLOC(1, sizeof(**an)); if(!(*an)) return -1; @@ -33,7 +35,7 @@ int arenanode_init(arenanode **an, size_t bytes) { (*an)->used = 0; (*an)->next = NULL; - void *mem = xcalloc(bytes, 1); + void *mem = VALLOC(bytes, 1); if(!mem) { free((*an)); (*an) = NULL; @@ -50,7 +52,7 @@ int arena_init(arena **a, size_t bytes) { if(!ISPOWOF2(MEM_ALIGN_BYTES)) XALLOC_EXIT(" \"MEM_ALIGN_BYTES\" is not a power of 2. Refusing to create a new arena"); - (*a) = xcalloc(1, sizeof(**a)); + (*a) = VALLOC(1, sizeof(**a)); if(!(*a)) return -1; (*a)->start = NULL; @@ -71,16 +73,12 @@ int arena_init(arena **a, size_t bytes) { } void* arena_alloc(arena * const arena, size_t bytes) { - if(!arena) { - errno = EINVAL; - return NULL; - } - if(bytes > arena->node_memspace) { - errno = ENOMEM; - return NULL; - } if(!ISPOWOF2(MEM_ALIGN_BYTES)) XALLOC_EXIT(" \"MEM_ALIGN_BYTES\" is not a power of 2. Refusing to allocate any memory"); + if(!arena) + RETURNWERR(EINVAL, NULL); + if(bytes > arena->node_memspace) + RETURNWERR(ENOMEM, NULL); if(bytes > ((arena->current)->allocated - (arena->current)->used)) { arenanode *new; @@ -106,14 +104,10 @@ void* arena_alloc(arena * const arena, size_t bytes) { } int arena_free(arena **arena) { - if(!arena) { - errno = EINVAL; - return -1; - } - if(!(*arena)) { - errno = EINVAL; - return -1; - } + if(!arena) + RETURNWERR(EINVAL, -1); + if(!(*arena)) + RETURNWERR(EINVAL, -1); (*arena)->current = (*arena)->start; for(arenanode *n; (*arena)->current != NULL;) { @@ -131,14 +125,10 @@ int arena_free(arena **arena) { } int arena_clear(arena **arena) { - if(!arena) { - errno = EINVAL; - return -1; - } - if(!(*arena)) { - errno = EINVAL; - return -1; - } + if(!arena) + RETURNWERR(EINVAL, -1); + if(!(*arena)) + RETURNWERR(EINVAL, -1); size_t bytes = (*arena)->node_memspace; @@ -162,14 +152,10 @@ void* simplearena_alloc(simplearena * const a, size_t bytes) { // The criteria to allocate new memory in arena_alloc is 'bytes > ((a->current)->allocated - (a->current)->used)', so if this // is true, just return NULL & set errno - if(!a) { - errno = EINVAL; - return NULL; - } - if(bytes > ((a->current)->allocated - (a->current)->used)) { - errno = ENOMEM; - return NULL; - } + if(!a) + RETURNWERR(EINVAL, NULL); + if(bytes > ((a->current)->allocated - (a->current)->used)) + RETURNWERR(ENOMEM, NULL); return arena_alloc(a, bytes); } diff --git a/src/arena.h b/src/arena.h index 23dc664..a94001b 100644 --- a/src/arena.h +++ b/src/arena.h @@ -3,6 +3,10 @@ #include +// Whether to use `XALLOC` or normal `malloc` functions for acquiring new memory in an arena. `> 0` +// enables XALLOC functionality +#define ___VXGG___USE_XALLOC_FOR_ARENAS___ 1 + typedef struct arena arena; typedef arena simplearena; -- cgit v1.2.3