[前][次][番号順一覧][スレッド一覧]

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/

[前][次][番号順一覧][スレッド一覧]