aboutsummaryrefslogtreecommitdiffstats
path: root/actionpack/lib
diff options
context:
space:
mode:
authorJoshua Peek <josh@joshpeek.com>2008-12-18 12:00:54 -0600
committerJoshua Peek <josh@joshpeek.com>2008-12-18 12:00:54 -0600
commit2eb2ec9e635c740684673495ed547d1c0769038d (patch)
tree55c28e8c3d11823ad15e9815039d8239afe7287a /actionpack/lib
parent3ff6b00ee30d0961f57e3c4b64ec8ff0155aaf2d (diff)
downloadrails-2eb2ec9e635c740684673495ed547d1c0769038d.tar.gz
rails-2eb2ec9e635c740684673495ed547d1c0769038d.tar.bz2
rails-2eb2ec9e635c740684673495ed547d1c0769038d.zip
Move gaint lock into middleware
Diffstat (limited to 'actionpack/lib')
-rw-r--r--actionpack/lib/action_controller.rb1
-rw-r--r--actionpack/lib/action_controller/dispatcher.rb15
-rw-r--r--actionpack/lib/action_controller/lock.rb18
-rw-r--r--actionpack/lib/action_controller/middleware_stack.rb22
4 files changed, 42 insertions, 14 deletions
diff --git a/actionpack/lib/action_controller.rb b/actionpack/lib/action_controller.rb
index c170e4dd2a..eaf7779f1e 100644
--- a/actionpack/lib/action_controller.rb
+++ b/actionpack/lib/action_controller.rb
@@ -56,6 +56,7 @@ module ActionController
autoload :Integration, 'action_controller/integration'
autoload :IntegrationTest, 'action_controller/integration'
autoload :Layout, 'action_controller/layout'
+ autoload :Lock, 'action_controller/lock'
autoload :MiddlewareStack, 'action_controller/middleware_stack'
autoload :MimeResponds, 'action_controller/mime_responds'
autoload :PolymorphicRoutes, 'action_controller/polymorphic_routes'
diff --git a/actionpack/lib/action_controller/dispatcher.rb b/actionpack/lib/action_controller/dispatcher.rb
index c9a9264b6d..aa00eecea7 100644
--- a/actionpack/lib/action_controller/dispatcher.rb
+++ b/actionpack/lib/action_controller/dispatcher.rb
@@ -2,8 +2,6 @@ module ActionController
# Dispatches requests to the appropriate controller and takes care of
# reloading the app after each request when Dependencies.load? is true.
class Dispatcher
- @@guard = Mutex.new
-
class << self
def define_dispatcher_callbacks(cache_classes)
unless cache_classes
@@ -46,6 +44,7 @@ module ActionController
cattr_accessor :middleware
self.middleware = MiddlewareStack.new do |middleware|
+ middleware.use "ActionController::Lock", :if => lambda { !ActionController::Base.allow_concurrency }
middleware.use "ActionController::Failsafe"
middleware.use "ActionController::SessionManagement::Middleware"
end
@@ -59,7 +58,7 @@ module ActionController
@app = @@middleware.build(lambda { |env| self.dup._call(env) })
end
- def dispatch_unlocked
+ def dispatch
begin
run_callbacks :before_dispatch
handle_request
@@ -70,16 +69,6 @@ module ActionController
end
end
- def dispatch
- if ActionController::Base.allow_concurrency
- dispatch_unlocked
- else
- @@guard.synchronize do
- dispatch_unlocked
- end
- end
- end
-
# DEPRECATE: Remove CGI support
def dispatch_cgi(cgi, session_options)
CGIHandler.dispatch_cgi(self, cgi, @output)
diff --git a/actionpack/lib/action_controller/lock.rb b/actionpack/lib/action_controller/lock.rb
new file mode 100644
index 0000000000..b4b0902f18
--- /dev/null
+++ b/actionpack/lib/action_controller/lock.rb
@@ -0,0 +1,18 @@
+module ActionController
+ class Lock
+ def initialize(app)
+ @app = app
+ @lock = Mutex.new
+ end
+
+ def call(env)
+ old_multithread = env["rack.multithread"]
+ env["rack.multithread"] = false
+ response = @lock.synchronize do
+ @app.call(env)
+ end
+ env["rack.multithread"] = old_multithread
+ response
+ end
+ end
+end
diff --git a/actionpack/lib/action_controller/middleware_stack.rb b/actionpack/lib/action_controller/middleware_stack.rb
index a6597a6fec..ba99f77b81 100644
--- a/actionpack/lib/action_controller/middleware_stack.rb
+++ b/actionpack/lib/action_controller/middleware_stack.rb
@@ -10,10 +10,26 @@ module ActionController
@klass = klass.to_s.constantize
end
+ options = args.extract_options!
+ if options.has_key?(:if)
+ @conditional = options.delete(:if)
+ else
+ @conditional = true
+ end
+ args << options unless options.empty?
+
@args = args
@block = block
end
+ def active?
+ if @conditional.respond_to?(:call)
+ @conditional.call
+ else
+ @conditional
+ end
+ end
+
def ==(middleware)
case middleware
when Middleware
@@ -50,8 +66,12 @@ module ActionController
push(middleware)
end
+ def active
+ find_all { |middleware| middleware.active? }
+ end
+
def build(app)
- reverse.inject(app) { |a, e| e.build(a) }
+ active.reverse.inject(app) { |a, e| e.build(a) }
end
end
end