Made deinit tasks cleaner to use
This commit is contained in:
parent
648a0466ec
commit
44c776ed04
5 changed files with 16 additions and 19 deletions
|
|
@ -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;
|
||||||
|
|
|
||||||
|
|
@ -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);
|
||||||
|
|
|
||||||
|
|
@ -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;
|
||||||
}
|
}
|
||||||
|
|
|
||||||
|
|
@ -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;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -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;
|
||||||
}
|
}
|
||||||
|
|
|
||||||
Loading…
Reference in a new issue