From 9b23459be9faf307162ddab2c5a7fe6797952a13 Mon Sep 17 00:00:00 2001 From: evanweaver Date: Thu, 18 Oct 2007 19:27:33 +0000 Subject: howbout we support asynchronous and synchronous stopping git-svn-id: svn+ssh://rubyforge.org/var/svn/mongrel/trunk@687 19e92222-5c0b-0410-8929-a290d50e31e9 --- lib/mongrel.rb | 9 +++++++-- lib/mongrel/configurator.rb | 14 ++++++-------- test/test_configurator.rb | 2 +- 3 files changed, 14 insertions(+), 11 deletions(-) diff --git a/lib/mongrel.rb b/lib/mongrel.rb index 1d95714..967f0cd 100644 --- a/lib/mongrel.rb +++ b/lib/mongrel.rb @@ -809,8 +809,13 @@ module Mongrel # Stops the acceptor thread and then causes the worker threads to finish # off the request queue before finally exiting. - def stop - @acceptor.raise(StopServer.new) + def stop(asynchronous=true) + if asynchronous + stopper = Thread.new { @acceptor.raise(StopServer.new) } + stopper.priority = 10 + else + @acceptor.raise(StopServer.new) + end end end diff --git a/lib/mongrel/configurator.rb b/lib/mongrel/configurator.rb index c62f153..6c9a6c8 100644 --- a/lib/mongrel/configurator.rb +++ b/lib/mongrel/configurator.rb @@ -287,14 +287,10 @@ module Mongrel # Calls .stop on all the configured listeners so they # stop processing requests (gracefully). By default it # assumes that you don't want to restart. - def stop(needs_restart=false) - @listeners.map do |name, listener| - stopper = Thread.new { listener.stop } - stopper.priority = 10 - stopper - end.each do |stopper| - stopper.join - end + def stop(needs_restart=false, asynchronous=true) + @listeners.each {|name,s| + s.stop(asynchronous) + } @needs_restart = needs_restart end @@ -373,6 +369,8 @@ module Mongrel if RUBY_PLATFORM !~ /mswin/ # graceful shutdown trap("TERM") { log "TERM signal received."; stop } + trap("USR1") { log "USR1 received, toggling $mongrel_debug_client to #{!$mongrel_debug_client}"; $mongrel_debug_client = !$mongrel_debug_client } + # restart trap("USR2") { log "USR2 signal received."; stop(true) } log "Signals ready. TERM => stop. USR2 => restart. INT => stop (no restart)." diff --git a/test/test_configurator.rb b/test/test_configurator.rb index 4e4d963..d8e9a11 100644 --- a/test/test_configurator.rb +++ b/test/test_configurator.rb @@ -78,7 +78,7 @@ class ConfiguratorTest < Test::Unit::TestCase end redirect_test_io do - config.stop + config.stop(false, true) end assert_raise Errno::EBADF, Errno::ECONNREFUSED do -- cgit v1.2.3-24-ge0c7