From 09b31f08d4a4930dc66d401c94b2e5e49c250fc1 Mon Sep 17 00:00:00 2001 From: Aaron Patterson Date: Tue, 2 Jul 2013 14:34:03 -0700 Subject: eagerly initialize the attributes module to avoid check-then-set race conditions --- activerecord/lib/active_record/attribute_methods.rb | 13 ++++++++++++- activerecord/lib/active_record/core.rb | 8 +------- 2 files changed, 13 insertions(+), 8 deletions(-) (limited to 'activerecord') diff --git a/activerecord/lib/active_record/attribute_methods.rb b/activerecord/lib/active_record/attribute_methods.rb index 609c6e8cab..7c422ecbe0 100644 --- a/activerecord/lib/active_record/attribute_methods.rb +++ b/activerecord/lib/active_record/attribute_methods.rb @@ -1,4 +1,5 @@ require 'active_support/core_ext/enumerable' +require 'mutex_m' module ActiveRecord # = Active Record Attribute Methods @@ -18,12 +19,22 @@ module ActiveRecord end module ClassMethods + def inherited(child_class) #:nodoc: + child_class.initialize_generated_modules + super + end + + def initialize_generated_modules # :nodoc: + @generated_attribute_methods = Module.new { extend Mutex_m } + include @generated_attribute_methods + end + # Generates all the attribute related methods for columns in the database # accessors, mutators and query methods. def define_attribute_methods # :nodoc: # Use a mutex; we don't want two thread simultaneously trying to define # attribute methods. - @attribute_methods_mutex.synchronize do + generated_attribute_methods.synchronize do return if attribute_methods_generated? superclass.define_attribute_methods unless self == base_class super(column_names) diff --git a/activerecord/lib/active_record/core.rb b/activerecord/lib/active_record/core.rb index f306243552..7da70cea18 100644 --- a/activerecord/lib/active_record/core.rb +++ b/activerecord/lib/active_record/core.rb @@ -88,14 +88,8 @@ module ActiveRecord end module ClassMethods - def inherited(child_class) #:nodoc: - child_class.initialize_generated_modules - super - end - def initialize_generated_modules - @attribute_methods_mutex = Mutex.new - + super # force attribute methods to be higher in inheritance hierarchy than other generated methods generated_attribute_methods.const_set(:AttrNames, Module.new { def self.const_missing(name) -- cgit v1.2.3