about summary refs log tree commit homepage
diff options
context:
space:
mode:
authorEric Wong <e@80x24.org>2017-01-02 00:23:36 +0000
committerEric Wong <e@80x24.org>2017-01-02 00:23:36 +0000
commit207f50b31a41071d3154c2f752967e50ff056488 (patch)
tree6fcc11f39e1b8f1f584a8015b6cc79773a09ca51
parent3d1dd0aca4074a44fa5658de12eb8b89ff649114 (diff)
downloadsleepy_penguin-207f50b31a41071d3154c2f752967e50ff056488.tar.gz
This should hopefully simplify logic a bit and avoid expensive
access to errno.
-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;
+}