Eliminate second GC pass for eliminating T_MOVED
`T_MOVED` is a linked list, so we can just iterate through the `T_MOVED` objects, clearing them out and adding them to respective free lists.
This commit is contained in:
parent
d8b6f58502
commit
0a2f04e156
23
gc.c
23
gc.c
@ -8401,20 +8401,23 @@ gc_compact_after_gc(rb_objspace_t *objspace, int use_toward_empty, int use_doubl
|
|||||||
gc_verify_internal_consistency(objspace);
|
gc_verify_internal_consistency(objspace);
|
||||||
}
|
}
|
||||||
|
|
||||||
#if __has_feature(address_sanitizer)
|
|
||||||
while (moved_list) {
|
while (moved_list) {
|
||||||
VALUE current = moved_list;
|
VALUE next_moved;
|
||||||
moved_list = RANY(moved_list)->as.moved.next;
|
struct heap_page *page;
|
||||||
asan_poison_object(current);
|
|
||||||
|
page = GET_HEAP_PAGE(moved_list);
|
||||||
|
next_moved = RMOVED(moved_list)->next;
|
||||||
|
|
||||||
|
RMOVED(moved_list)->flags = 0;
|
||||||
|
RMOVED(moved_list)->destination = 0;
|
||||||
|
RMOVED(moved_list)->next = 0;
|
||||||
|
page->free_slots++;
|
||||||
|
heap_page_add_freeobj(objspace, page, moved_list);
|
||||||
|
objspace->profile.total_freed_objects++;
|
||||||
|
moved_list = next_moved;
|
||||||
}
|
}
|
||||||
#else
|
|
||||||
(void)moved_list;
|
|
||||||
#endif
|
|
||||||
|
|
||||||
mjit_gc_exit_hook(); // unlock MJIT here, because `rb_gc()` calls `mjit_gc_start_hook()` again.
|
mjit_gc_exit_hook(); // unlock MJIT here, because `rb_gc()` calls `mjit_gc_start_hook()` again.
|
||||||
|
|
||||||
/* GC after compaction to eliminate T_MOVED */
|
|
||||||
garbage_collect(objspace, GPR_DEFAULT_REASON);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
/*
|
/*
|
||||||
|
Loading…
x
Reference in New Issue
Block a user