From b76dce3d44364e14fe31f5a13cf58344c2bd9c14 Mon Sep 17 00:00:00 2001 From: fredrikr79 Date: Sat, 1 Mar 2025 19:51:06 +0100 Subject: [PATCH] feat: implement utils/arena.c --- src/utils/arena.c | 64 +++++++++++++++++++++++++++++++++++++++++++++++ src/utils/arena.h | 20 +++++++++++++++ 2 files changed, 84 insertions(+) create mode 100644 src/utils/arena.c create mode 100644 src/utils/arena.h diff --git a/src/utils/arena.c b/src/utils/arena.c new file mode 100644 index 0000000..d6a7949 --- /dev/null +++ b/src/utils/arena.c @@ -0,0 +1,64 @@ +#include "arena.h" +#include +#include +#include +#include + +#define KB(x) x * 1024 + +void arena_init(Arena *a, size_t size) { + *a = (Arena){.buffer = malloc(size), .size = size, .offset = 0}; + if (a->buffer == NULL) + err(EXIT_FAILURE, "malloc"); +} + +void *arena_alloc(Arena *a, size_t n, size_t n_size, size_t alignsize) { + if (alignsize == 0 || (alignsize & (alignsize - 1)) == 1) { + return NULL; + } + + size_t allocation_size = n * n_size; + + if (allocation_size < n_size) { + return NULL; + } + + size_t total_offset = (size_t)a->offset + (size_t)a->buffer; + size_t padding = (~total_offset + 1) & (alignsize - 1); + + total_offset += padding; + if (total_offset + allocation_size > (size_t)a->size + (size_t)a->buffer) { + return NULL; + } + + a->offset += (padding + allocation_size); + memset((void *)total_offset, 0, allocation_size); + return (void *)total_offset; +} + +void arena_reset(Arena *a) { + a->offset = 0; + memset(a->buffer, 0, a->size); +} + +void arena_free(Arena *a) { + free(a->buffer); + a->size = 0; + a->offset = 0; + free(a); +} + +int main(void) { + printf("this is the `arena.c` utility main method.\n"); + + Arena a = {0}; + arena_init(&a, KB(2)); + + int *t = arena_alloc(&a, 6, sizeof(int), _Alignof(int)); + + for (int *i = t; i < t + 6; i++) { + printf("%d ", *i); + } + + return 0; +} diff --git a/src/utils/arena.h b/src/utils/arena.h new file mode 100644 index 0000000..dd1a50c --- /dev/null +++ b/src/utils/arena.h @@ -0,0 +1,20 @@ +#ifndef ARENA_H_ +#define ARENA_H_ + +#include + +typedef struct { + char *buffer; + size_t size; + int offset; +} Arena; + +void arena_init(Arena *a, size_t size); + +void *arena_alloc(Arena *a, size_t n, size_t n_size, size_t alignsize); + +void arena_reset(Arena *a); + +void arena_free(Arena *a); + +#endif // ARENA_H_