about summary refs log tree commit homepage
diff options
context:
space:
mode:
-rw-r--r--lib/yahns/queue_epoll.rb2
-rw-r--r--lib/yahns/queue_quitter.rb12
-rw-r--r--lib/yahns/queue_quitter_pipe.rb24
-rw-r--r--lib/yahns/server.rb1
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) }