From 9c93b37557ad95dd28df71718c484a13806dd544 Mon Sep 17 00:00:00 2001 From: olemorud Date: Sun, 14 May 2023 23:50:43 +0200 Subject: [PATCH] Initial commit --- arena.h | 12 +++++++++ arena_alloc.c | 63 ++++++++++++++++++++++++++++++++++++++++++++++ test_arena_alloc.c | 31 +++++++++++++++++++++++ 3 files changed, 106 insertions(+) create mode 100644 arena.h create mode 100644 arena_alloc.c create mode 100644 test_arena_alloc.c diff --git a/arena.h b/arena.h new file mode 100644 index 0000000..d07e761 --- /dev/null +++ b/arena.h @@ -0,0 +1,12 @@ + +#include // ptrdiff_t + +struct arena { + void *start, + *next; + ptrdiff_t cap; +} __attribute__((aligned(64))); + +struct arena* arena_new(); +void arena_reset(struct arena *a); +void* arena_alloc(struct arena *a, size_t len); diff --git a/arena_alloc.c b/arena_alloc.c new file mode 100644 index 0000000..cbf9f49 --- /dev/null +++ b/arena_alloc.c @@ -0,0 +1,63 @@ + + +#include "arena.h" +#include +#include +#include +#include // ptrdiff_t +#include + +#define ARENA_PAGES ((size_t)(128)) + +#define ALIGN 1 + +struct arena* arena_new() +{ + size_t page_size = sysconf(_SC_PAGE_SIZE); + size_t size = page_size * ARENA_PAGES; + + void *p = mmap( + NULL, + size, + PROT_READ | PROT_WRITE, + MAP_ANONYMOUS | MAP_PRIVATE, + -1, /* man mmap(2): "[...], some implementations require fd to be + -1 if MAP_ANONYMOUS is specified [...]" */ + 0 + ); + + if (p == MAP_FAILED) { + return NULL; + } + + struct arena a = { + .start = p + sizeof(struct arena), + .next = p + sizeof(struct arena), + .cap = size + }; + + memcpy(p, &a, sizeof a); + + return p; +} + + +void arena_reset(struct arena *a) +{ + a->next = a->start; +} + + +void* arena_alloc(struct arena *a, size_t len) +{ + void *p = a->next; + a->next += len; + + if (a->next - a->start >= a->cap) { + errno = ENOMEM; + return NULL; + } + + return p; +} + diff --git a/test_arena_alloc.c b/test_arena_alloc.c new file mode 100644 index 0000000..cef10bc --- /dev/null +++ b/test_arena_alloc.c @@ -0,0 +1,31 @@ + + + +// _start test_arena_alloc.c +#include "arena.h" +#include +#include +#include + +static struct arena *default_arena = NULL; + +int main() +{ + default_arena = arena_new(); + + if (default_arena == NULL) { + err(errno, "failed to allocate arena"); + } + + char *p = arena_alloc(default_arena, sizeof p * 11); + + for (size_t i=0; i<10; ++i) { + p[i] = 'A'; + } + + p[10] = '\0'; + + printf("%s", p); + + return 0; +}