Commit adb3bd66 authored by Tomoyuki Sahara's avatar Tomoyuki Sahara

don't retry when we cannot fork(2).

EAGAIN indicates the system is under heavy load.
Retrying make things worse.
parent d75d2329
...@@ -198,6 +198,7 @@ mrb_io_s_popen(mrb_state *mrb, mrb_value klass) ...@@ -198,6 +198,7 @@ mrb_io_s_popen(mrb_state *mrb, mrb_value klass)
int pr[2] = { -1, -1 }; int pr[2] = { -1, -1 };
int pw[2] = { -1, -1 }; int pw[2] = { -1, -1 };
int doexec; int doexec;
int saved_errno;
mrb_get_args(mrb, "S|SH", &cmd, &mode, &opt); mrb_get_args(mrb, "S|SH", &cmd, &mode, &opt);
io = mrb_obj_value(mrb_data_object_alloc(mrb, mrb_class_ptr(klass), NULL, &mrb_io_type)); io = mrb_obj_value(mrb_data_object_alloc(mrb, mrb_class_ptr(klass), NULL, &mrb_io_type));
...@@ -223,7 +224,6 @@ mrb_io_s_popen(mrb_state *mrb, mrb_value klass) ...@@ -223,7 +224,6 @@ mrb_io_s_popen(mrb_state *mrb, mrb_value klass)
fflush(stderr); fflush(stderr);
} }
retry:
switch (pid = fork()) { switch (pid = fork()) {
case 0: /* child */ case 0: /* child */
if (flags & FMODE_READABLE) { if (flags & FMODE_READABLE) {
...@@ -250,24 +250,6 @@ retry: ...@@ -250,24 +250,6 @@ retry:
_exit(127); _exit(127);
} }
return mrb_nil_value(); return mrb_nil_value();
case -1: /* error */
if (errno == EAGAIN) {
goto retry;
} else {
int e = errno;
if (flags & FMODE_READABLE) {
close(pr[0]);
close(pr[1]);
}
if (flags & FMODE_WRITABLE) {
close(pw[0]);
close(pw[1]);
}
errno = e;
mrb_sys_fail(mrb, "pipe_open failed.");
}
break;
default: /* parent */ default: /* parent */
if (pid < 0) { if (pid < 0) {
mrb_sys_fail(mrb, "pipe_open failed."); mrb_sys_fail(mrb, "pipe_open failed.");
...@@ -298,6 +280,19 @@ retry: ...@@ -298,6 +280,19 @@ retry:
DATA_PTR(io) = fptr; DATA_PTR(io) = fptr;
return io; return io;
} }
case -1: /* error */
saved_errno = errno;
if (flags & FMODE_READABLE) {
close(pr[0]);
close(pr[1]);
}
if (flags & FMODE_WRITABLE) {
close(pw[0]);
close(pw[1]);
}
errno = saved_errno;
mrb_sys_fail(mrb, "pipe_open failed.");
break;
} }
return mrb_nil_value(); return mrb_nil_value();
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment