From 0dc40bd2b740898fac4c6d4193ab6cd7ad52c05d Mon Sep 17 00:00:00 2001 From: Peter Zhu Date: Wed, 6 Dec 2023 16:38:59 -0500 Subject: [PATCH] Check need_major_gc during GC stress need_major_gc is set when a major GC is required. However, if gc_stress_no_major is also set, then it will not actually run a major GC. For example, the following script will sometimes crash: ``` GC.stress = 1 50000.times.map { [] } ``` With the following message: ``` [BUG] cannot create a new page after major GC ``` --- gc.c | 19 +++++++++---------- 1 file changed, 9 insertions(+), 10 deletions(-) diff --git a/gc.c b/gc.c index 9ef2b4a48a..08e4a2cd3e 100644 --- a/gc.c +++ b/gc.c @@ -9460,18 +9460,17 @@ gc_start(rb_objspace_t *objspace, unsigned int reason) objspace->flags.immediate_sweep = !(flag & (1<rgengc.need_major_gc) { - reason |= objspace->rgengc.need_major_gc; - do_full_mark = TRUE; - } - else if (RGENGC_FORCE_MAJOR_GC) { - reason = GPR_FLAG_MAJOR_BY_FORCE; - do_full_mark = TRUE; - } - objspace->rgengc.need_major_gc = GPR_FLAG_NONE; + if (objspace->rgengc.need_major_gc) { + reason |= objspace->rgengc.need_major_gc; + do_full_mark = TRUE; } + else if (RGENGC_FORCE_MAJOR_GC) { + reason = GPR_FLAG_MAJOR_BY_FORCE; + do_full_mark = TRUE; + } + + objspace->rgengc.need_major_gc = GPR_FLAG_NONE; if (do_full_mark && (reason & GPR_FLAG_MAJOR_MASK) == 0) { reason |= GPR_FLAG_MAJOR_BY_FORCE; /* GC by CAPI, METHOD, and so on. */