Project

General

Profile

Feature #11727 ยป 0001-io.c-rb_gc_for_fd-wrapper-for-retrying-FD-creation.patch

normalperson (Eric Wong), 11/21/2015 10:56 AM

View differences:

io.c
}
static int
rb_gc_for_fd(int err)
{
if (err == EMFILE || err == ENFILE || err == ENOMEM) {
rb_gc();
return 1;
}
return 0;
}
static int
ruby_dup(int orig)
{
int fd;
fd = rb_cloexec_dup(orig);
if (fd < 0) {
if (errno == EMFILE || errno == ENFILE || errno == ENOMEM) {
rb_gc();
if (rb_gc_for_fd(errno)) {
fd = rb_cloexec_dup(orig);
}
if (fd < 0) {
......
fd = rb_sysopen_internal(&data);
if (fd < 0) {
if (errno == EMFILE || errno == ENFILE) {
rb_gc();
if (rb_gc_for_fd(errno)) {
fd = rb_sysopen_internal(&data);
}
if (fd < 0) {
......
#endif
file = fdopen(fd, modestr);
if (!file) {
if (
#if defined(__sun)
errno == 0 ||
#endif
errno == EMFILE || errno == ENFILE) {
if (errno == 0) {
rb_gc();
#if defined(__sun)
errno = 0;
file = fdopen(fd, modestr);
}
else
#endif
if (rb_gc_for_fd(errno)) {
file = fdopen(fd, modestr);
}
if (!file) {
......
int ret;
ret = rb_cloexec_pipe(pipes);
if (ret == -1) {
if (errno == EMFILE || errno == ENFILE) {
rb_gc();
if (rb_gc_for_fd(errno)) {
ret = rb_cloexec_pipe(pipes);
}
}
-
    (1-1/1)