aboutsummaryrefslogtreecommitdiffstats
path: root/activerecord/lib/active_record/attribute_methods.rb
diff options
context:
space:
mode:
authorAaron Patterson <aaron.patterson@gmail.com>2013-07-02 14:34:03 -0700
committerAaron Patterson <aaron.patterson@gmail.com>2013-07-02 14:34:40 -0700
commit09b31f08d4a4930dc66d401c94b2e5e49c250fc1 (patch)
treef76e83a5e1b031a298862859a31b2db1558a8e9d /activerecord/lib/active_record/attribute_methods.rb
parent77f40cf9aa1a926e0b04db7c4f82471514f23d6c (diff)
downloadrails-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.rb13
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)