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) {

Reply via email to