diff options
author | Aaron Patterson <[email protected]> | 2019-10-07 12:10:24 -0700 |
---|---|---|
committer | Aaron Patterson <[email protected]> | 2019-10-07 12:10:24 -0700 |
commit | 058db33c5ec881271d028b7490d88b3baed74acb (patch) | |
tree | 690730278e7b55d802a977fd95c0a67ecdc12a70 /gc.c | |
parent | 0a2f04e156cb717dcf78f2ea9bfe26f864a24616 (diff) |
Move empty pages to the tomb
I think we need to be moving empty pages to the tomb after they become
empty.
Diffstat (limited to 'gc.c')
-rw-r--r-- | gc.c | 13 |
1 files changed, 9 insertions, 4 deletions
@@ -8397,10 +8397,6 @@ gc_compact_after_gc(rb_objspace_t *objspace, int use_toward_empty, int use_doubl heap_eden->free_pages = NULL; heap_eden->using_page = NULL; - if (use_verifier) { - gc_verify_internal_consistency(objspace); - } - while (moved_list) { VALUE next_moved; struct heap_page *page; @@ -8413,10 +8409,19 @@ gc_compact_after_gc(rb_objspace_t *objspace, int use_toward_empty, int use_doubl RMOVED(moved_list)->next = 0; page->free_slots++; heap_page_add_freeobj(objspace, page, moved_list); + if (page->free_slots == page->total_slots) { + heap_pages_freeable_pages--; + heap_unlink_page(objspace, heap_eden, page); + heap_add_page(objspace, heap_tomb, page); + } objspace->profile.total_freed_objects++; moved_list = next_moved; } + if (use_verifier) { + gc_verify_internal_consistency(objspace); + } + mjit_gc_exit_hook(); // unlock MJIT here, because `rb_gc()` calls `mjit_gc_start_hook()` again. } |