diff options
author | Eric Wong <normalperson@yhbt.net> | 2013-05-02 03:00:05 +0000 |
---|---|---|
committer | Eric Wong <normalperson@yhbt.net> | 2013-05-02 03:03:09 +0000 |
commit | 6b2c95c50a241fa7bd362a6022dedfdc5921db9f (patch) | |
tree | eb8a8755d5211c7f4e94c51b9f3350d9d2dcc001 /ext/sleepy_penguin | |
parent | 05448f74a80b631410f0c39ea4b333d26acec074 (diff) | |
download | sleepy_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.
Diffstat (limited to 'ext/sleepy_penguin')
-rw-r--r-- | ext/sleepy_penguin/epoll.c | 8 | ||||
-rw-r--r-- | ext/sleepy_penguin/kqueue.c | 8 |
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); |