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.
This commit is contained in:
parent
f6ad49b87c
commit
f35fec7710
9
gc.c
9
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 {
|
||||
|
Loading…
x
Reference in New Issue
Block a user