diff options
author | Kaz Kylheku <kaz@kylheku.com> | 2019-11-09 10:16:15 -0800 |
---|---|---|
committer | Kaz Kylheku <kaz@kylheku.com> | 2019-11-09 10:16:15 -0800 |
commit | 57867881e31273f91c398b55f75417484f11ddc0 (patch) | |
tree | f45ba3cb1ac752e744cd53cd93a8809d136e70c0 /gc.c | |
parent | 0512605daf81ebcd9595fff447bc397825342a37 (diff) | |
download | txr-57867881e31273f91c398b55f75417484f11ddc0.tar.gz txr-57867881e31273f91c398b55f75417484f11ddc0.tar.bz2 txr-57867881e31273f91c398b55f75417484f11ddc0.zip |
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.
Diffstat (limited to 'gc.c')
-rw-r--r-- | gc.c | 5 |
1 files changed, 2 insertions, 3 deletions
@@ -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 |