diff options
| author | Tomoyuki Sahara <[email protected]> | 2014-11-13 09:27:11 +0900 |
|---|---|---|
| committer | Tomoyuki Sahara <[email protected]> | 2014-11-13 09:27:11 +0900 |
| commit | 379c5a6d880c7d3a3ea7816c7e9da28834edb046 (patch) | |
| tree | 9aaf2ffbae43d086e9139046760394c44664aa46 /src | |
| parent | 190264b3c8730bc76dc1bc2abaee58c9ce078604 (diff) | |
| parent | b50093ad28b7f068da38ed0c702aa8c615584576 (diff) | |
| download | mruby-379c5a6d880c7d3a3ea7816c7e9da28834edb046.tar.gz mruby-379c5a6d880c7d3a3ea7816c7e9da28834edb046.zip | |
Merge pull request #25 from matz/gc_on_enfile
garbage collect when open(2) fails with ENFILE or EMFILE
Diffstat (limited to 'src')
| -rw-r--r-- | src/io.c | 12 |
1 files changed, 11 insertions, 1 deletions
@@ -374,7 +374,7 @@ mrb_io_s_sysopen(mrb_state *mrb, mrb_value klass) mrb_value mode = mrb_nil_value(); mrb_int fd, flags, perm = -1; const char *pat; - int modenum; + int modenum, retry = FALSE; mrb_get_args(mrb, "S|Si", &path, &mode, &perm); if (mrb_nil_p(mode)) { @@ -388,8 +388,18 @@ mrb_io_s_sysopen(mrb_state *mrb, mrb_value klass) flags = mrb_io_modestr_to_flags(mrb, mrb_string_value_cstr(mrb, &mode)); modenum = mrb_io_flags_to_modenum(mrb, flags); + reopen: fd = open(pat, modenum, perm); if (fd == -1) { + if (!retry) { + switch (errno) { + case ENFILE: + case EMFILE: + mrb_garbage_collect(mrb); + retry = TRUE; + goto reopen; + } + } mrb_sys_fail(mrb, pat); } |
