summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorAaron Patterson <tenderlove@ruby-lang.org>2019-10-07 12:10:24 -0700
committerAaron Patterson <tenderlove@ruby-lang.org>2019-10-07 12:10:24 -0700
commit058db33c5ec881271d028b7490d88b3baed74acb (patch)
tree690730278e7b55d802a977fd95c0a67ecdc12a70
parent0a2f04e156cb717dcf78f2ea9bfe26f864a24616 (diff)
Move empty pages to the tomb
I think we need to be moving empty pages to the tomb after they become empty.
-rw-r--r--gc.c13
1 files changed, 9 insertions, 4 deletions
diff --git a/gc.c b/gc.c
index 28ac2082ee..66bdb012b6 100644
--- a/gc.c
+++ b/gc.c
@@ -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.
}