about summary refs log tree commit homepage
diff options
context:
space:
mode:
-rw-r--r--ext/sleepy_penguin/epoll.c4
-rw-r--r--ext/sleepy_penguin/eventfd.c4
-rw-r--r--ext/sleepy_penguin/inotify.c4
-rw-r--r--ext/sleepy_penguin/sleepy_penguin.h2
-rw-r--r--ext/sleepy_penguin/timerfd.c4
-rw-r--r--ext/sleepy_penguin/util.c9
6 files changed, 15 insertions, 12 deletions
diff --git a/ext/sleepy_penguin/epoll.c b/ext/sleepy_penguin/epoll.c
index 120af0c..e655bf9 100644
--- a/ext/sleepy_penguin/epoll.c
+++ b/ext/sleepy_penguin/epoll.c
@@ -87,10 +87,8 @@ static VALUE s_new(VALUE klass, VALUE _flags)
         VALUE rv;
 
         if (fd < 0) {
-                if (errno == EMFILE || errno == ENFILE || errno == ENOMEM) {
-                        rb_gc();
+                if (rb_sp_gc_for_fd(errno))
                         fd = epoll_create1(flags);
-                }
                 if (fd < 0)
                         rb_sys_fail("epoll_create1");
         }
diff --git a/ext/sleepy_penguin/eventfd.c b/ext/sleepy_penguin/eventfd.c
index 4f95b0d..4804150 100644
--- a/ext/sleepy_penguin/eventfd.c
+++ b/ext/sleepy_penguin/eventfd.c
@@ -31,10 +31,8 @@ static VALUE s_new(int argc, VALUE *argv, VALUE klass)
 
         fd = eventfd(initval, flags);
         if (fd < 0) {
-                if (errno == EMFILE || errno == ENFILE || errno == ENOMEM) {
-                        rb_gc();
+                if (rb_sp_gc_for_fd(errno))
                         fd = eventfd(initval, flags);
-                }
                 if (fd < 0)
                         rb_sys_fail("eventfd");
         }
diff --git a/ext/sleepy_penguin/inotify.c b/ext/sleepy_penguin/inotify.c
index b324227..b5cd67b 100644
--- a/ext/sleepy_penguin/inotify.c
+++ b/ext/sleepy_penguin/inotify.c
@@ -26,10 +26,8 @@ static VALUE s_new(int argc, VALUE *argv, VALUE klass)
 
         fd = inotify_init1(flags);
         if (fd < 0) {
-                if (errno == EMFILE || errno == ENFILE || errno == ENOMEM) {
-                        rb_gc();
+                if (rb_sp_gc_for_fd(errno))
                         fd = inotify_init1(flags);
-                }
                 if (fd < 0)
                         rb_sys_fail("inotify_init1");
         }
diff --git a/ext/sleepy_penguin/sleepy_penguin.h b/ext/sleepy_penguin/sleepy_penguin.h
index 522ac0a..8aa514a 100644
--- a/ext/sleepy_penguin/sleepy_penguin.h
+++ b/ext/sleepy_penguin/sleepy_penguin.h
@@ -90,4 +90,6 @@ void *rb_sp_gettlsbuf(size_t *size);
 # endif
 #endif
 
+int rb_sp_gc_for_fd(int err);
+
 #endif /* SLEEPY_PENGUIN_H */
diff --git a/ext/sleepy_penguin/timerfd.c b/ext/sleepy_penguin/timerfd.c
index a4f5c7d..e3af46c 100644
--- a/ext/sleepy_penguin/timerfd.c
+++ b/ext/sleepy_penguin/timerfd.c
@@ -31,10 +31,8 @@ static VALUE s_new(int argc, VALUE *argv, VALUE klass)
 
         fd = timerfd_create(clockid, flags);
         if (fd < 0) {
-                if (errno == EMFILE || errno == ENFILE || errno == ENOMEM) {
-                        rb_gc();
+                if (rb_sp_gc_for_fd(errno))
                         fd = timerfd_create(clockid, flags);
-                }
                 if (fd < 0)
                         rb_sys_fail("timerfd_create");
         }
diff --git a/ext/sleepy_penguin/util.c b/ext/sleepy_penguin/util.c
index 4086b14..8dd6842 100644
--- a/ext/sleepy_penguin/util.c
+++ b/ext/sleepy_penguin/util.c
@@ -156,3 +156,12 @@ int rb_sp_wait(rb_sp_waitfn waiter, VALUE obj, int *fd)
         *fd = rb_sp_fileno(obj);
         return rc;
 }
+
+int rb_sp_gc_for_fd(int err)
+{
+        if (err == EMFILE || err == ENFILE || err == ENOMEM) {
+                rb_gc();
+                return 1;
+        }
+        return 0;
+}