From 135b4773e3e58cacf102f4183ba38dcfd13ec5ca Mon Sep 17 00:00:00 2001 From: "Yukihiro \"Matz\" Matsumoto" Date: Wed, 18 Apr 2018 00:16:01 +0900 Subject: Turn off major GC mode before full GC; fix #4000 --- src/gc.c | 11 +++++++---- 1 file changed, 7 insertions(+), 4 deletions(-) diff --git a/src/gc.c b/src/gc.c index 631f7b910..8e2072788 100644 --- a/src/gc.c +++ b/src/gc.c @@ -1212,12 +1212,15 @@ mrb_incremental_gc(mrb_state *mrb) if (is_major_gc(gc)) { size_t threshold = gc->live_after_mark/100 * MAJOR_GC_INC_RATIO; - if (threshold > MAJOR_GC_TOOMANY) { + gc->full = FALSE; + if (threshold < MAJOR_GC_TOOMANY) { + gc->majorgc_old_threshold = threshold; + } + else { + /* too many objects allocated during incremental GC, */ + /* instead of increasing threshold, invoke full GC. */ mrb_full_gc(mrb); - threshold = gc->live_after_mark/100 * MAJOR_GC_INC_RATIO; } - gc->majorgc_old_threshold = threshold; - gc->full = FALSE; } else if (is_minor_gc(gc)) { if (gc->live > gc->majorgc_old_threshold) { -- cgit v1.2.3