summaryrefslogtreecommitdiff
path: root/gc.c
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 /gc.c
parent9ada2641c6804218503f7b3bc5afdbe14601fde1 (diff)
* 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
Diffstat (limited to 'gc.c')
-rw-r--r--gc.c15
1 files changed, 9 insertions, 6 deletions
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))) { \