summaryrefslogtreecommitdiffhomepage
path: root/src
diff options
context:
space:
mode:
authorTomoyuki Sahara <[email protected]>2013-09-30 10:55:09 +0900
committerTomoyuki Sahara <[email protected]>2013-09-30 10:55:09 +0900
commitadb3bd669831ed1c04708076072313a209e2d848 (patch)
treeb35ae64381ba959f5305863c94a99a7ae94c0034 /src
parentd75d23294d31c3fea16f849a73823fd9d3f17dd9 (diff)
downloadmruby-adb3bd669831ed1c04708076072313a209e2d848.tar.gz
mruby-adb3bd669831ed1c04708076072313a209e2d848.zip
don't retry when we cannot fork(2).
EAGAIN indicates the system is under heavy load. Retrying make things worse.
Diffstat (limited to 'src')
-rw-r--r--src/io.c33
1 files changed, 14 insertions, 19 deletions
diff --git a/src/io.c b/src/io.c
index 284d90877..d59d95b97 100644
--- a/src/io.c
+++ b/src/io.c
@@ -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();