Rails 2.2の threadsafe と ConnectionPool を読んでみる#2
続き.actionpack/lib/action_controller/dispatcher.rb を見ると
5 | @@guard = Mutex.new 104 | def dispatch_unlocked 105 | begin 106 | run_callbacks :before_dispatch 107 | handle_request 108 | rescue Exception => exception 109 | failsafe_rescue exception 110 | ensure 111 | run_callbacks :after_dispatch, :enumerator => :reverse_each 112 | end 113 | end 114 | 115 | def dispatch 116 | if ActionController::Base.allow_concurrency 117 | dispatch_unlocked 118 | else 119 | @@guard.synchronize do 120 | dispatch_unlocked 121 | end 122 | end 123 | end
と言うことなので,いままでは Mutex で共有ロックかけてるのがわかる.んで,dispatch_unlocked が呼び出されて,例えば development 環境であれば run_callbacks :before_dispatch から reload_application が実行されたりする.
dispatch_unlocked の実体は handle_request なので
177 | protected 178 | def handle_request 179 | @controller = Routing::Routes.recognize(@request) 180 | @controller.process(@request, @response).out(@output) 181 | end
config/routes.rb から呼び出されるべき Controller を判定して,実行,出力すると言う感じ.
ここまで見てきて,Mutex を使わないこと以外 は ActionController 側では特に何もやってない感じがします.
次は ActiveRecord まわりを.