Better handling of root fiber.

This commit is contained in:
Samuel Williams 2019-06-05 18:23:04 +12:00
parent 7c7a1c2212
commit 38791145eb
3 changed files with 18 additions and 18 deletions

7
cont.c
View File

@ -420,10 +420,7 @@ cont_free(void *ptr)
rb_fiber_t *fib = (rb_fiber_t*)cont; rb_fiber_t *fib = (rb_fiber_t*)cont;
#if defined(FIBER_USE_COROUTINE) #if defined(FIBER_USE_COROUTINE)
coroutine_destroy(&fib->context); coroutine_destroy(&fib->context);
if (fib->ss_sp != NULL) { if (fib->ss_sp != NULL && !fiber_is_root_p(fib)) {
if (fiber_is_root_p(fib)) {
rb_bug("Illegal root fiber parameter");
}
#ifdef _WIN32 #ifdef _WIN32
VirtualFree((void*)fib->ss_sp, 0, MEM_RELEASE); VirtualFree((void*)fib->ss_sp, 0, MEM_RELEASE);
#else #else
@ -1661,6 +1658,8 @@ rb_threadptr_root_fiber_setup(rb_thread_t *th)
fiber_status_set(fib, FIBER_RESUMED); /* skip CREATED */ fiber_status_set(fib, FIBER_RESUMED); /* skip CREATED */
th->ec = &fib->cont.saved_ec; th->ec = &fib->cont.saved_ec;
th->root_fiber = fib;
/* NOTE: On WIN32, fib_handle is not allocated yet. */ /* NOTE: On WIN32, fib_handle is not allocated yet. */
} }

View File

@ -714,29 +714,30 @@ 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;
VALUE * vm_stack = NULL;
size_t size = th->vm->default_params.thread_vm_stack_size / sizeof(VALUE);
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");
} }
{ vm_stack = alloca(size * sizeof(VALUE));
size_t size = th->vm->default_params.thread_vm_stack_size / sizeof(VALUE); rb_ec_set_vm_stack(th->ec, vm_stack, size);
rb_ec_set_vm_stack(th->ec, alloca(size * sizeof(VALUE)), 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);
rb_vm_push_frame(th->ec, rb_vm_push_frame(th->ec,
0 /* dummy iseq */, 0 /* dummy iseq */,
VM_FRAME_MAGIC_DUMMY | VM_ENV_FLAG_LOCAL | VM_FRAME_FLAG_FINISH | VM_FRAME_FLAG_CFRAME /* dummy frame */, 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
); );
}
ruby_thread_set_native(th); ruby_thread_set_native(th);
th->ec->machine.stack_start = stack_start; th->ec->machine.stack_start = vm_stack;
th->ec->machine.stack_maxsize = th->ec->machine.stack_end - th->ec->machine.stack_start;
#ifdef __ia64 #ifdef __ia64
th->ec->machine.register_stack_start = register_stack_start; th->ec->machine.register_stack_start = register_stack_start;
#endif #endif

2
vm.c
View File

@ -2625,7 +2625,7 @@ thread_free(void *ptr)
rb_bug("thread_free: keeping_mutexes must be NULL (%p:%p)", (void *)th, (void *)th->keeping_mutexes); rb_bug("thread_free: keeping_mutexes must be NULL (%p:%p)", (void *)th, (void *)th->keeping_mutexes);
} }
//rb_threadptr_root_fiber_release(th); rb_threadptr_root_fiber_release(th);
if (th->vm && th->vm->main_thread == th) { if (th->vm && th->vm->main_thread == th) {
RUBY_GC_INFO("main thread\n"); RUBY_GC_INFO("main thread\n");