From e205cd80d2e4a4b77a06b74758dfd566d7c0b719 Mon Sep 17 00:00:00 2001 From: k0kubun Date: Mon, 19 Nov 2018 13:33:07 +0000 Subject: 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] git-svn-id: svn+ssh://ci.ruby-lang.org/ruby/trunk@65807 b2dd03c8-39d4-4d8f-98ff-823fe69b080e --- mjit.c | 15 +++++++++++---- 1 file changed, 11 insertions(+), 4 deletions(-) (limited to 'mjit.c') diff --git a/mjit.c b/mjit.c index 1578c961ae..9c2cfcfedf 100644 --- a/mjit.c +++ b/mjit.c @@ -677,7 +677,7 @@ mjit_init(struct mjit_options *opts) } 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) 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) } } - stop_worker(); + stop_worker(TRUE); return Qtrue; } @@ -809,7 +816,7 @@ mjit_finish(void) 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); -- cgit v1.2.3