wingo pushed a commit to branch wip-whippet in repository guile. commit 9167dbb5f6b80556b9c0b16ab01bd4474bbf6c1c Author: Andy Wingo <wi...@igalia.com> AuthorDate: Fri Jul 12 09:06:26 2024 +0200
Fix returning partially allocated blocks that are actually full --- src/pcc.c | 12 +++++++++--- 1 file changed, 9 insertions(+), 3 deletions(-) diff --git a/src/pcc.c b/src/pcc.c index d56c9b0e0..c71f2d04e 100644 --- a/src/pcc.c +++ b/src/pcc.c @@ -231,9 +231,15 @@ static struct pcc_block* pop_partially_allocated_block(struct pcc_space *space) static void push_partially_allocated_block(struct pcc_space *space, struct pcc_block *block, uintptr_t hp) { - block->allocated = hp & (REGION_SIZE - 1); - GC_ASSERT(block->allocated); - push_block(&space->partially_allocated, block); + size_t allocated = hp & (REGION_SIZE - 1); + if (allocated) { + block->allocated = allocated; + push_block(&space->partially_allocated, block); + } else { + // Could be hp was bumped all the way to the limit, in which case + // allocated wraps to 0; in any case the block is full. + push_allocated_block(space, block); + } } static struct pcc_block* pop_paged_out_block(struct pcc_space *space) {