summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorAaron Patterson <tenderlove@ruby-lang.org>2020-12-01 15:15:14 -0800
committerAaron Patterson <aaron.patterson@gmail.com>2020-12-02 08:23:31 -0800
commit0bebea985dd1b759973e285e87ed9dfa8610d253 (patch)
tree5c63c3e353eaec5bf7130ad7143c9de774a6cf06
parent12a121cc0f7f5b438388288383a7b8b9baf3e2fe (diff)
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 <john@hawthorn.email>
Notes
Notes: Merged: https://github.com/ruby/ruby/pull/3837
-rw-r--r--gc.c5
1 files 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);
}