I dunno why this works but it does for some miraculous reason
This commit is contained in:
parent
e0f0bb0713
commit
bd957d1c79
2 changed files with 20 additions and 4 deletions
|
|
@ -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) {
|
||||||
|
|
|
||||||
|
|
@ -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);
|
||||||
|
|
|
||||||
Loading…
Reference in a new issue