summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorNobuyoshi Nakada <nobu@ruby-lang.org>2019-04-24 12:52:57 +0900
committerNobuyoshi Nakada <nobu@ruby-lang.org>2019-04-24 13:02:01 +0900
commitf1a52d96a59c63d46cb23af60cdcaf38e30e0512 (patch)
treecb0492f778489449a04534df6fac82823cb25b5b
parent2ef66737081ec029f9c82e11671de36bb70a9e3b (diff)
downloadruby-f1a52d96a59c63d46cb23af60cdcaf38e30e0512.tar.gz
Defer setting gc_stress until inits done
[Bug #15784]
-rw-r--r--gc.c10
-rw-r--r--inits.c1
-rw-r--r--test/ruby/test_gc.rb4
3 files changed, 15 insertions, 0 deletions
diff --git a/gc.c b/gc.c
index 8f59f1923d..a12854d636 100644
--- a/gc.c
+++ b/gc.c
@@ -2571,6 +2571,8 @@ Init_heap(void)
objspace->id_to_obj_tbl = st_init_numtable();
objspace->obj_to_id_tbl = st_init_numtable();
+ dont_gc = 1;
+
gc_stress_set(objspace, ruby_initial_gc_stress);
#if RGENGC_ESTIMATE_OLDMALLOC
@@ -2584,6 +2586,14 @@ Init_heap(void)
finalizer_table = st_init_numtable();
}
+void
+Init_gc_stress(void)
+{
+ rb_objspace_t *objspace = &rb_objspace;
+
+ dont_gc = 0;
+}
+
typedef int each_obj_callback(void *, void *, size_t, void *);
struct each_obj_args {
diff --git a/inits.c b/inits.c
index f730903b5e..ad34223e36 100644
--- a/inits.c
+++ b/inits.c
@@ -67,5 +67,6 @@ rb_call_inits(void)
CALL(vm_trace);
CALL(vm_stack_canary);
CALL(ast);
+ CALL(gc_stress);
}
#undef CALL
diff --git a/test/ruby/test_gc.rb b/test/ruby/test_gc.rb
index 8f77f49c9b..5dea1b2742 100644
--- a/test/ruby/test_gc.rb
+++ b/test/ruby/test_gc.rb
@@ -384,6 +384,10 @@ class TestGc < Test::Unit::TestCase
end;
end
+ def test_gc_stress_at_startup
+ assert_in_out_err([{"RUBY_DEBUG"=>"gc_stress"}], '', [], [], '[Bug #15784]', success: true)
+ end
+
def test_gc_disabled_start
begin
disabled = GC.disable