diff options
author | ko1 <ko1@b2dd03c8-39d4-4d8f-98ff-823fe69b080e> | 2014-06-10 16:55:32 +0000 |
---|---|---|
committer | ko1 <ko1@b2dd03c8-39d4-4d8f-98ff-823fe69b080e> | 2014-06-10 16:55:32 +0000 |
commit | c8c99520668f4a92f620ede01e5af2827a29b3fa (patch) | |
tree | 74ec9b06778912e02f76b5cc362bf0ead75d90ef /gc.c | |
parent | 9ada2641c6804218503f7b3bc5afdbe14601fde1 (diff) | |
download | ruby-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
Diffstat (limited to 'gc.c')
-rw-r--r-- | gc.c | 15 |
1 files changed, 9 insertions, 6 deletions
@@ -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))) { \ |