about summary refs log tree commit homepage
path: root/lib
diff options
context:
space:
mode:
authorEric Wong <e@80x24.org>2014-01-17 02:03:04 +0000
committerEric Wong <normalperson@yhbt.net>2014-01-17 08:34:29 +0000
commit3e701ee74ff29bdf5daa3249acede5a85a2b0097 (patch)
tree176888175c2b975f9a1ac1a33f0452e6b3d3bf86 /lib
parent1b3e68e3eac0c3fbb2a32e4fddd26ee8a50ec627 (diff)
downloadrainbows-3e701ee74ff29bdf5daa3249acede5a85a2b0097.tar.gz
Internal reworking of unicorn 4.8.0 completely broke us(!).
This commit fixes things, but it means we no longer support
unicorn <= 4.7.  Sorry about that.
Diffstat (limited to 'lib')
-rw-r--r--lib/rainbows.rb5
-rw-r--r--lib/rainbows/base.rb19
2 files changed, 18 insertions, 6 deletions
diff --git a/lib/rainbows.rb b/lib/rainbows.rb
index bfa1ba0..82a8448 100644
--- a/lib/rainbows.rb
+++ b/lib/rainbows.rb
@@ -55,6 +55,7 @@ module Rainbows
     attr_reader :alive
     attr_writer :worker
     attr_writer :forked
+    attr_writer :readers
   end
 
   def self.config!(mod, *opts)
@@ -88,7 +89,9 @@ module Rainbows
       @alive = false
       Rainbows::HttpParser.quit
       @expire = Time.now + (@server.timeout * 2.0)
-      Unicorn::HttpServer::LISTENERS.each { |s| s.close rescue nil }.clear
+      tmp = @readers.dup
+      @readers.clear
+      tmp.each { |s| s.close rescue nil }.clear
       @at_quit.each { |task| task.call }
     end
     false
diff --git a/lib/rainbows/base.rb b/lib/rainbows/base.rb
index 54f1d2d..a7ba17d 100644
--- a/lib/rainbows/base.rb
+++ b/lib/rainbows/base.rb
@@ -8,24 +8,33 @@
 module Rainbows::Base
   # :stopdoc:
 
+  def sig_receiver(worker)
+    begin
+      worker.to_io.kgio_wait_readable
+      worker.kgio_tryaccept # Unicorn::Worker#kgio_tryaccept
+    rescue => e
+      Rainbows.alive or return
+      Unicorn.log_error(Rainbows.server.logger, "signal receiver", e)
+    end while true
+  end
+
   # this method is called by all current concurrency models
   def init_worker_process(worker) # :nodoc:
-    super(worker)
+    readers = super(worker)
     Rainbows::Response.setup
     Rainbows::MaxBody.setup
     Rainbows.worker = worker
 
-    # we're don't use the self-pipe mechanism in the Rainbows! worker
-    # since we don't defer reopening logs
-    Rainbows::HttpServer::SELF_PIPE.each { |x| x.close }.clear
-
     # spawn Threads since Logger takes a mutex by default and
     # we can't safely lock a mutex in a signal handler
     trap(:USR1) { Thread.new { reopen_worker_logs(worker.nr) } }
     trap(:QUIT) { Thread.new { Rainbows.quit! } }
     [:TERM, :INT].each { |sig| trap(sig) { exit!(0) } } # instant shutdown
     Rainbows::ProcessClient.const_set(:APP, Rainbows.server.app)
+    Thread.new { sig_receiver(worker) }
     logger.info "Rainbows! #@use worker_connections=#@worker_connections"
+    Rainbows.readers = readers # for Rainbows.quit
+    readers # unicorn 4.8+ needs this
   end
 
   def process_client(client)