Compare commits
2 commits
11b7d95fca
...
cbc14f9c61
| Author | SHA1 | Date | |
|---|---|---|---|
| cbc14f9c61 | |||
| 4c6348a0ee |
3 changed files with 46 additions and 8 deletions
|
|
@ -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;
|
||||
}
|
||||
|
||||
|
|
@ -65,6 +67,13 @@ void arena_deinit(Arena *arena) {
|
|||
arena_deinit(current_child);
|
||||
}
|
||||
|
||||
// Run deinit tasks before freeing data
|
||||
while (arena->deinit_task_top != NULL) {
|
||||
assert(arena->deinit_task_top->func_ptr != NULL);
|
||||
arena->deinit_task_top->func_ptr(arena->deinit_task_top->func_param);
|
||||
arena->deinit_task_top = arena->deinit_task_top->next;
|
||||
}
|
||||
|
||||
// actually free the data
|
||||
assert(arena->begin != NULL && arena->end != NULL);
|
||||
Region *region = arena->begin;
|
||||
|
|
@ -117,7 +126,11 @@ void *arena_alloc(Arena *arena, size_t size) {
|
|||
return result;
|
||||
}
|
||||
|
||||
// void *arena_clear(Arena *arena) {
|
||||
// arena->size = 0;
|
||||
// return arena->data;
|
||||
// }
|
||||
void arena_deinit_task_push(Arena *arena, ArenaDeinitTask task) {
|
||||
ArenaDeinitTask *job = arena_alloc(arena, sizeof(ArenaDeinitTask));
|
||||
*job = task;
|
||||
|
||||
ArenaDeinitTask *next_job = arena->deinit_task_top;
|
||||
arena->deinit_task_top = job;
|
||||
job->next = next_job;
|
||||
}
|
||||
|
|
|
|||
|
|
@ -10,6 +10,13 @@ struct Region_s {
|
|||
unsigned char data[];
|
||||
};
|
||||
|
||||
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 {
|
||||
Arena *parent;
|
||||
|
|
@ -17,10 +24,13 @@ struct Arena_s {
|
|||
Arena *sibling;
|
||||
Region *begin;
|
||||
Region *end;
|
||||
ArenaDeinitTask *deinit_task_top;
|
||||
};
|
||||
|
||||
Arena *arena_init(Arena *parent, size_t capacity);
|
||||
void arena_deinit(Arena *arena);
|
||||
|
||||
void arena_deinit_task_push(Arena *arena, ArenaDeinitTask task);
|
||||
|
||||
void *arena_alloc(Arena *arena, size_t size);
|
||||
// void *arena_clear(Arena *arena);
|
||||
|
|
|
|||
19
src/main.c
19
src/main.c
|
|
@ -1,5 +1,6 @@
|
|||
#include <GL/glew.h>
|
||||
#include <SDL3/SDL.h>
|
||||
#include <stdio.h>
|
||||
#include <stdlib.h>
|
||||
|
||||
#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;
|
||||
}
|
||||
*/
|
||||
|
|
|
|||
Loading…
Reference in a new issue