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 @@ def worker_thread(logger, max_events)
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 @@ def worker_thread(logger, max_events)
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.
--
unsubscribe: [email protected]
archive: https://yhbt.net/yahns-public/