I dunno why this works but it does for some miraculous reason

This commit is contained in:
Warwick 2025-11-24 13:42:14 +00:00
parent e0f0bb0713
commit bd957d1c79
2 changed files with 20 additions and 4 deletions

View file

@ -83,8 +83,19 @@ void arena_deinit(Arena *arena) {
return; return;
} }
// Now that we have no descendants tell our parent of our death // Now that we have no descendants tell our parent and siblings of our death
if (arena->parent->child == arena) {
arena->parent->child = arena->sibling; arena->parent->child = arena->sibling;
return;
}
Arena *previous_sibling = arena->parent->child;
while (previous_sibling != NULL && previous_sibling->sibling != arena) {
previous_sibling = previous_sibling->sibling;
}
if (previous_sibling != NULL) {
previous_sibling->sibling = arena->sibling;
}
} }
void *arena_alloc(Arena *arena, size_t size) { void *arena_alloc(Arena *arena, size_t size) {

View file

@ -26,9 +26,14 @@ int main(int argc, char *argv[]) {
Arena *sibling_arena = arena_init(global_arena, 0); Arena *sibling_arena = arena_init(global_arena, 0);
Arena *grandchild_arena = arena_init(child_arena, 0); Arena *grandchild_arena = arena_init(child_arena, 0);
Arena *greatgrandchild_arena = arena_init(grandchild_arena, 0); Arena *greatgrandchild_arena = arena_init(grandchild_arena, 0);
Arena *greategreatgrandchild_arena = arena_init(greatgrandchild_arena, 0); Arena *greatgrandchildsibling_arena = arena_init(grandchild_arena, 0);
Arena *greatgrandchildsiblingsibling_arena = arena_init(grandchild_arena, 0);
Arena *greategreatgrandchild_arena =
arena_init(greatgrandchildsibling_arena, 0);
Arena *greatsiblinggreatgrandchild_arena =
arena_init(greatgrandchildsiblingsibling_arena, 0);
printf("deinit test\n"); printf("deinit tests\n");
arena_deinit(greatgrandchild_arena); arena_deinit(greatgrandchild_arena);
arena_deinit(global_arena); arena_deinit(global_arena);