From 44c776ed0456f847c2543b84bdd1e3a7b460627a Mon Sep 17 00:00:00 2001 From: Warwick Date: Sat, 31 Jan 2026 17:22:12 +0000 Subject: [PATCH] Made deinit tasks cleaner to use --- src/arena_allocator.c | 12 ++++++++++-- src/arena_allocator.h | 9 +++------ src/mesh.c | 5 +---- src/shader.c | 4 +--- src/window.c | 5 +---- 5 files changed, 16 insertions(+), 19 deletions(-) diff --git a/src/arena_allocator.c b/src/arena_allocator.c index 64dc844..ecff7a8 100644 --- a/src/arena_allocator.c +++ b/src/arena_allocator.c @@ -6,6 +6,12 @@ #define DEFAUL_REGION_SIZE 1048576 /* 8 * 1024 * 1024 = 8MB */ +struct ArenaDeinitTask_s { + void *func_param; + void (*func_ptr)(void *); + ArenaDeinitTask *next; +}; + Region *new_region(size_t capacity) { if (capacity < DEFAUL_REGION_SIZE) { capacity = DEFAUL_REGION_SIZE; @@ -126,9 +132,11 @@ void *arena_alloc(Arena *arena, size_t size) { return result; } -void arena_deinit_task_push(Arena *arena, ArenaDeinitTask task) { +void arena_deinit_task_push(Arena *arena, void *func_param, + void (*func_ptr)(void *)) { ArenaDeinitTask *job = arena_alloc(arena, sizeof(ArenaDeinitTask)); - *job = task; + *job = (ArenaDeinitTask){ + .func_ptr = func_ptr, .func_param = func_param, .next = NULL}; ArenaDeinitTask *next_job = arena->deinit_task_top; arena->deinit_task_top = job; diff --git a/src/arena_allocator.h b/src/arena_allocator.h index 6fafa1b..91fd4b0 100644 --- a/src/arena_allocator.h +++ b/src/arena_allocator.h @@ -10,12 +10,8 @@ struct Region_s { unsigned char data[]; }; +struct ArenaDeinitTask_s; typedef struct ArenaDeinitTask_s ArenaDeinitTask; -struct ArenaDeinitTask_s { - void *func_param; - void (*func_ptr)(void *); - ArenaDeinitTask *next; -}; typedef struct Arena_s Arena; struct Arena_s { @@ -30,7 +26,8 @@ struct Arena_s { Arena *arena_init(Arena *parent, size_t capacity); void arena_deinit(Arena *arena); -void arena_deinit_task_push(Arena *arena, ArenaDeinitTask task); +void arena_deinit_task_push(Arena *arena, void *func_param, + void (*func_ptr)(void *)); void *arena_alloc(Arena *arena, size_t size); // void *arena_clear(Arena *arena); diff --git a/src/mesh.c b/src/mesh.c index bcbbc29..f83c30a 100644 --- a/src/mesh.c +++ b/src/mesh.c @@ -93,10 +93,7 @@ wn_mesh *wn_mesh_init(Arena *arena, const float *vertices, size_t vertex_count, // Unbind VAO glBindVertexArray(0); - // Register deinit task - arena_deinit_task_push( - arena, (ArenaDeinitTask){.func_param = mesh, - .func_ptr = (void (*)(void *))wn_mesh_deinit}); + arena_deinit_task_push(arena, mesh, (void (*)(void *))wn_mesh_deinit); return mesh; } diff --git a/src/shader.c b/src/shader.c index 752a0fc..ec6f5f2 100644 --- a/src/shader.c +++ b/src/shader.c @@ -67,9 +67,7 @@ wn_shader *wn_shader_init(Arena *arena, shader->shaderProgram = shaderProgram; shader->success = true; - arena_deinit_task_push(arena, (ArenaDeinitTask){.func_ptr = *wn_shader_deinit, - .func_param = shader, - .next = NULL}); + arena_deinit_task_push(arena, (void *)shader, *wn_shader_deinit); return shader; } diff --git a/src/window.c b/src/window.c index 4bce67d..e652734 100644 --- a/src/window.c +++ b/src/window.c @@ -56,10 +56,7 @@ wn_window *wn_window_init(Arena *arena) { SDL_SetWindowRelativeMouseMode(window->window, true); SDL_GetRelativeMouseState(NULL, NULL); - // add deinit function to arena deinit stack - arena_deinit_task_push(arena, (ArenaDeinitTask){.func_param = (void *)window, - .func_ptr = *wn_window_deinit, - .next = NULL}); + arena_deinit_task_push(arena, (void *)window, *wn_window_deinit); return window; }