Bug #2258 » 0001-add-ruby_bind_stack-to-inform-GC-about-explicit-stac.patch
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 *);
|