Module: ActiveSupport::PerThreadRegistry
Relationships & Source Files | |
Extension / Inclusion / Inheritance Descendants | |
Extended In:
ActiveRecord::ExplainRegistry,
ActiveRecord::RuntimeRegistry,
ActiveRecord::Scoping::ScopeRegistry,
ActiveSupport::Cache::Strategy::LocalCache::LocalCacheRegistry,
ActiveSupport::Notifications::InstrumentationRegistry,
ActiveSupport::SubscriberQueueRegistry
| |
Defined in: | activesupport/lib/active_support/per_thread_registry.rb |
Overview
This module is used to encapsulate access to thread local variables.
Instead of polluting the thread locals namespace:
Thread.current[:connection_handler]
you define a class that extends this module:
module ActiveRecord
class RuntimeRegistry
extend ActiveSupport::PerThreadRegistry
attr_accessor :connection_handler
end
end
and invoke the declared instance accessors as class methods. So
ActiveRecord::RuntimeRegistry.connection_handler = connection_handler
sets a connection handler local to the current thread, and
ActiveRecord::RuntimeRegistry.connection_handler
returns a connection handler local to the current thread.
This feature is accomplished by instantiating the class and storing the instance as a thread local keyed by the class name. In the example above a key “ActiveRecord::RuntimeRegistry” is stored in Thread.current
. The class methods proxy to said thread local instance.
If the class has an initializer, it must accept no arguments.
Class Method Summary
Instance Method Summary
Class Method Details
.extended(object)
[ GitHub ]# File 'activesupport/lib/active_support/per_thread_registry.rb', line 37
def self.extended(object) object.instance_variable_set '@per_thread_registry_key', object.name.freeze end
Instance Method Details
#instance
[ GitHub ]# File 'activesupport/lib/active_support/per_thread_registry.rb', line 41
def instance Thread.current[@per_thread_registry_key] ||= new end