summaryrefslogtreecommitdiff
path: root/process.c
diff options
context:
space:
mode:
authorNobuyoshi Nakada <nobu@ruby-lang.org>2022-07-14 17:39:03 +0900
committerNobuyoshi Nakada <nobu@ruby-lang.org>2022-08-12 16:57:56 +0900
commitb2205cd45c64c8aaaa19d71836522d8aaac324d5 (patch)
tree0e9e2d6750fd6eb812349f107d54c23f631044b1 /process.c
parent844a0edbae6e74293e3d0cb1ceeeb66a4371d06d (diff)
Short-circuit `Process._fork`
Notes
Notes: Merged: https://github.com/ruby/ruby/pull/6139
Diffstat (limited to 'process.c')
-rw-r--r--process.c31
1 files changed, 22 insertions, 9 deletions
diff --git a/process.c b/process.c
index 0e4dbc40f4..57df2dc06f 100644
--- a/process.c
+++ b/process.c
@@ -4328,12 +4328,30 @@ rb_fork_ruby(int *status)
return pid;
}
+static rb_pid_t
+proc_fork_pid(void)
+{
+ rb_pid_t pid = rb_fork_ruby(NULL);
+
+ if (pid == -1) {
+ rb_sys_fail("fork(2)");
+ }
+
+ return pid;
+}
+
rb_pid_t
rb_call_proc__fork(void)
{
- VALUE pid = rb_funcall(rb_mProcess, rb_intern("_fork"), 0);
-
- return NUM2PIDT(pid);
+ ID id__fork;
+ CONST_ID(id__fork, "_fork");
+ if (rb_method_basic_definition_p(CLASS_OF(rb_mProcess), id__fork)) {
+ return proc_fork_pid();
+ }
+ else {
+ VALUE pid = rb_funcall(rb_mProcess, id__fork, 0);
+ return NUM2PIDT(pid);
+ }
}
#endif
@@ -4360,12 +4378,7 @@ rb_call_proc__fork(void)
VALUE
rb_proc__fork(VALUE _obj)
{
- rb_pid_t pid = rb_fork_ruby(NULL);
-
- if (pid == -1) {
- rb_sys_fail("fork(2)");
- }
-
+ rb_pid_t pid = proc_fork_pid();
return PIDT2NUM(pid);
}