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

ruby-changes:53591

From: k0kubun <ko1@a...>
Date: Mon, 19 Nov 2018 22:33:14 +0900 (JST)
Subject: [ruby-changes:53591] k0kubun:r65807 (trunk): process.c: do not run signal handler before fork

k0kubun	2018-11-19 22:33:07 +0900 (Mon, 19 Nov 2018)

  New Revision: 65807

  https://svn.ruby-lang.org/cgi-bin/viewvc.cgi?view=revision&revision=65807

  Log:
    process.c: do not run signal handler before fork
    
    to prevent from proceeding one for MJIT while it's not safe yet.
    By that situation, MJIT worker could be waiting for compiler process forever
    http://ci.rvm.jp/results/trunk-mjit@silicon-docker/1468033
    
    [Bug #15320]

  Modified files:
    trunk/internal.h
    trunk/mjit.c
    trunk/process.c
Index: mjit.c
===================================================================
--- mjit.c	(revision 65806)
+++ mjit.c	(revision 65807)
@@ -677,7 +677,7 @@ mjit_init(struct mjit_options *opts) https://github.com/ruby/ruby/blob/trunk/mjit.c#L677
 }
 
 static void
-stop_worker(void)
+stop_worker(int check_ints_p)
 {
     rb_execution_context_t *ec = GET_EC();
 
@@ -687,10 +687,17 @@ stop_worker(void) https://github.com/ruby/ruby/blob/trunk/mjit.c#L687
         stop_worker_p = TRUE; /* Setting this inside loop because RUBY_VM_CHECK_INTS may make this FALSE. */
         rb_native_cond_broadcast(&mjit_worker_wakeup);
         CRITICAL_SECTION_FINISH(3, "in stop_worker");
-        RUBY_VM_CHECK_INTS(ec);
+        if (check_ints_p) RUBY_VM_CHECK_INTS(ec);
     }
 }
 
+/* A function to stop MJIT worker when it's not safe to allow interrupts. */
+void
+mjit_pause_without_ints(void)
+{
+    stop_worker(FALSE);
+}
+
 /* Stop JIT-compiling methods but compiled code is kept available. */
 VALUE
 mjit_pause(int wait_p)
@@ -716,7 +723,7 @@ mjit_pause(int wait_p) https://github.com/ruby/ruby/blob/trunk/mjit.c#L723
         }
     }
 
-    stop_worker();
+    stop_worker(TRUE);
     return Qtrue;
 }
 
@@ -809,7 +816,7 @@ mjit_finish(void) https://github.com/ruby/ruby/blob/trunk/mjit.c#L816
     CRITICAL_SECTION_FINISH(3, "in mjit_finish to wakeup from pch");
 
     /* Stop worker */
-    stop_worker();
+    stop_worker(TRUE);
 
     rb_native_mutex_destroy(&mjit_engine_mutex);
     rb_native_cond_destroy(&mjit_pch_wakeup);
Index: process.c
===================================================================
--- process.c	(revision 65806)
+++ process.c	(revision 65807)
@@ -1506,8 +1506,9 @@ static void https://github.com/ruby/ruby/blob/trunk/process.c#L1506
 before_fork_ruby(void)
 {
     if (mjit_enabled) {
-        /* avoid leaving locked mutex and units being modified for child process. */
-        mjit_pause(FALSE);
+        /* Avoid leaving locked mutex and units being modified for child process. Here may not be
+           safe for proceeding SIGCHLD handler, so this does not allow RUBY_VM_CHECK_INTS. */
+        mjit_pause_without_ints();
     }
 
     before_exec();
Index: internal.h
===================================================================
--- internal.h	(revision 65806)
+++ internal.h	(revision 65807)
@@ -1633,6 +1633,7 @@ VALUE rb_math_sqrt(VALUE); https://github.com/ruby/ruby/blob/trunk/internal.h#L1633
 #if USE_MJIT
 extern int mjit_enabled;
 VALUE mjit_pause(int wait_p);
+void mjit_pause_without_ints(void);
 VALUE mjit_resume(void);
 #else
 #define mjit_enabled 0

--
ML: ruby-changes@q...
Info: http://www.atdot.net/~ko1/quickml/

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