diff --git a/include/arena.h b/include/arena.h index b63fdb6..121bedd 100644 --- a/include/arena.h +++ b/include/arena.h @@ -46,7 +46,7 @@ typedef struct { } ArenaSizeResult; ArenaErr arena_init(Arena **arena, size_t capacity); -void arena_destroy(Arena **arena); +ArenaErr arena_destroy(Arena **arena); ArenaPointer arena_alloc(Arena *arena, size_t size, size_t alignment); ArenaPointer arena_push(Arena *arena, void *data, size_t size, size_t alignment); diff --git a/src/arena.c b/src/arena.c index d2e3f48..e92bb0a 100644 --- a/src/arena.c +++ b/src/arena.c @@ -12,30 +12,49 @@ struct Arena { }; -ArenaResult arena_init(size_t capacity) { +ArenaErr arena_init(Arena **arena, size_t capacity) { + if (arena == NULL) { + return ARENA_NULL_ARG; + } + if (capacity < 1) { - return (ArenaResult) {.is_valid = false, .err = ARENA_INVALID_SIZE}; + return ARENA_INVALID_SIZE; + } + + Arena *new_arena = malloc(sizeof(Arena)); + if (new_arena == NULL) { + return ARENA_BAD_ALLOC; } void *buffer = malloc(capacity); if (buffer == NULL) { - return (ArenaResult) {.is_valid = false, .err = ARENA_BAD_ALLOC}; + return ARENA_BAD_ALLOC; } - Arena new_arena = { + *new_arena = (Arena) { .buffer = buffer, .capacity = capacity, .offset = 0, }; - return (ArenaResult) {.is_valid = true, .arena = new_arena}; + *arena = new_arena; + + return ARENA_OK; } -void arena_destroy(Arena *arena) { - free(arena->buffer); - arena->buffer = NULL; - arena->offset = 0; - arena->capacity = 0; +ArenaErr arena_destroy(Arena **arena) { + if (arena == NULL || *arena == NULL) { + return ARENA_NULL_ARG; + } + + free((*arena)->buffer); + (*arena)->buffer = NULL; + (*arena)->offset = 0; + (*arena)->capacity = 0; + free(arena); + *arena = NULL; + + return ARENA_OK; } ArenaPointer arena_alloc(Arena *arena, size_t size, size_t alignment) { @@ -56,6 +75,11 @@ ArenaPointer arena_alloc(Arena *arena, size_t size, size_t alignment) { return (ArenaPointer) {.is_valid = false, .err = padding.err}; } + ArenaErr cap_err = arena_ensure_capacity(arena, size, alignment); + if(cap_err != ARENA_OK) { + return (ArenaPointer) {.is_valid = false, .err = cap_err}; + } + if (arena->offset + padding.val + size > arena->capacity) { return (ArenaPointer) {.is_valid = false, .err = ARENA_OUT_OF_SPACE}; }