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 まわりを.

 
comments powered by Disqus