diff options
author | José Valim <jose.valim@plataformatec.com.br> | 2012-12-19 07:28:25 -0800 |
---|---|---|
committer | José Valim <jose.valim@plataformatec.com.br> | 2012-12-19 07:28:25 -0800 |
commit | b225693a0d86f2e33c66049a69e5148e5c93b7cd (patch) | |
tree | 30551bc5ad41bceaf5c6f212cd6ecc47f2198f4b | |
parent | 939ff861396857d6a476b5a2e8c53a69d8305688 (diff) | |
parent | 5c335420c81f0b9dfa6a22336a21dce1912e5c7f (diff) | |
download | rails-b225693a0d86f2e33c66049a69e5148e5c93b7cd.tar.gz rails-b225693a0d86f2e33c66049a69e5148e5c93b7cd.tar.bz2 rails-b225693a0d86f2e33c66049a69e5148e5c93b7cd.zip |
Merge pull request #8559 from mshytikov/runner_method_is_slow_with_thread_safe
Attempt to fix slow runner name method
-rw-r--r-- | activesupport/lib/active_support/callbacks.rb | 11 |
1 files changed, 10 insertions, 1 deletions
diff --git a/activesupport/lib/active_support/callbacks.rb b/activesupport/lib/active_support/callbacks.rb index 3a8353857e..e772a297fc 100644 --- a/activesupport/lib/active_support/callbacks.rb +++ b/activesupport/lib/active_support/callbacks.rb @@ -1,3 +1,4 @@ +require 'thread_safe' require 'active_support/concern' require 'active_support/descendants_tracker' require 'active_support/core_ext/class/attribute' @@ -351,10 +352,18 @@ module ActiveSupport undef_method(name) if method_defined?(name) end - def __callback_runner_name(kind) + def __callback_runner_name_cache + @__callback_runner_name_cache ||= ThreadSafe::Cache.new {|cache, kind| cache[kind] = __generate_callback_runner_name(kind) } + end + + def __generate_callback_runner_name(kind) "_run__#{self.name.hash.abs}__#{kind}__callbacks" end + def __callback_runner_name(kind) + __callback_runner_name_cache[kind] + end + # This is used internally to append, prepend and skip callbacks to the # CallbackChain. def __update_callbacks(name, filters = [], block = nil) #:nodoc: |