From 77aac8c54ac030b08cfe6bcafc6fd155854456a7 Mon Sep 17 00:00:00 2001 From: Eric Wong Date: Tue, 7 Jun 2016 04:07:17 +0000 Subject: queue_*: check for closed IO objects Using a high max_events may mean some IO objects are closed after they're retrieved from the kernel but before our Ruby process has had a chance to get to them. --- lib/yahns/queue_epoll.rb | 1 + lib/yahns/queue_kqueue.rb | 1 + 2 files changed, 2 insertions(+) diff --git a/lib/yahns/queue_epoll.rb b/lib/yahns/queue_epoll.rb index 6d8a6ca..7f5c038 100644 --- a/lib/yahns/queue_epoll.rb +++ b/lib/yahns/queue_epoll.rb @@ -44,6 +44,7 @@ class Yahns::Queue < SleepyPenguin::Epoll::IO # :nodoc: thr_init begin epoll_wait(max_events) do |_, io| # don't care for flags for now + next if io.closed? # Note: we absolutely must not do anything with io after # we've called epoll_ctl on it, io is exclusive to this diff --git a/lib/yahns/queue_kqueue.rb b/lib/yahns/queue_kqueue.rb index 531912b..229475c 100644 --- a/lib/yahns/queue_kqueue.rb +++ b/lib/yahns/queue_kqueue.rb @@ -53,6 +53,7 @@ class Yahns::Queue < SleepyPenguin::Kqueue::IO # :nodoc: thr_init begin kevent(nil, max_events) do |_,_,_,_,_,io| # don't care for flags for now + next if io.closed? # Note: we absolutely must not do anything with io after # we've called kevent(...,EV_ADD) on it, io is exclusive to this # thread only until kevent(...,EV_ADD) is called on it. -- cgit v1.2.3-24-ge0c7