From 57867881e31273f91c398b55f75417484f11ddc0 Mon Sep 17 00:00:00 2001 From: Kaz Kylheku Date: Sat, 9 Nov 2019 10:16:15 -0800 Subject: gc: bugfix: maintain tail pointer in new sweep code. * gc.c (sweep): The new logic for removing a deleted heap's blocks from the free list must correctly maintain free_tail. Whenever a node is deleted which is the tail node, the tail pointer must move to the parent's tail field, or to the free_list pointer. We don't need to do anything afterward for the free_list == 0 case; that is taken care of. --- gc.c | 5 ++--- 1 file changed, 2 insertions(+), 3 deletions(-) diff --git a/gc.c b/gc.c index b136143a..3460fb27 100644 --- a/gc.c +++ b/gc.c @@ -665,13 +665,12 @@ static int_ptr_t sweep(void) for (ppf = &free_list; *ppf != nil; ) { val block = *ppf; if (block >= heap->block && block < end) { - *ppf = block->t.next; + if ((*ppf = block->t.next) == 0) + free_tail = ppf; } else { ppf = &block->t.next; } } - if (free_list == 0) - free_tail = &free_list; *pph = heap->next; free(heap); #if HAVE_VALGRIND -- cgit v1.2.3