summaryrefslogtreecommitdiff
path: root/gc.c
diff options
context:
space:
mode:
authornobu <nobu@b2dd03c8-39d4-4d8f-98ff-823fe69b080e>2008-06-13 15:09:22 +0000
committernobu <nobu@b2dd03c8-39d4-4d8f-98ff-823fe69b080e>2008-06-13 15:09:22 +0000
commit4641b801664008c7ae509a79354da1bc84b6fc1c (patch)
treea27aa76689a6957d6342b2c9c409b78c01cafda1 /gc.c
parente0d427e855e514c758ffc8f776539abe70ad12d4 (diff)
* gc.c (ruby_gc_stress): moved to rb_objspace_t.
* gc.c (gc_stress_get, gc_stress_set): VM local attribute. * signal.c (sigsegv): ditto. git-svn-id: svn+ssh://ci.ruby-lang.org/ruby/trunk@17153 b2dd03c8-39d4-4d8f-98ff-823fe69b080e
Diffstat (limited to 'gc.c')
-rw-r--r--gc.c13
1 files changed, 9 insertions, 4 deletions
diff --git a/gc.c b/gc.c
index 5a19ed7093..a5041da700 100644
--- a/gc.c
+++ b/gc.c
@@ -179,6 +179,7 @@ typedef struct rb_objspace {
} markstack;
struct gc_list *global_list;
unsigned int count;
+ int gc_stress;
} rb_objspace_t;
#if defined(ENABLE_VM_OBJSPACE) && ENABLE_VM_OBJSPACE
@@ -206,6 +207,7 @@ static rb_objspace_t rb_objspace = {{GC_MALLOC_LIMIT}, {HEAP_MIN_SLOTS}};
#define mark_stack_ptr objspace->markstack.ptr
#define mark_stack_overflow objspace->markstack.overflow
#define global_List objspace->global_list
+#define ruby_gc_stress objspace->gc_stress
#if defined(ENABLE_VM_OBJSPACE) && ENABLE_VM_OBJSPACE
rb_objspace_t *
@@ -243,7 +245,7 @@ VALUE *rb_gc_stack_start = 0;
VALUE *rb_gc_register_stack_start = 0;
#endif
-int ruby_gc_stress = 0;
+int ruby_disable_gc_stress = 0;
#ifdef DJGPP
@@ -289,6 +291,7 @@ rb_memerror(void)
static VALUE
gc_stress_get(VALUE self)
{
+ rb_objspace_t *objspace = &rb_objspace;
return ruby_gc_stress ? Qtrue : Qfalse;
}
@@ -307,6 +310,7 @@ gc_stress_get(VALUE self)
static VALUE
gc_stress_set(VALUE self, VALUE bool)
{
+ rb_objspace_t *objspace = &rb_objspace;
rb_secure(2);
ruby_gc_stress = RTEST(bool);
return bool;
@@ -326,7 +330,8 @@ vm_xmalloc(rb_objspace_t *objspace, size_t size)
size += sizeof(size_t);
#endif
- if (ruby_gc_stress || (malloc_increase+size) > malloc_limit) {
+ if ((ruby_gc_stress && !ruby_disable_gc_stress) ||
+ (malloc_increase+size) > malloc_limit) {
garbage_collect(objspace);
}
RUBY_CRITICAL(mem = malloc(size));
@@ -360,7 +365,7 @@ vm_xrealloc(rb_objspace_t *objspace, void *ptr, size_t size)
}
if (!ptr) return ruby_xmalloc(size);
if (size == 0) size = 1;
- if (ruby_gc_stress) garbage_collect(objspace);
+ if (ruby_gc_stress && !ruby_disable_gc_stress) garbage_collect(objspace);
#if CALC_EXACT_MALLOC_SIZE
size += sizeof(size_t);
@@ -664,7 +669,7 @@ rb_newobj_from_heap(rb_objspace_t *objspace)
{
VALUE obj;
- if (ruby_gc_stress || !freelist) {
+ if ((ruby_gc_stress && !ruby_disable_gc_stress) || !freelist) {
if (!heaps_increment(objspace) && !garbage_collect(objspace)) {
rb_memerror();
}