From 0bebea985dd1b759973e285e87ed9dfa8610d253 Mon Sep 17 00:00:00 2001 From: Aaron Patterson Date: Tue, 1 Dec 2020 15:15:14 -0800 Subject: [PATCH] Incremental sweeping should not require page allocation Incremental sweeping should sweep until we find a slot for objects to use. `heap_increment` was adding a page to the heap even though we would sweep immediately after. Co-authored-by: John Hawthorn --- gc.c | 5 ++--- 1 file changed, 2 insertions(+), 3 deletions(-) diff --git a/gc.c b/gc.c index 3daa6a83f7..a681b0b1fb 100644 --- a/gc.c +++ b/gc.c @@ -1911,6 +1911,8 @@ heap_page_create(rb_objspace_t *objspace) static void heap_add_page(rb_objspace_t *objspace, rb_heap_t *heap, struct heap_page *page) { + /* Adding to eden heap during incremental sweeping is forbidden */ + GC_ASSERT(!(heap == heap_eden && heap->sweeping_page)); page->flags.in_tomb = (heap == heap_tomb); list_add(&heap->pages, &page->page_node); heap->total_pages++; @@ -5095,9 +5097,6 @@ gc_sweep_continue(rb_objspace_t *objspace, rb_heap_t *heap) unsigned int lock_lev; gc_enter(objspace, "sweep_continue", &lock_lev); - if (objspace->rgengc.need_major_gc == GPR_FLAG_NONE && heap_increment(objspace, heap)) { - gc_report(3, objspace, "gc_sweep_continue: success heap_increment().\n"); - } gc_sweep_step(objspace, heap); gc_exit(objspace, "sweep_continue", &lock_lev); }