Created
October 6, 2008 17:58
-
-
Save wycats/15085 to your computer and use it in GitHub Desktop.
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
diff --git a/lib/merb-core.rb b/lib/merb-core.rb | |
index 28317f1..f9f034a 100644 | |
--- a/lib/merb-core.rb | |
+++ b/lib/merb-core.rb | |
@@ -36,7 +36,15 @@ module Merb | |
module GlobalHelpers; end | |
class << self | |
- attr_accessor :exiting | |
+ attr_reader :exiting | |
+ | |
+ def exiting=(bool) | |
+ Extlib.exiting = bool | |
+ if bool && Extlib.const_defined?("Pooling") && Extlib::Pooling.scavenger | |
+ Extlib::Pooling.scavenger.wakeup | |
+ end | |
+ @exiting = bool | |
+ end | |
# Merge environment settings | |
# Can allow you to have a "localdev" that runs like your "development" | |
diff --git a/lib/merb-core/core_ext/kernel.rb b/lib/merb-core/core_ext/kernel.rb | |
index 202b877..51cdb67 100644 | |
--- a/lib/merb-core/core_ext/kernel.rb | |
+++ b/lib/merb-core/core_ext/kernel.rb | |
@@ -1,5 +1,11 @@ | |
require 'rubygems/dependency' | |
+module Gem | |
+ class Dependency | |
+ attr_accessor :require_block | |
+ end | |
+end | |
+ | |
module Kernel | |
# Keep track of all required dependencies. | |
@@ -11,8 +17,10 @@ module Kernel | |
# @return <Gem::Dependency> Dependency information | |
# | |
# @api private | |
- def track_dependency(name, *ver) | |
+ def track_dependency(name, *ver, &blk) | |
dep = Gem::Dependency.new(name, ver) | |
+ dep.require_block = blk | |
+ | |
existing = Merb::BootLoader::Dependencies.dependencies.find { |d| d.name == dep.name } | |
if existing | |
index = Merb::BootLoader::Dependencies.dependencies.index(existing) | |
@@ -41,9 +49,9 @@ module Kernel | |
def dependency(name, *ver) | |
immediate = ver.last.is_a?(Hash) && ver.pop[:immediate] | |
if immediate || Merb::BootLoader.finished?(Merb::BootLoader::Dependencies) | |
- load_dependency(name, *ver) | |
+ load_dependency(name, *ver, &blk) | |
else | |
- track_dependency(name, *ver) | |
+ track_dependency(name, *ver, &blk) | |
end | |
end | |
@@ -63,12 +71,16 @@ module Kernel | |
# as a library. | |
# | |
# @return <Gem::Dependency> The dependency information. | |
- def load_dependency(name, *ver) | |
+ def load_dependency(name, *ver, &blk) | |
dep = name.is_a?(Gem::Dependency) ? name : track_dependency(name, *ver) | |
gem(dep) | |
rescue Gem::LoadError | |
ensure | |
- require dep.name | |
+ if block = blk || dep.require_block | |
+ block.call | |
+ else | |
+ require dep.name | |
+ end | |
Merb.logger.info!("loading gem '#{dep.name}' ...") | |
return dep # ensure needs explicit return | |
end | |
diff --git a/lib/merb-core/rack/adapter/abstract.rb b/lib/merb-core/rack/adapter/abstract.rb | |
index d6c5e95..cb4f36a 100644 | |
--- a/lib/merb-core/rack/adapter/abstract.rb | |
+++ b/lib/merb-core/rack/adapter/abstract.rb | |
@@ -111,6 +111,7 @@ module Merb | |
# In daemonized mode or not, support HUPing the process to | |
# restart it. | |
Merb.trap('HUP') do | |
+ Merb.exiting = true | |
stop | |
Merb.logger.warn! "Exiting port #{port} on #{Process.pid}\n" | |
exit_process | |
@@ -118,6 +119,7 @@ module Merb | |
# ABRTing the process will kill it, and it will not be respawned. | |
Merb.trap('ABRT') do | |
+ Merb.exiting = true | |
stopped = stop(128) | |
Merb.logger.warn! "Exiting port #{port}\n" if stopped | |
exit_process(128) | |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment