Move vm stack init into thread.
This commit is contained in:
parent
69195fd9b2
commit
b24603adff
4
gc.c
4
gc.c
@ -9398,6 +9398,10 @@ rb_memerror(void)
|
|||||||
rb_objspace_t *objspace = rb_objspace_of(rb_ec_vm_ptr(ec));
|
rb_objspace_t *objspace = rb_objspace_of(rb_ec_vm_ptr(ec));
|
||||||
VALUE exc;
|
VALUE exc;
|
||||||
|
|
||||||
|
// Print out pid, sleep, so you can attach debugger to see what went wrong:
|
||||||
|
// fprintf(stderr, "rb_memerror pid=%d\n", getpid());
|
||||||
|
// sleep(60);
|
||||||
|
|
||||||
if (during_gc) gc_exit(objspace, "rb_memerror");
|
if (during_gc) gc_exit(objspace, "rb_memerror");
|
||||||
|
|
||||||
exc = nomem_error;
|
exc = nomem_error;
|
||||||
|
26
thread.c
26
thread.c
@ -695,6 +695,17 @@ thread_do_start(rb_thread_t *th)
|
|||||||
}
|
}
|
||||||
|
|
||||||
void rb_ec_clear_current_thread_trace_func(const rb_execution_context_t *ec);
|
void rb_ec_clear_current_thread_trace_func(const rb_execution_context_t *ec);
|
||||||
|
rb_control_frame_t *
|
||||||
|
rb_vm_push_frame(rb_execution_context_t *sec,
|
||||||
|
const rb_iseq_t *iseq,
|
||||||
|
VALUE type,
|
||||||
|
VALUE self,
|
||||||
|
VALUE specval,
|
||||||
|
VALUE cref_or_me,
|
||||||
|
const VALUE *pc,
|
||||||
|
VALUE *sp,
|
||||||
|
int local_size,
|
||||||
|
int stack_max);
|
||||||
|
|
||||||
static int
|
static int
|
||||||
thread_start_func_2(rb_thread_t *th, VALUE *stack_start, VALUE *register_stack_start)
|
thread_start_func_2(rb_thread_t *th, VALUE *stack_start, VALUE *register_stack_start)
|
||||||
@ -703,9 +714,22 @@ thread_start_func_2(rb_thread_t *th, VALUE *stack_start, VALUE *register_stack_s
|
|||||||
rb_thread_list_t *join_list;
|
rb_thread_list_t *join_list;
|
||||||
rb_thread_t *main_th;
|
rb_thread_t *main_th;
|
||||||
VALUE errinfo = Qnil;
|
VALUE errinfo = Qnil;
|
||||||
|
size_t vm_stack_size = th->vm->default_params.thread_vm_stack_size;
|
||||||
|
|
||||||
if (th == th->vm->main_thread)
|
if (th == th->vm->main_thread) {
|
||||||
rb_bug("thread_start_func_2 must not be used for main thread");
|
rb_bug("thread_start_func_2 must not be used for main thread");
|
||||||
|
}
|
||||||
|
|
||||||
|
rb_ec_set_vm_stack(th->ec, alloca(vm_stack_size), vm_stack_size / sizeof(VALUE));
|
||||||
|
th->ec->cfp = (void *)(th->ec->vm_stack + th->ec->vm_stack_size);
|
||||||
|
|
||||||
|
rb_vm_push_frame(th->ec,
|
||||||
|
0 /* dummy iseq */,
|
||||||
|
VM_FRAME_MAGIC_DUMMY | VM_ENV_FLAG_LOCAL | VM_FRAME_FLAG_FINISH | VM_FRAME_FLAG_CFRAME /* dummy frame */,
|
||||||
|
Qnil /* dummy self */, VM_BLOCK_HANDLER_NONE /* dummy block ptr */,
|
||||||
|
0 /* dummy cref/me */,
|
||||||
|
0 /* dummy pc */, th->ec->vm_stack, 0, 0
|
||||||
|
);
|
||||||
|
|
||||||
ruby_thread_set_native(th);
|
ruby_thread_set_native(th);
|
||||||
|
|
||||||
|
11
vm.c
11
vm.c
@ -2691,19 +2691,18 @@ th_init(rb_thread_t *th, VALUE self)
|
|||||||
th->self = self;
|
th->self = self;
|
||||||
rb_threadptr_root_fiber_setup(th);
|
rb_threadptr_root_fiber_setup(th);
|
||||||
|
|
||||||
{
|
// Initialize the main thread:
|
||||||
/* vm_stack_size is word number.
|
if (self == 0) {
|
||||||
* th->vm->default_params.thread_vm_stack_size is byte size. */
|
|
||||||
size_t size = th->vm->default_params.thread_vm_stack_size / sizeof(VALUE);
|
size_t size = th->vm->default_params.thread_vm_stack_size / sizeof(VALUE);
|
||||||
rb_ec_set_vm_stack(th->ec, rb_thread_recycle_stack(size), size);
|
VALUE * vm_stack = ALLOC_N(VALUE, size);
|
||||||
}
|
rb_ec_set_vm_stack(th->ec, vm_stack, size);
|
||||||
|
|
||||||
th->ec->cfp = (void *)(th->ec->vm_stack + th->ec->vm_stack_size);
|
th->ec->cfp = (void *)(th->ec->vm_stack + th->ec->vm_stack_size);
|
||||||
|
|
||||||
vm_push_frame(th->ec, 0 /* dummy iseq */, VM_FRAME_MAGIC_DUMMY | VM_ENV_FLAG_LOCAL | VM_FRAME_FLAG_FINISH | VM_FRAME_FLAG_CFRAME /* dummy frame */,
|
vm_push_frame(th->ec, 0 /* dummy iseq */, VM_FRAME_MAGIC_DUMMY | VM_ENV_FLAG_LOCAL | VM_FRAME_FLAG_FINISH | VM_FRAME_FLAG_CFRAME /* dummy frame */,
|
||||||
Qnil /* dummy self */, VM_BLOCK_HANDLER_NONE /* dummy block ptr */,
|
Qnil /* dummy self */, VM_BLOCK_HANDLER_NONE /* dummy block ptr */,
|
||||||
0 /* dummy cref/me */,
|
0 /* dummy cref/me */,
|
||||||
0 /* dummy pc */, th->ec->vm_stack, 0, 0);
|
0 /* dummy pc */, th->ec->vm_stack, 0, 0);
|
||||||
|
}
|
||||||
|
|
||||||
th->status = THREAD_RUNNABLE;
|
th->status = THREAD_RUNNABLE;
|
||||||
th->last_status = Qnil;
|
th->last_status = Qnil;
|
||||||
|
Loading…
x
Reference in New Issue
Block a user