From 55632d07eb170244cf6a0688ecd62b12d29918cc Mon Sep 17 00:00:00 2001 From: rhuibertsjr Date: Sun, 21 Apr 2024 11:11:28 +0200 Subject: [PATCH] Added: base.h and arena allocator implementation --- docs/CHANGELOG | 4 ++++ src/arena.c | 40 ++++++++++++++++++++++++++++++++++++++++ src/arena.h | 31 +++++++++++++++++++++++++++++++ src/base.h | 27 +++++++++++++++++++++++++++ src/main.c | 5 +++++ 5 files changed, 107 insertions(+) create mode 100644 src/arena.c create mode 100644 src/arena.h create mode 100644 src/base.h diff --git a/docs/CHANGELOG b/docs/CHANGELOG index c703d66..02073d0 100644 --- a/docs/CHANGELOG +++ b/docs/CHANGELOG @@ -1,3 +1,7 @@ +21-04-2024 René Huiberts + + Added: base.h and arena allocator implementation + 21-04-2024 René Huiberts Added: project layout diff --git a/src/arena.c b/src/arena.c new file mode 100644 index 0000000..ea5a11c --- /dev/null +++ b/src/arena.c @@ -0,0 +1,40 @@ +internal Arena * +arena_initialize(u64 size) +{ + Arena *result = 0; + + void *backing_buffer = malloc(size); + + if (backing_buffer != NULL) + { + result = (Arena*) backing_buffer; + + result->buffer = backing_buffer; + result->offset = sizeof(Arena); + result->size = sizeof(Arena) + size; + } + + return result; +} + +internal void * +arena_allocate(Arena *arena, u64 size) +{ + void *result = 0; + + if (arena->offset + size <= arena->size) + { + result = (void*)((u64) arena->buffer + (u64) arena->offset); + arena->offset += size; + + memset(result, 0, size); + } + + return result; +} + +internal void +arena_release(Arena *arena) +{ + arena->offset = 0; +} diff --git a/src/arena.h b/src/arena.h new file mode 100644 index 0000000..b07866f --- /dev/null +++ b/src/arena.h @@ -0,0 +1,31 @@ +#ifndef ARENA_H +#define ARENA_H + +typedef struct Arena Arena; +struct Arena { + u64 *buffer; + u64 offset; + u64 size; +}; + +internal Arena * arena_initialize(u64 size); + +internal void * arena_allocate(Arena *arena, u64 size); +internal void arena_release(Arena *arena); + +//= rhjr: arena helpers + +#define arena_push_array(arena, type, count) \ + (type*) arena_allocate((arena), sizeof(type) * (count)) + +#define arena_push(arena, type) \ + (type*) arena_allocate((arena), sizeof(type)) + +//= rhjr: memory helpers + +#define memory_zero(s,z) memset((s), 0, (z)) +#define memory_zero_struct(s) memory_zero((s), sizeof(*(s))) + +#define memory_copy(dst, src, length) memmove((dst), (src), (length)) + +#endif // ARENA_H diff --git a/src/base.h b/src/base.h new file mode 100644 index 0000000..6b578c1 --- /dev/null +++ b/src/base.h @@ -0,0 +1,27 @@ +#ifndef BASE_H +#define BASE_H + +#include +#include +#include +#include + +#define internal static + +typedef uint8_t u8; +typedef uint16_t u16; +typedef uint32_t u32; +typedef uint64_t u64; + +typedef int8_t i8; +typedef int16_t i16; +typedef int32_t i32; +typedef int64_t i64; + +#define KB(b) ((b) << 10) +#define MB(b) ((b) << 20) + +#define STATEMENT(S) do{ S } while(0) +#define ASSERT(c) STATEMENT( if (!(c)){ (*(volatile int*)0 = 0); } ) + +#endif // BASE_H diff --git a/src/main.c b/src/main.c index 77bc677..3731b84 100644 --- a/src/main.c +++ b/src/main.c @@ -1,3 +1,8 @@ +#include "base.h" +#include "arena.h" + +#include "arena.c" + int main(void) {