aboutsummaryrefslogtreecommitdiffstats
path: root/process.c
diff options
context:
space:
mode:
authork0kubun <k0kubun@b2dd03c8-39d4-4d8f-98ff-823fe69b080e>2018-11-20 00:04:19 +0000
committerk0kubun <k0kubun@b2dd03c8-39d4-4d8f-98ff-823fe69b080e>2018-11-20 00:04:19 +0000
commit3405411cc427291e13e2cf146b730ec1b3669dce (patch)
tree0d5f8247a780aa338899c75b41f3aaf384c0a7c5 /process.c
parent95e09343a400b47e2e1c1dcee4e48faece9b599e (diff)
downloadruby-3405411cc427291e13e2cf146b730ec1b3669dce.tar.gz
process.c: do not try to pause MJIT
while child handler is disabled. trying to fix [Bug #15320] git-svn-id: svn+ssh://ci.ruby-lang.org/ruby/trunk@65817 b2dd03c8-39d4-4d8f-98ff-823fe69b080e
Diffstat (limited to 'process.c')
-rw-r--r--process.c27
1 files changed, 8 insertions, 19 deletions
diff --git a/process.c b/process.c
index b9c7c4a151..6402a425fb 100644
--- a/process.c
+++ b/process.c
@@ -1502,26 +1502,12 @@ after_exec(void)
}
#if defined HAVE_WORKING_FORK || defined HAVE_DAEMON
+#define before_fork_ruby() before_exec()
static void
-before_fork_ruby(void)
-{
- if (mjit_enabled) {
- /* avoid leaving locked mutex and units being modified for child process. */
- mjit_pause(FALSE);
- }
-
- before_exec();
-}
-
-static void
-after_fork_ruby(int parent_p)
+after_fork_ruby(void)
{
rb_threadptr_pending_interrupt_clear(GET_THREAD());
after_exec();
-
- if (mjit_enabled && parent_p) { /* child is cared by `rb_thread_atfork` */
- mjit_resume();
- }
}
#endif
@@ -4007,12 +3993,14 @@ rb_fork_ruby(int *status)
while (1) {
prefork();
+ if (mjit_enabled) mjit_pause(FALSE); /* Don't leave locked mutex to child. Note: child_handler must be enabled to pause MJIT. */
disable_child_handler_before_fork(&old);
before_fork_ruby();
pid = fork();
err = errno;
- after_fork_ruby(pid > 0);
+ after_fork_ruby();
disable_child_handler_fork_parent(&old); /* yes, bad name */
+ if (mjit_enabled && pid > 0) mjit_resume(); /* child (pid == 0) is cared by rb_thread_atfork */
if (pid >= 0) /* fork succeed */
return pid;
/* fork failed */
@@ -6434,10 +6422,11 @@ rb_daemon(int nochdir, int noclose)
{
int err = 0;
#ifdef HAVE_DAEMON
+ if (mjit_enabled) mjit_pause(FALSE); /* Don't leave locked mutex to child. */
before_fork_ruby();
err = daemon(nochdir, noclose);
- after_fork_ruby(TRUE);
- rb_thread_atfork();
+ after_fork_ruby();
+ rb_thread_atfork(); /* calls mjit_resume() */
#else
int n;