refactor-xmake #2

Merged
laentropia merged 5 commits from refactor-xmake into main 2026-06-10 10:30:26 -06:00
3 changed files with 70 additions and 8 deletions
Showing only changes of commit 73dc05bc63 - Show all commits

View File

@@ -30,6 +30,15 @@ typedef struct {
}; };
} ArenaPointer; } ArenaPointer;
typedef struct {
bool is_valid;
union {
ArenaErr err;
Allocator allocator;
};
} ArenaAllocResult;
typedef struct { typedef struct {
bool is_valid; bool is_valid;
union { union {
@@ -54,4 +63,6 @@ ArenaSizeResult arena_get_align_padding(Arena *arena, size_t alignment);
// I shouldn't cover. // I shouldn't cover.
ArenaErr arena_ensure_capacity(Arena *arena, size_t size, size_t alignment); ArenaErr arena_ensure_capacity(Arena *arena, size_t size, size_t alignment);
ArenaAllocResult arena_get_allocator(Arena *arena);
#endif // !RENA_H #endif // !RENA_H

View File

@@ -1,5 +1,6 @@
#include "lae_arena.h" #include "lae_arena.h"
#include "lae_allocator.h" #include "lae_allocator.h"
#include <stdalign.h>
#include <stdbool.h> #include <stdbool.h>
#include <stddef.h> #include <stddef.h>
#include <stdint.h> #include <stdint.h>
@@ -14,6 +15,16 @@ struct Arena {
Allocator allocator; Allocator allocator;
}; };
static void *arena_allocator_alloc(void *ctx, size_t size, size_t alignment);
static void *arena_allocator_realloc(
void *ctx,
void *pointer,
size_t old_size,
size_t new_size,
size_t alignment);
static void
arena_allocator_free(void *ctx, void *pointer, size_t size, size_t alignment);
ArenaErr arena_init(Arena **arena, Allocator allocator, size_t capacity) { ArenaErr arena_init(Arena **arena, Allocator allocator, size_t capacity) {
if (arena == NULL) { if (arena == NULL) {
return ARENA_NULL_ARG; return ARENA_NULL_ARG;
@@ -23,14 +34,15 @@ ArenaErr arena_init(Arena **arena, Allocator allocator, size_t capacity) {
return ARENA_INVALID_SIZE; return ARENA_INVALID_SIZE;
} }
Arena *new_arena = allocator.alloc(allocator.ctx, sizeof(Arena)); Arena *new_arena =
allocator.alloc(allocator.ctx, sizeof(Arena), alignof(Arena));
if (new_arena == NULL) { if (new_arena == NULL) {
return ARENA_BAD_ALLOC; return ARENA_BAD_ALLOC;
} }
void *buffer = allocator.alloc(allocator.ctx, capacity); void *buffer = allocator.alloc(allocator.ctx, capacity, 0);
if (buffer == NULL) { if (buffer == NULL) {
allocator.free(allocator.ctx, new_arena, capacity); allocator.free(allocator.ctx, new_arena, capacity, 0);
return ARENA_BAD_ALLOC; return ARENA_BAD_ALLOC;
} }
@@ -52,11 +64,12 @@ ArenaErr arena_destroy(Arena **arena) {
} }
Arena *tmp = *arena; Arena *tmp = *arena;
tmp->allocator.free(tmp->allocator.ctx, tmp->buffer, tmp->capacity); tmp->allocator.free(tmp->allocator.ctx, tmp->buffer, tmp->capacity, 0);
tmp->buffer = NULL; tmp->buffer = NULL;
tmp->offset = 0; tmp->offset = 0;
tmp->capacity = 0; tmp->capacity = 0;
tmp->allocator.free(tmp->allocator.ctx, *arena, sizeof(Arena)); tmp->allocator
.free(tmp->allocator.ctx, *arena, sizeof(Arena), alignof(Arena));
*arena = NULL; *arena = NULL;
return ARENA_OK; return ARENA_OK;
@@ -200,7 +213,8 @@ ArenaErr arena_resize(Arena *arena, size_t new_capacity) {
arena->allocator.ctx, arena->allocator.ctx,
arena->buffer, arena->buffer,
arena->capacity, arena->capacity,
new_capacity); new_capacity,
0);
if (tmp == NULL) { if (tmp == NULL) {
return ARENA_BAD_ALLOC; return ARENA_BAD_ALLOC;
} }
@@ -233,3 +247,40 @@ void *arena_unwrap_pointer(ArenaPointer p) {
} }
return p.arena->buffer + p.offset; return p.arena->buffer + p.offset;
} }
static void *arena_allocator_alloc(void *ctx, size_t size, size_t alignment) {
Arena *arena = ctx;
return arena_unwrap_pointer(arena_alloc(arena, size, alignment));
}
static void *arena_allocator_realloc(
void *ctx,
void *pointer,
size_t old_size,
size_t new_size,
size_t alignment) {
return NULL;
}
static void
arena_allocator_free(void *ctx, void *pointer, size_t size, size_t alignment) {
return;
}
ArenaAllocResult arena_get_allocator(Arena *arena) {
if (arena == NULL) {
return (ArenaAllocResult){
.is_valid = false,
.err = ARENA_NULL_ARG,
};
}
Allocator allocator = {
.alloc = arena_allocator_alloc,
.realloc = arena_allocator_realloc,
.free = arena_allocator_free,
.ctx = arena};
return (ArenaAllocResult){.is_valid = true, .allocator = allocator};
}

View File

@@ -78,12 +78,12 @@ if has_config("tests") then
target("test_arena") target("test_arena")
set_kind("binary") set_kind("binary")
add_files("test/test_arena.c")
add_deps("lae_arena") add_deps("lae_arena")
add_packages("cmocka") add_packages("cmocka")
add_files("test/test_arena.c")
add_tests("default") add_tests("default")
if has_config("asan") then if has_config("asan") then