diff options
-rw-r--r-- | ChangeLog | 8 | ||||
-rw-r--r-- | gc.c | 15 | ||||
-rw-r--r-- | test/ruby/test_gc.rb | 18 |
3 files changed, 35 insertions, 6 deletions
@@ -1,3 +1,11 @@ +Wed Jun 11 01:53:22 2014 Koichi Sasada <ko1@atdot.net> + + * gc.c: invoke GC before memory allocation (xmalloc/xrealloc) + when GC.stress = true. + [Bug #9859] + + * test/ruby/test_gc.rb: add a test. + Tue Jun 10 13:20:14 2014 Takeyuki FUJIOKA <xibbar@ruby-lang.org> * lib/cgi/core.rb: Provide a mechanism to specify the @@ -6231,6 +6231,14 @@ atomic_sub_nounderflow(size_t *var, size_t sub) } static void +objspace_malloc_gc_stress(rb_objspace_t *objspace) +{ + if (ruby_gc_stress && !ruby_disable_gc_stress && ruby_native_thread_p()) { + garbage_collect_with_gvl(objspace, gc_stress_full_mark_after_malloc_p(), TRUE, GPR_FLAG_STRESS | GPR_FLAG_MALLOC); + } +} + +static void objspace_malloc_increase(rb_objspace_t *objspace, void *mem, size_t new_size, size_t old_size, enum memop_type type) { if (new_size > old_size) { @@ -6246,12 +6254,6 @@ objspace_malloc_increase(rb_objspace_t *objspace, void *mem, size_t new_size, si #endif } - if (type != MEMOP_TYPE_FREE && - ruby_gc_stress && !ruby_disable_gc_stress && - ruby_native_thread_p()) { - garbage_collect_with_gvl(objspace, gc_stress_full_mark_after_malloc_p(), TRUE, GPR_FLAG_MALLOC); - } - if (type == MEMOP_TYPE_MALLOC) { retry: if (malloc_increase > malloc_limit && ruby_native_thread_p()) { @@ -6335,6 +6337,7 @@ objspace_malloc_fixup(rb_objspace_t *objspace, void *mem, size_t size) } #define TRY_WITH_GC(alloc) do { \ + objspace_malloc_gc_stress(objspace); \ if (!(alloc) && \ (!garbage_collect_with_gvl(objspace, 1, 1, GPR_FLAG_MALLOC) || /* full mark && immediate sweep */ \ !(alloc))) { \ diff --git a/test/ruby/test_gc.rb b/test/ruby/test_gc.rb index 00a49418ac..5181e9db9f 100644 --- a/test/ruby/test_gc.rb +++ b/test/ruby/test_gc.rb @@ -312,4 +312,22 @@ class TestGc < Test::Unit::TestCase def test_verify_internal_consistency assert_nil(GC.verify_internal_consistency) end + + def test_gc_stress_on_realloc + assert_normal_exit(<<-'end;', '[Bug #9859]') + class C + def initialize + @a = nil + @b = nil + @c = nil + @d = nil + @e = nil + @f = nil + end + end + + GC.stress = true + C.new + end; + end end |