diff options
-rw-r--r-- | internal.h | 1 | ||||
-rw-r--r-- | mjit.c | 15 | ||||
-rw-r--r-- | process.c | 5 |
3 files changed, 15 insertions, 6 deletions
diff --git a/internal.h b/internal.h index d36723b273..6b00cbedc5 100644 --- a/internal.h +++ b/internal.h @@ -1633,6 +1633,7 @@ VALUE rb_math_sqrt(VALUE); #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 @@ -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); @@ -1506,8 +1506,9 @@ static void 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(); |