From 8e489db9dee1f4cfb0c3a259bd59626d86eacb07 Mon Sep 17 00:00:00 2001 From: Aaron Patterson Date: Mon, 14 Sep 2015 15:29:19 -0700 Subject: [PATCH] eagerly allocate the renderer object this means the reader doesn't need to lock, but does have the added cost of a new object created for every controller --- actionpack/lib/action_controller/base.rb | 1 + .../lib/action_controller/metal/rendering.rb | 14 +++++--------- actionpack/test/controller/renderer_test.rb | 4 ++++ 3 files changed, 10 insertions(+), 9 deletions(-) diff --git a/actionpack/lib/action_controller/base.rb b/actionpack/lib/action_controller/base.rb index 0727bb8369..04e5922ce8 100644 --- a/actionpack/lib/action_controller/base.rb +++ b/actionpack/lib/action_controller/base.rb @@ -248,6 +248,7 @@ def self.without_modules(*modules) MODULES.each do |mod| include mod end + setup_renderer! # Define some internal variables that should not be propagated to the view. PROTECTED_IVARS = AbstractController::Rendering::DEFAULT_PROTECTED_INSTANCE_VARIABLES + [ diff --git a/actionpack/lib/action_controller/metal/rendering.rb b/actionpack/lib/action_controller/metal/rendering.rb index 5055a88217..00b551af94 100644 --- a/actionpack/lib/action_controller/metal/rendering.rb +++ b/actionpack/lib/action_controller/metal/rendering.rb @@ -11,20 +11,16 @@ module ClassMethods # Documentation at ActionController::Renderer#render delegate :render, to: :renderer - RENDERER_LOCK = Mutex.new - - attr_writer :renderer - # Returns a renderer instance (inherited from ActionController::Renderer) # for the controller. - def renderer - @renderer || RENDERER_LOCK.synchronize do - @renderer ||= Renderer.for(self) - end + attr_reader :renderer + + def setup_renderer! # :nodoc: + @renderer = Renderer.for(self) end def inherited(klass) - klass.renderer = nil + klass.setup_renderer! super end end diff --git a/actionpack/test/controller/renderer_test.rb b/actionpack/test/controller/renderer_test.rb index b55a25430b..1a273adec4 100644 --- a/actionpack/test/controller/renderer_test.rb +++ b/actionpack/test/controller/renderer_test.rb @@ -1,6 +1,10 @@ require 'abstract_unit' class RendererTest < ActiveSupport::TestCase + test 'action controller base has a renderer' do + assert ActionController::Base.renderer + end + test 'creating with a controller' do controller = CommentsController renderer = ActionController::Renderer.for controller