diff options
author | Aaron Patterson <aaron.patterson@gmail.com> | 2013-07-02 14:34:03 -0700 |
---|---|---|
committer | Aaron Patterson <aaron.patterson@gmail.com> | 2013-07-02 14:34:40 -0700 |
commit | 09b31f08d4a4930dc66d401c94b2e5e49c250fc1 (patch) | |
tree | f76e83a5e1b031a298862859a31b2db1558a8e9d /activerecord/lib/active_record/attribute_methods.rb | |
parent | 77f40cf9aa1a926e0b04db7c4f82471514f23d6c (diff) | |
download | rails-09b31f08d4a4930dc66d401c94b2e5e49c250fc1.tar.gz rails-09b31f08d4a4930dc66d401c94b2e5e49c250fc1.tar.bz2 rails-09b31f08d4a4930dc66d401c94b2e5e49c250fc1.zip |
eagerly initialize the attributes module to avoid check-then-set race conditions
Diffstat (limited to 'activerecord/lib/active_record/attribute_methods.rb')
-rw-r--r-- | activerecord/lib/active_record/attribute_methods.rb | 13 |
1 files changed, 12 insertions, 1 deletions
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) |