From cbc14f9c6199259a48f1fa41bd3dd1fa2992333b Mon Sep 17 00:00:00 2001 From: Warwick Date: Wed, 26 Nov 2025 15:21:20 +0000 Subject: [PATCH] Added the ability to run deinit tasks when deleting arenas --- src/arena_allocator.c | 8 +++++--- src/arena_allocator.h | 3 +-- src/main.c | 19 +++++++++++++++++-- 3 files changed, 23 insertions(+), 7 deletions(-) diff --git a/src/arena_allocator.c b/src/arena_allocator.c index 7fae31d..64dc844 100644 --- a/src/arena_allocator.c +++ b/src/arena_allocator.c @@ -30,7 +30,8 @@ Arena *arena_init(Arena *parent, size_t capacity) { .begin = region, .end = region, .child = NULL, - .sibling = NULL}; + .sibling = NULL, + .deinit_task_top = NULL}; // if parent has no children this arena is now it's child if (parent->child == NULL) { @@ -50,7 +51,8 @@ Arena *arena_init(Arena *parent, size_t capacity) { .begin = region, .end = region, .child = NULL, - .sibling = NULL}; + .sibling = NULL, + .deinit_task_top = NULL}; return arena; } @@ -124,7 +126,7 @@ void *arena_alloc(Arena *arena, size_t size) { return result; } -void arena_run_on_deinit_push(Arena *arena, ArenaDeinitTask task) { +void arena_deinit_task_push(Arena *arena, ArenaDeinitTask task) { ArenaDeinitTask *job = arena_alloc(arena, sizeof(ArenaDeinitTask)); *job = task; diff --git a/src/arena_allocator.h b/src/arena_allocator.h index bffc803..6fafa1b 100644 --- a/src/arena_allocator.h +++ b/src/arena_allocator.h @@ -16,7 +16,6 @@ struct ArenaDeinitTask_s { void (*func_ptr)(void *); ArenaDeinitTask *next; }; -ArenaDeinitTask ArenaDeinitTask_default = {NULL}; typedef struct Arena_s Arena; struct Arena_s { @@ -31,7 +30,7 @@ struct Arena_s { Arena *arena_init(Arena *parent, size_t capacity); void arena_deinit(Arena *arena); -void arena_run_on_deinit_push(Arena *arena, ArenaDeinitTask task); +void arena_deinit_task_push(Arena *arena, ArenaDeinitTask task); void *arena_alloc(Arena *arena, size_t size); // void *arena_clear(Arena *arena); diff --git a/src/main.c b/src/main.c index 867478d..5dd5a75 100644 --- a/src/main.c +++ b/src/main.c @@ -1,5 +1,6 @@ #include #include +#include #include #include "SDL3/SDL_events.h" @@ -10,7 +11,9 @@ #include "arena_allocator.h" -/* +void test_task(void *data) { + printf("\ttest task has been run: %s\n", (char *)data); +} int main(int argc, char *argv[]) { // arena allocation test printf("Allocation test\n"); @@ -33,6 +36,17 @@ int main(int argc, char *argv[]) { Arena *greatsiblinggreatgrandchild_arena = arena_init(greatgrandchildsiblingsibling_arena, 0); + printf("deinit task creation tests\n"); + + ArenaDeinitTask task = {NULL}; + task.func_ptr = *test_task; + task.func_param = "parameter"; + + arena_deinit_task_push(global_arena, task); + + task.func_param = "2nd parameter added"; + arena_deinit_task_push(global_arena, task); + printf("deinit tests\n"); arena_deinit(greatgrandchild_arena); @@ -40,8 +54,8 @@ int main(int argc, char *argv[]) { printf("tests complete\n"); } -*/ +/* int main(int argc, char *argv[]) { wn_window window = {0}; if (!wn_window_init(&window)) { @@ -156,3 +170,4 @@ int main(int argc, char *argv[]) { return EXIT_SUCCESS; } +*/