summaryrefslogtreecommitdiff
path: root/gc.c
diff options
context:
space:
mode:
authorPeter Zhu <peter@peterzhu.ca>2023-12-12 10:19:56 -0500
committerPeter Zhu <peter@peterzhu.ca>2023-12-18 10:37:21 -0500
commitf35fec771047de15127c0e00d22b9eccd5487f51 (patch)
tree3270a230f4573fe01200cda68256c46caa547edc /gc.c
parentf6ad49b87c110b618632a4a258896e3f5673000b (diff)
Reset pinned_slots at the beginning of GC
pinned_slots is not being reset every GC, which causes this assertion to fail: ``` Assertion Failed: gc.c:7076:gc_pin:GET_HEAP_PAGE(obj)->pinned_slots <= GET_HEAP_PAGE(obj)->total_slots ``` This commit changes it to reset it at the beginning of every compaction GC cycle.
Diffstat (limited to 'gc.c')
-rw-r--r--gc.c9
1 files changed, 9 insertions, 0 deletions
diff --git a/gc.c b/gc.c
index 3a1ac4f4b9..d0067e4165 100644
--- a/gc.c
+++ b/gc.c
@@ -7079,6 +7079,7 @@ gc_pin(rb_objspace_t *objspace, VALUE obj)
if (UNLIKELY(objspace->flags.during_compacting)) {
if (LIKELY(during_gc)) {
if (!MARKED_IN_BITMAP(GET_HEAP_PINNED_BITS(obj), obj)) {
+ GC_ASSERT(GET_HEAP_PAGE(obj)->pinned_slots <= GET_HEAP_PAGE(obj)->total_slots);
GET_HEAP_PAGE(obj)->pinned_slots++;
MARK_IN_BITMAP(GET_HEAP_PINNED_BITS(obj), obj);
}
@@ -8333,6 +8334,14 @@ gc_marks_start(rb_objspace_t *objspace, int full_mark)
rb_heap_t *heap = SIZE_POOL_EDEN_HEAP(size_pool);
rgengc_mark_and_rememberset_clear(objspace, heap);
heap_move_pooled_pages_to_free_pages(heap);
+
+ if (objspace->flags.during_compacting) {
+ struct heap_page *page = NULL;
+
+ ccan_list_for_each(&heap->pages, page, page_node) {
+ page->pinned_slots = 0;
+ }
+ }
}
}
else {