diff options
-rw-r--r-- | lib/yahns/queue_epoll.rb | 2 | ||||
-rw-r--r-- | lib/yahns/queue_quitter.rb | 12 | ||||
-rw-r--r-- | lib/yahns/queue_quitter_pipe.rb | 24 | ||||
-rw-r--r-- | lib/yahns/server.rb | 1 |
4 files changed, 34 insertions, 5 deletions
diff --git a/lib/yahns/queue_epoll.rb b/lib/yahns/queue_epoll.rb index fab1090..624e175 100644 --- a/lib/yahns/queue_epoll.rb +++ b/lib/yahns/queue_epoll.rb @@ -6,7 +6,7 @@ class Yahns::Queue < SleepyPenguin::Epoll::IO # :nodoc: attr_accessor :fdmap # Yahns::Fdmap # public - QEV_QUIT = Epoll::IN + QEV_QUIT = Epoll::OUT # Level Trigger for QueueQuitter QEV_RD = Epoll::IN | Epoll::ONESHOT QEV_WR = Epoll::OUT | Epoll::ONESHOT QEV_RDWR = QEV_RD | QEV_WR diff --git a/lib/yahns/queue_quitter.rb b/lib/yahns/queue_quitter.rb index 106ed03..b9cf28a 100644 --- a/lib/yahns/queue_quitter.rb +++ b/lib/yahns/queue_quitter.rb @@ -1,10 +1,16 @@ # Copyright (C) 2013, Eric Wong <normalperson@yhbt.net> and all contributors # License: GPLv3 or later (https://www.gnu.org/licenses/gpl-3.0.txt) +require 'sleepy_penguin' + # add this as a level-triggered to any thread pool stuck on epoll_wait # and watch it die! -class Yahns::QueueQuitter < Yahns::Sigevent # :nodoc: - def yahns_step - Thread.current.exit +if SleepyPenguin.const_defined?(:EventFD) + class Yahns::QueueQuitter < Yahns::Sigevent # :nodoc: + def yahns_step + Thread.current.exit + end end +else + require_relative 'queue_quitter_pipe' end diff --git a/lib/yahns/queue_quitter_pipe.rb b/lib/yahns/queue_quitter_pipe.rb new file mode 100644 index 0000000..1aa0643 --- /dev/null +++ b/lib/yahns/queue_quitter_pipe.rb @@ -0,0 +1,24 @@ +# Copyright (C) 2013, Eric Wong <normalperson@yhbt.net> and all contributors +# License: GPLv3 or later (https://www.gnu.org/licenses/gpl-3.0.txt) +# +# POSIX pipe version, see queue_quitter.rb for the (preferred) eventfd one +class Yahns::QueueQuitter # :nodoc: + attr_reader :to_io + def initialize + reader, @to_io = IO.pipe + @to_io.close_on_exec = true + reader.close + end + + def yahns_step + Thread.current.exit + end + + def fileno + @to_io.fileno + end + + def close + @to_io.close + end +end diff --git a/lib/yahns/server.rb b/lib/yahns/server.rb index 5532666..ae3c1d7 100644 --- a/lib/yahns/server.rb +++ b/lib/yahns/server.rb @@ -345,7 +345,6 @@ class Yahns::Server # :nodoc: # monkey wrench thrown into a perfectly good engine :) def quit_finish quitter = Yahns::QueueQuitter.new - quitter.sev_signal # this will be level trigger for sustained damage! # throw the monkey wrench into the worker threads @queues.each { |q| q.queue_add(quitter, Yahns::Queue::QEV_QUIT) } |