Merge rb_fork_ruby2 into rb_fork_ruby

This commit is contained in:
Nobuyoshi Nakada 2024-04-14 14:01:44 +09:00
parent 7061359564
commit 566f2eb501
No known key found for this signature in database
GPG Key ID: 3582D74E1FEE4465

View File

@ -4215,50 +4215,30 @@ rb_fork_async_signal_safe(int *status,
return result; return result;
} }
static rb_pid_t rb_pid_t
rb_fork_ruby2(struct rb_process_status *status) rb_fork_ruby(int *status)
{ {
struct rb_process_status child = {.status = 0};
rb_pid_t pid; rb_pid_t pid;
int try_gc = 1, err; int try_gc = 1, err;
struct child_handler_disabler_state old; struct child_handler_disabler_state old;
if (status) status->status = 0; do {
while (1) {
prefork(); prefork();
before_fork_ruby(); before_fork_ruby();
disable_child_handler_before_fork(&old); disable_child_handler_before_fork(&old);
{
pid = rb_fork(); child.pid = pid = rb_fork();
err = errno; child.error = err = errno;
if (status) {
status->pid = pid;
status->error = err;
}
}
disable_child_handler_fork_parent(&old); /* yes, bad name */ disable_child_handler_fork_parent(&old); /* yes, bad name */
after_fork_ruby(pid); after_fork_ruby(pid);
if (pid >= 0) { /* fork succeed */ /* repeat while fork failed but retryable */
return pid; } while (pid < 0 && handle_fork_error(err, &child, NULL, &try_gc) == 0);
}
/* fork failed */ if (status) *status = child.status;
if (handle_fork_error(err, status, NULL, &try_gc)) {
return -1;
}
}
}
rb_pid_t
rb_fork_ruby(int *status)
{
struct rb_process_status process_status = {0};
rb_pid_t pid = rb_fork_ruby2(&process_status);
if (status) *status = process_status.status;
return pid; return pid;
} }