Added the ability to run deinit tasks when deleting arenas
This commit is contained in:
parent
4c6348a0ee
commit
cbc14f9c61
3 changed files with 23 additions and 7 deletions
|
|
@ -30,7 +30,8 @@ Arena *arena_init(Arena *parent, size_t capacity) {
|
||||||
.begin = region,
|
.begin = region,
|
||||||
.end = region,
|
.end = region,
|
||||||
.child = NULL,
|
.child = NULL,
|
||||||
.sibling = NULL};
|
.sibling = NULL,
|
||||||
|
.deinit_task_top = NULL};
|
||||||
|
|
||||||
// if parent has no children this arena is now it's child
|
// if parent has no children this arena is now it's child
|
||||||
if (parent->child == NULL) {
|
if (parent->child == NULL) {
|
||||||
|
|
@ -50,7 +51,8 @@ Arena *arena_init(Arena *parent, size_t capacity) {
|
||||||
.begin = region,
|
.begin = region,
|
||||||
.end = region,
|
.end = region,
|
||||||
.child = NULL,
|
.child = NULL,
|
||||||
.sibling = NULL};
|
.sibling = NULL,
|
||||||
|
.deinit_task_top = NULL};
|
||||||
return arena;
|
return arena;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
@ -124,7 +126,7 @@ void *arena_alloc(Arena *arena, size_t size) {
|
||||||
return result;
|
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));
|
ArenaDeinitTask *job = arena_alloc(arena, sizeof(ArenaDeinitTask));
|
||||||
*job = task;
|
*job = task;
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -16,7 +16,6 @@ struct ArenaDeinitTask_s {
|
||||||
void (*func_ptr)(void *);
|
void (*func_ptr)(void *);
|
||||||
ArenaDeinitTask *next;
|
ArenaDeinitTask *next;
|
||||||
};
|
};
|
||||||
ArenaDeinitTask ArenaDeinitTask_default = {NULL};
|
|
||||||
|
|
||||||
typedef struct Arena_s Arena;
|
typedef struct Arena_s Arena;
|
||||||
struct Arena_s {
|
struct Arena_s {
|
||||||
|
|
@ -31,7 +30,7 @@ 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_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_alloc(Arena *arena, size_t size);
|
||||||
// void *arena_clear(Arena *arena);
|
// void *arena_clear(Arena *arena);
|
||||||
|
|
|
||||||
19
src/main.c
19
src/main.c
|
|
@ -1,5 +1,6 @@
|
||||||
#include <GL/glew.h>
|
#include <GL/glew.h>
|
||||||
#include <SDL3/SDL.h>
|
#include <SDL3/SDL.h>
|
||||||
|
#include <stdio.h>
|
||||||
#include <stdlib.h>
|
#include <stdlib.h>
|
||||||
|
|
||||||
#include "SDL3/SDL_events.h"
|
#include "SDL3/SDL_events.h"
|
||||||
|
|
@ -10,7 +11,9 @@
|
||||||
|
|
||||||
#include "arena_allocator.h"
|
#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[]) {
|
int main(int argc, char *argv[]) {
|
||||||
// arena allocation test
|
// arena allocation test
|
||||||
printf("Allocation test\n");
|
printf("Allocation test\n");
|
||||||
|
|
@ -33,6 +36,17 @@ int main(int argc, char *argv[]) {
|
||||||
Arena *greatsiblinggreatgrandchild_arena =
|
Arena *greatsiblinggreatgrandchild_arena =
|
||||||
arena_init(greatgrandchildsiblingsibling_arena, 0);
|
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");
|
printf("deinit tests\n");
|
||||||
arena_deinit(greatgrandchild_arena);
|
arena_deinit(greatgrandchild_arena);
|
||||||
|
|
||||||
|
|
@ -40,8 +54,8 @@ int main(int argc, char *argv[]) {
|
||||||
|
|
||||||
printf("tests complete\n");
|
printf("tests complete\n");
|
||||||
}
|
}
|
||||||
*/
|
|
||||||
|
|
||||||
|
/*
|
||||||
int main(int argc, char *argv[]) {
|
int main(int argc, char *argv[]) {
|
||||||
wn_window window = {0};
|
wn_window window = {0};
|
||||||
if (!wn_window_init(&window)) {
|
if (!wn_window_init(&window)) {
|
||||||
|
|
@ -156,3 +170,4 @@ int main(int argc, char *argv[]) {
|
||||||
|
|
||||||
return EXIT_SUCCESS;
|
return EXIT_SUCCESS;
|
||||||
}
|
}
|
||||||
|
*/
|
||||||
|
|
|
||||||
Loading…
Reference in a new issue