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

EAGAIN indicates the system is under heavy load.
Retrying make things worse.
This commit is contained in:
Tomoyuki Sahara
2013-09-30 10:55:09 +09:00
parent d75d23294d
commit adb3bd6698
+14 -19
View File
@@ -198,6 +198,7 @@ mrb_io_s_popen(mrb_state *mrb, mrb_value klass)
int pr[2] = { -1, -1 };
int pw[2] = { -1, -1 };
int doexec;
int saved_errno;
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));
@@ -223,7 +224,6 @@ mrb_io_s_popen(mrb_state *mrb, mrb_value klass)
fflush(stderr);
}
retry:
switch (pid = fork()) {
case 0: /* child */
if (flags & FMODE_READABLE) {
@@ -250,24 +250,6 @@ retry:
_exit(127);
}
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 */
if (pid < 0) {
mrb_sys_fail(mrb, "pipe_open failed.");
@@ -298,6 +280,19 @@ retry:
DATA_PTR(io) = fptr;
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();