diff options
| author | Tomoyuki Sahara <[email protected]> | 2013-09-30 10:55:09 +0900 |
|---|---|---|
| committer | Tomoyuki Sahara <[email protected]> | 2013-09-30 10:55:09 +0900 |
| commit | adb3bd669831ed1c04708076072313a209e2d848 (patch) | |
| tree | b35ae64381ba959f5305863c94a99a7ae94c0034 /src | |
| parent | d75d23294d31c3fea16f849a73823fd9d3f17dd9 (diff) | |
| download | mruby-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.c | 33 |
1 files changed, 14 insertions, 19 deletions
@@ -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(); |
