1
0
Fork 0
mirror of https://github.com/ruby/ruby.git synced 2022-11-09 12:17:21 -05:00

MJIT: Do not hang after forking with threads

First, rb_mjit_fork should call rb_thread_atfork to stop threads after
fork in the child process. Unfortunately, we cannot use rb_fork_ruby to
prevent this kind of mistakes because MJIT needs special handling of
waiting_pid and mjit_pause/resume.

Second, mjit_waitpid_finished should be checked regardless of
trap_interrupt. It doesn't seem like the flag is not set when SIGCHLD is
handled for an MJIT child process.
This commit is contained in:
Takashi Kokubun 2022-09-11 08:59:27 +09:00
parent c22a668580
commit aa8a3b2358
No known key found for this signature in database
GPG key ID: 6FFC433B12EE23DD
2 changed files with 8 additions and 7 deletions

View file

@ -4222,6 +4222,7 @@ rb_mjit_fork(void)
after_fork_ruby();
disable_child_handler_fork_parent(&old);
if (pid == 0) rb_thread_atfork();
return pid;
}

View file

@ -2321,16 +2321,16 @@ rb_threadptr_execute_interrupts(rb_thread_t *th, int blocking_timing)
ret |= rb_signal_exec(th, sig);
}
th->status = prev_status;
}
#if USE_MJIT
// Handle waitpid_signal for MJIT issued by ruby_sigchld_handler. This needs to be done
// outside ruby_sigchld_handler to avoid recursively relying on the SIGCHLD handler.
if (mjit_waitpid_finished) {
if (mjit_waitpid_finished && th == th->vm->ractor.main_thread) {
mjit_waitpid_finished = false;
mjit_notify_waitpid(WIFEXITED(mjit_waitpid_status) ? WEXITSTATUS(mjit_waitpid_status) : -1);
}
#endif
}
/* exception from another thread */
if (pending_interrupt && threadptr_pending_interrupt_active_p(th)) {