From 207f50b31a41071d3154c2f752967e50ff056488 Mon Sep 17 00:00:00 2001 From: Eric Wong Date: Mon, 2 Jan 2017 00:23:36 +0000 Subject: unify rb_gc() handling for out-of-FD conditions This should hopefully simplify logic a bit and avoid expensive access to errno. --- ext/sleepy_penguin/epoll.c | 4 +--- ext/sleepy_penguin/eventfd.c | 4 +--- ext/sleepy_penguin/inotify.c | 4 +--- ext/sleepy_penguin/sleepy_penguin.h | 2 ++ ext/sleepy_penguin/timerfd.c | 4 +--- ext/sleepy_penguin/util.c | 9 +++++++++ 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; +} -- cgit v1.2.3-24-ge0c7