Project

General

Profile

Bug #2258 » 0001-add-ruby_bind_stack-to-inform-GC-about-explicit-stac.patch

good, minimal solution for this problem - sunaku (Suraj Kurapati), 10/25/2009 01:28 PM

View differences:

gc.c
void rb_vm_mark(void *ptr);
static VALUE *ruby_gc_stack_lower = 0,
*ruby_gc_stack_upper = 0;
void
ruby_bind_stack(VALUE *lower, VALUE *upper)
{
ruby_gc_stack_lower = lower;
ruby_gc_stack_upper = upper;
}
static void
mark_current_machine_context(rb_objspace_t *objspace, rb_thread_t *th)
{
......
(VALUE*)save_regs_gc_mark,
sizeof(save_regs_gc_mark) / sizeof(VALUE));
if (ruby_gc_stack_upper && stack_end > ruby_gc_stack_upper) {
stack_end = ruby_gc_stack_upper;
}
if (ruby_gc_stack_lower && stack_start < ruby_gc_stack_lower) {
stack_end = ruby_gc_stack_lower;
}
rb_gc_mark_locations(stack_start, stack_end);
#ifdef __ia64
rb_gc_mark_locations(th->machine_register_stack_start, th->machine_register_stack_end);
include/ruby/ruby.h
#define RUBY_INIT_STACK \
VALUE variable_in_this_stack_frame; \
ruby_init_stack(&variable_in_this_stack_frame);
void ruby_bind_stack(VALUE *lower, VALUE *upper);
void ruby_init(void);
void *ruby_options(int, char**);
int ruby_run_node(void *);
(11-11/21)