Made deinit tasks cleaner to use

This commit is contained in:
Warwick 2026-01-31 17:22:12 +00:00
parent 648a0466ec
commit 44c776ed04
5 changed files with 16 additions and 19 deletions

View file

@ -6,6 +6,12 @@
#define DEFAUL_REGION_SIZE 1048576 /* 8 * 1024 * 1024 = 8MB */ #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) { Region *new_region(size_t capacity) {
if (capacity < DEFAUL_REGION_SIZE) { if (capacity < DEFAUL_REGION_SIZE) {
capacity = DEFAUL_REGION_SIZE; capacity = DEFAUL_REGION_SIZE;
@ -126,9 +132,11 @@ void *arena_alloc(Arena *arena, size_t size) {
return result; 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)); 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; ArenaDeinitTask *next_job = arena->deinit_task_top;
arena->deinit_task_top = job; arena->deinit_task_top = job;

View file

@ -10,12 +10,8 @@ struct Region_s {
unsigned char data[]; unsigned char data[];
}; };
struct ArenaDeinitTask_s;
typedef struct ArenaDeinitTask_s ArenaDeinitTask; typedef struct ArenaDeinitTask_s ArenaDeinitTask;
struct ArenaDeinitTask_s {
void *func_param;
void (*func_ptr)(void *);
ArenaDeinitTask *next;
};
typedef struct Arena_s Arena; typedef struct Arena_s Arena;
struct Arena_s { struct Arena_s {
@ -30,7 +26,8 @@ struct Arena_s {
Arena *arena_init(Arena *parent, size_t capacity); Arena *arena_init(Arena *parent, size_t capacity);
void arena_deinit(Arena *arena); 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_alloc(Arena *arena, size_t size);
// void *arena_clear(Arena *arena); // void *arena_clear(Arena *arena);

View file

@ -93,10 +93,7 @@ wn_mesh *wn_mesh_init(Arena *arena, const float *vertices, size_t vertex_count,
// Unbind VAO // Unbind VAO
glBindVertexArray(0); glBindVertexArray(0);
// Register deinit task arena_deinit_task_push(arena, mesh, (void (*)(void *))wn_mesh_deinit);
arena_deinit_task_push(
arena, (ArenaDeinitTask){.func_param = mesh,
.func_ptr = (void (*)(void *))wn_mesh_deinit});
return mesh; return mesh;
} }

View file

@ -67,9 +67,7 @@ wn_shader *wn_shader_init(Arena *arena,
shader->shaderProgram = shaderProgram; shader->shaderProgram = shaderProgram;
shader->success = true; shader->success = true;
arena_deinit_task_push(arena, (ArenaDeinitTask){.func_ptr = *wn_shader_deinit, arena_deinit_task_push(arena, (void *)shader, *wn_shader_deinit);
.func_param = shader,
.next = NULL});
return shader; return shader;
} }

View file

@ -56,10 +56,7 @@ wn_window *wn_window_init(Arena *arena) {
SDL_SetWindowRelativeMouseMode(window->window, true); SDL_SetWindowRelativeMouseMode(window->window, true);
SDL_GetRelativeMouseState(NULL, NULL); SDL_GetRelativeMouseState(NULL, NULL);
// add deinit function to arena deinit stack arena_deinit_task_push(arena, (void *)window, *wn_window_deinit);
arena_deinit_task_push(arena, (ArenaDeinitTask){.func_param = (void *)window,
.func_ptr = *wn_window_deinit,
.next = NULL});
return window; return window;
} }