diff options
author | Takashi Kokubun <takashikkbn@gmail.com> | 2022-09-04 18:21:56 -0700 |
---|---|---|
committer | Takashi Kokubun <takashikkbn@gmail.com> | 2022-09-04 18:22:25 -0700 |
commit | f6d569b7c0ae7cb5e08534330cdf94572a12e869 (patch) | |
tree | 204f12d86933c498632981dbac3de4991f5bae8a /process.c | |
parent | 51291ade70d7fc972cb8229fc788456a8c2d8a6b (diff) |
Call appropriate hooks on MJIT's fork
This takes care of signal_self_pipe and other things.
Diffstat (limited to 'process.c')
-rw-r--r-- | process.c | 23 |
1 files changed, 23 insertions, 0 deletions
@@ -4204,6 +4204,29 @@ retry_fork_async_signal_safe(struct rb_process_status *status, int *ep, } } +#if USE_MJIT +// This is used to create MJIT's child Ruby process +pid_t +rb_mjit_fork(void) +{ + struct child_handler_disabler_state old; + rb_vm_t *vm = GET_VM(); + prefork(); + disable_child_handler_before_fork(&old); + before_fork_ruby(); + + rb_native_mutex_lock(&vm->waitpid_lock); + pid_t pid = rb_fork(); + if (pid > 0) mjit_add_waiting_pid(vm, pid); + rb_native_mutex_unlock(&vm->waitpid_lock); + + after_fork_ruby(); + disable_child_handler_fork_parent(&old); + + return pid; +} +#endif + static rb_pid_t fork_check_err(struct rb_process_status *status, int (*chfunc)(void*, char *, size_t), void *charg, VALUE fds, char *errmsg, size_t errmsg_buflen, |