summaryrefslogtreecommitdiff
path: root/cont.c
diff options
context:
space:
mode:
authorko1 <ko1@b2dd03c8-39d4-4d8f-98ff-823fe69b080e>2018-04-04 08:19:28 +0000
committerko1 <ko1@b2dd03c8-39d4-4d8f-98ff-823fe69b080e>2018-04-04 08:19:28 +0000
commit51d227e3a5e6ae3e5d796a9e5fac35ad00a85e16 (patch)
tree70638b1ee05d2c976ab58dd37a252350adffe0b0 /cont.c
parent746a88e19996fe3400f1734998c46291c729ecf9 (diff)
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. git-svn-id: svn+ssh://ci.ruby-lang.org/ruby/trunk@63090 b2dd03c8-39d4-4d8f-98ff-823fe69b080e
Diffstat (limited to 'cont.c')
-rw-r--r--cont.c41
1 files changed, 11 insertions, 30 deletions
diff --git a/cont.c b/cont.c
index 253a056f64..e4fe644481 100644
--- a/cont.c
+++ b/cont.c
@@ -1464,18 +1464,6 @@ rb_fiber_start(void)
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)
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(rb_thread_t *th)
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