Return processing lock to dispatcher, the finer grained lock was incompatible with the reloading in development mode.

This commit also adds ActionController::Dispatcher#dispatch_unlocking -- non-locking version of dispatch.
It's named anologously to POSIX {getc,getchar,...}_unlocked functions.

Signed-off-by: Michael Koziarski <michael@koziarski.com>
[#1170 state:committed]
This commit is contained in:
Aliaksey Kandratsenka
2008-10-02 21:06:22 +03:00
committed by Michael Koziarski
parent f550c86257
commit b437a7d34e
2 changed files with 14 additions and 9 deletions

View File

@@ -290,8 +290,6 @@ module ActionController #:nodoc:
@@allow_concurrency = false
cattr_accessor :allow_concurrency
@@guard = Monitor.new
# Modern REST web services often need to submit complex data to the web application.
# The <tt>@@param_parsers</tt> hash lets you register handlers which will process the HTTP body and add parameters to the
# <tt>params</tt> hash. These handlers are invoked for POST and PUT requests.
@@ -532,12 +530,7 @@ module ActionController #:nodoc:
assign_names
log_processing
if @@allow_concurrency
send(method, *arguments)
else
@@guard.synchronize { send(method, *arguments) }
end
send(method, *arguments)
send_response
ensure

View File

@@ -2,6 +2,8 @@ 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
@@ -99,7 +101,7 @@ module ActionController
@output, @request, @response = output, request, response
end
def dispatch
def dispatch_unlocked
begin
run_callbacks :before_dispatch
handle_request
@@ -110,6 +112,16 @@ module ActionController
end
end
def dispatch
if ActionController::Base.allow_concurrency
dispatch_unlocked
else
@@guard.synchronize do
dispatch_unlocked
end
end
end
def dispatch_cgi(cgi, session_options)
if cgi ||= self.class.failsafe_response(@output, '400 Bad Request') { CGI.new }
@request = CgiRequest.new(cgi, session_options)