about summary refs log tree commit homepage
diff options
context:
space:
mode:
authorEric Wong <normalperson@yhbt.net>2013-05-02 03:00:05 +0000
committerEric Wong <normalperson@yhbt.net>2013-05-02 03:03:09 +0000
commit6b2c95c50a241fa7bd362a6022dedfdc5921db9f (patch)
treeeb8a8755d5211c7f4e94c51b9f3350d9d2dcc001
parent05448f74a80b631410f0c39ea4b333d26acec074 (diff)
downloadsleepy_penguin-6b2c95c50a241fa7bd362a6022dedfdc5921db9f.tar.gz
To be consistent with I/O wrappers in Ruby, Ruby-land should
never see EINTR from kevent or epoll_wait.  We will just return
zero events if our timeout expired soon after we got signaled.
-rw-r--r--ext/sleepy_penguin/epoll.c8
-rw-r--r--ext/sleepy_penguin/kqueue.c8
2 files changed, 12 insertions, 4 deletions
diff --git a/ext/sleepy_penguin/epoll.c b/ext/sleepy_penguin/epoll.c
index 90ecc2c..9010e2d 100644
--- a/ext/sleepy_penguin/epoll.c
+++ b/ext/sleepy_penguin/epoll.c
@@ -147,8 +147,12 @@ static VALUE epwait_result(struct ep_per_thread *ept, int n)
         struct epoll_event *epoll_event = ept->events;
         VALUE obj_events, obj;
 
-        if (n < 0)
-                rb_sys_fail("epoll_wait");
+        if (n < 0) {
+                if (errno == EINTR)
+                        n = 0;
+                else
+                        rb_sys_fail("epoll_wait");
+        }
 
         for (i = n; --i >= 0; epoll_event++) {
                 obj_events = UINT2NUM(epoll_event->events);
diff --git a/ext/sleepy_penguin/kqueue.c b/ext/sleepy_penguin/kqueue.c
index 155204b..4d5785f 100644
--- a/ext/sleepy_penguin/kqueue.c
+++ b/ext/sleepy_penguin/kqueue.c
@@ -158,8 +158,12 @@ static VALUE kevent_result(struct kq_per_thread *kpt, int nevents)
         int i;
         struct kevent *event = kpt->events;
 
-        if (nevents < 0)
-                rb_sys_fail("kevent");
+        if (nevents < 0) {
+                if (errno == EINTR)
+                        nevents = 0;
+                else
+                        rb_sys_fail("kevent");
+        }
 
         for (i = nevents; --i >= 0; event++)
                 yield_kevent(event);