mirror of
https://github.com/rails/rails.git
synced 2022-11-09 12:12:34 -05:00
Merge pull request #6407 from pinetops/565c1b0a0772ac6cf91c77e9285806f7b028614c
Template concurrency fixes Conflicts: actionpack/lib/action_view/template.rb
This commit is contained in:
parent
a78ee05da1
commit
74c4e7ba34
1 changed files with 23 additions and 11 deletions
|
@ -1,6 +1,7 @@
|
|||
require 'active_support/core_ext/object/blank'
|
||||
require 'active_support/core_ext/object/try'
|
||||
require 'active_support/core_ext/kernel/singleton_class'
|
||||
require 'thread'
|
||||
|
||||
module ActionView
|
||||
# = Action View Template
|
||||
|
@ -122,6 +123,7 @@ module ActionView
|
|||
@virtual_path = details[:virtual_path]
|
||||
@updated_at = details[:updated_at] || Time.now
|
||||
@formats = Array(format).map { |f| f.is_a?(Mime::Type) ? f.ref : f }
|
||||
@compile_mutex = Mutex.new
|
||||
end
|
||||
|
||||
# Returns if the underlying handler supports streaming. If so,
|
||||
|
@ -223,18 +225,28 @@ module ActionView
|
|||
def compile!(view) #:nodoc:
|
||||
return if @compiled
|
||||
|
||||
if view.is_a?(ActionView::CompiledTemplates)
|
||||
mod = ActionView::CompiledTemplates
|
||||
else
|
||||
mod = view.singleton_class
|
||||
# Templates can be used concurrently in threaded environments
|
||||
# so compilation and any instance variable modification must
|
||||
# be synchronized
|
||||
@compile_mutex.synchronize do
|
||||
# Any thread holding this lock will be compiling the template needed
|
||||
# by the threads waiting. So re-check the @compiled flag to avoid
|
||||
# re-compilation
|
||||
return if @compiled
|
||||
|
||||
if view.is_a?(ActionView::CompiledTemplates)
|
||||
mod = ActionView::CompiledTemplates
|
||||
else
|
||||
mod = view.singleton_class
|
||||
end
|
||||
|
||||
compile(view, mod)
|
||||
|
||||
# Just discard the source if we have a virtual path. This
|
||||
# means we can get the template back.
|
||||
@source = nil if @virtual_path
|
||||
@compiled = true
|
||||
end
|
||||
|
||||
compile(view, mod)
|
||||
|
||||
# Just discard the source if we have a virtual path. This
|
||||
# means we can get the template back.
|
||||
@source = nil if @virtual_path
|
||||
@compiled = true
|
||||
end
|
||||
|
||||
# Among other things, this method is responsible for properly setting
|
||||
|
|
Loading…
Reference in a new issue