Skip to content

Instantly share code, notes, and snippets.

@wycats
Created October 6, 2008 17:58
Show Gist options
  • Save wycats/15085 to your computer and use it in GitHub Desktop.
Save wycats/15085 to your computer and use it in GitHub Desktop.
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