NOTE: This approach has been deprecated for end-user code in favor of thread_mattr_accessor and friends. Please use that approach instead.

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.

Methods

Class Public methods

extended(object)

# File activesupport/lib/active_support/per_thread_registry.rb, line 42
    def self.extended(object)
      ActiveSupport::Deprecation.warn(<<~MSG)
        ActiveSupport::PerThreadRegistry is deprecated and will be removed in Rails 7.1.
        Use `Module#thread_mattr_accessor` instead.
      MSG
      object.instance_variable_set :@per_thread_registry_key, object.name.freeze
    end

Instance Public methods

instance()

# File activesupport/lib/active_support/per_thread_registry.rb, line 50
def instance
  Thread.current[@per_thread_registry_key] ||= new
end