ruby-changes:50883
From: ko1 <ko1@a...>
Date: Wed, 4 Apr 2018 17:19:49 +0900 (JST)
Subject: [ruby-changes:50883] ko1:r63090 (trunk): refactoring r63073.
ko1 2018-04-04 17:19:28 +0900 (Wed, 04 Apr 2018) New Revision: 63090 https://svn.ruby-lang.org/cgi-bin/viewvc.cgi?view=revision&revision=63090 Log: refactoring r63073. * cont.c (root_fiber_alloc): call `ConvertThreadToFiber()` here. `rb_fiber_t` for root_fiber is allocated before running Threads. Fiber objects wrapping this rb_fiber_t for root_fiber are created when root Fiber object is required explicitly (for example, Fiber switching and so on). We can put calling `ConvertThreadToFiber()`. In other words, we can pending `ConvertThreadToFiber()` until Fiber objects are created. Modified files: trunk/cont.c trunk/thread.c trunk/vm.c Index: vm.c =================================================================== --- vm.c (revision 63089) +++ vm.c (revision 63090) @@ -2425,7 +2425,7 @@ rb_execution_context_mark(const rb_execu https://github.com/ruby/ruby/blob/trunk/vm.c#L2425 } void rb_fiber_mark_self(rb_fiber_t *fib); -void rb_threadptr_root_fiber_setup_by_parent(rb_thread_t *th); +void rb_threadptr_root_fiber_setup(rb_thread_t *th); void rb_threadptr_root_fiber_release(rb_thread_t *th); static void @@ -2533,7 +2533,7 @@ static void https://github.com/ruby/ruby/blob/trunk/vm.c#L2533 th_init(rb_thread_t *th, VALUE self) { th->self = self; - rb_threadptr_root_fiber_setup_by_parent(th); + rb_threadptr_root_fiber_setup(th); /* allocate thread stack */ #ifdef USE_SIGALTSTACK Index: cont.c =================================================================== --- cont.c (revision 63089) +++ cont.c (revision 63090) @@ -1464,18 +1464,6 @@ rb_fiber_start(void) https://github.com/ruby/ruby/blob/trunk/cont.c#L1464 VM_UNREACHABLE(rb_fiber_start); } -#ifdef _WIN32 -static HANDLE -win32_convert_thread_to_fiber(void) -{ - HANDLE fib_handle = ConvertThreadToFiber(0); - if (!fib_handle) { - rb_bug("rb_threadptr_root_fiber_setup_by_child: ConvertThreadToFiber() failed - %s\n", rb_w32_strerror(-1)); - } - return fib_handle; -} -#endif - static rb_fiber_t * root_fiber_alloc(rb_thread_t *th) { @@ -1489,18 +1477,26 @@ root_fiber_alloc(rb_thread_t *th) https://github.com/ruby/ruby/blob/trunk/cont.c#L1477 th->root_fiber = fib; DATA_PTR(fibval) = fib; fib->cont.self = fibval; + #if FIBER_USE_NATIVE #ifdef _WIN32 + /* setup fib_handle for root Fiber */ if (fib->fib_handle == 0) { - fib->fib_handle = win32_convert_thread_to_fiber(); + if ((fib->fib_handle = ConvertThreadToFiber(0)) == 0) { + rb_bug("root_fiber_alloc: ConvertThreadToFiber() failed - %s\n", rb_w32_strerror(-1)); + } + } + else { + rb_bug("root_fiber_alloc: fib_handle is not NULL."); } #endif #endif + return fib; } void -rb_threadptr_root_fiber_setup_by_parent(rb_thread_t *th) +rb_threadptr_root_fiber_setup(rb_thread_t *th) { rb_fiber_t *fib = ruby_mimmalloc(sizeof(rb_fiber_t)); MEMZERO(fib, rb_fiber_t, 1); @@ -1509,23 +1505,8 @@ rb_threadptr_root_fiber_setup_by_parent( https://github.com/ruby/ruby/blob/trunk/cont.c#L1505 fib->cont.saved_ec.thread_ptr = th; fiber_status_set(fib, FIBER_RESUMED); /* skip CREATED */ th->ec = &fib->cont.saved_ec; -} -void -rb_threadptr_root_fiber_setup_by_child(rb_thread_t *th) -{ -#if FIBER_USE_NATIVE -#ifdef _WIN32 - rb_fiber_t *fib = th->ec->fiber_ptr; - - if (fib->fib_handle == 0) { - fib->fib_handle = win32_convert_thread_to_fiber(); - } - else { - rb_bug("rb_threadptr_root_fiber_setup_by_child: fib_handle is not NULL."); - } -#endif -#endif + /* NOTE: On WIN32, fib_handle is not allocated yet. */ } void Index: thread.c =================================================================== --- thread.c (revision 63089) +++ thread.c (revision 63090) @@ -643,7 +643,6 @@ thread_do_start(rb_thread_t *th, VALUE a https://github.com/ruby/ruby/blob/trunk/thread.c#L643 } void rb_ec_clear_current_thread_trace_func(const rb_execution_context_t *ec); -void rb_threadptr_root_fiber_setup_by_child(rb_thread_t *th); static int thread_start_func_2(rb_thread_t *th, VALUE *stack_start, VALUE *register_stack_start) @@ -663,7 +662,6 @@ thread_start_func_2(rb_thread_t *th, VAL https://github.com/ruby/ruby/blob/trunk/thread.c#L662 rb_bug("thread_start_func_2 must not be used for main thread"); ruby_thread_set_native(th); - rb_threadptr_root_fiber_setup_by_child(th); th->ec->machine.stack_start = stack_start; #ifdef __ia64 -- ML: ruby-changes@q... Info: http://www.atdot.net/~ko1/quickml/