From bd957d1c799c2e6b171b1842603556753f57140c Mon Sep 17 00:00:00 2001 From: Warwick Date: Mon, 24 Nov 2025 13:42:14 +0000 Subject: [PATCH] I dunno why this works but it does for some miraculous reason --- src/arena_allocator.c | 15 +++++++++++++-- src/main.c | 9 +++++++-- 2 files changed, 20 insertions(+), 4 deletions(-) diff --git a/src/arena_allocator.c b/src/arena_allocator.c index d11a6e3..4bdf4bc 100644 --- a/src/arena_allocator.c +++ b/src/arena_allocator.c @@ -83,8 +83,19 @@ void arena_deinit(Arena *arena) { return; } - // Now that we have no descendants tell our parent of our death - arena->parent->child = arena->sibling; + // Now that we have no descendants tell our parent and siblings of our death + if (arena->parent->child == arena) { + 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) { diff --git a/src/main.c b/src/main.c index 5dae4d4..42575b3 100644 --- a/src/main.c +++ b/src/main.c @@ -26,9 +26,14 @@ int main(int argc, char *argv[]) { Arena *sibling_arena = arena_init(global_arena, 0); Arena *grandchild_arena = arena_init(child_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(global_arena);