class ActionView::Digestor

def compute_and_store_digest(cache_key, options) # called under @@digest_monitor lock

called under @@digest_monitor lock
def compute_and_store_digest(cache_key, options) # called under @@digest_monitor lock
  klass = if options[:partial] || options[:name].include?("/_")
    # Prevent re-entry or else recursive templates will blow the stack.
    # There is no need to worry about other threads seeing the +false+ value,
    # as they will then have to wait for this thread to let go of the @@digest_monitor lock.
    pre_stored = @@cache.put_if_absent(cache_key, false).nil? # put_if_absent returns nil on insertion
    PartialDigestor
  else
    Digestor
  end
  digest = klass.new(options).digest
  # Store the actual digest if config.cache_template_loading is true
  @@cache[cache_key] = stored_digest = digest if ActionView::Resolver.caching?
  digest
ensure
  # something went wrong or ActionView::Resolver.caching? is false, make sure not to corrupt the @@cache
  @@cache.delete_pair(cache_key, false) if pre_stored && !stored_digest
end