diff options
author | Peter Zhu <peter@peterzhu.ca> | 2023-12-12 10:19:56 -0500 |
---|---|---|
committer | Peter Zhu <peter@peterzhu.ca> | 2023-12-18 10:37:21 -0500 |
commit | f35fec771047de15127c0e00d22b9eccd5487f51 (patch) | |
tree | 3270a230f4573fe01200cda68256c46caa547edc /gc.c | |
parent | f6ad49b87c110b618632a4a258896e3f5673000b (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.c | 9 |
1 files changed, 9 insertions, 0 deletions
@@ -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 { |