aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorko1 <ko1@b2dd03c8-39d4-4d8f-98ff-823fe69b080e>2014-06-10 16:55:32 +0000
committerko1 <ko1@b2dd03c8-39d4-4d8f-98ff-823fe69b080e>2014-06-10 16:55:32 +0000
commitc8c99520668f4a92f620ede01e5af2827a29b3fa (patch)
tree74ec9b06778912e02f76b5cc362bf0ead75d90ef
parent9ada2641c6804218503f7b3bc5afdbe14601fde1 (diff)
downloadruby-c8c99520668f4a92f620ede01e5af2827a29b3fa.tar.gz
* gc.c: invoke GC before memory allocation (xmalloc/xrealloc)
when GC.stress = true. [Bug #9859] * test/ruby/test_gc.rb: add a test. git-svn-id: svn+ssh://ci.ruby-lang.org/ruby/trunk@46399 b2dd03c8-39d4-4d8f-98ff-823fe69b080e
-rw-r--r--ChangeLog8
-rw-r--r--gc.c15
-rw-r--r--test/ruby/test_gc.rb18
3 files changed, 35 insertions, 6 deletions
diff --git a/ChangeLog b/ChangeLog
index 1311347709..8ee23d4610 100644
--- a/ChangeLog
+++ b/ChangeLog
@@ -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
diff --git a/gc.c b/gc.c
index c807d5119a..ba70b33cc1 100644
--- a/gc.c
+++ b/gc.c
@@ -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