aboutsummaryrefslogtreecommitdiffstats
path: root/activerecord
diff options
context:
space:
mode:
authorJon Leighton <j@jonathanleighton.com>2012-01-13 22:57:21 +0000
committerJon Leighton <j@jonathanleighton.com>2012-01-13 22:58:26 +0000
commit70b762d1a744c2bec725de5f96610ddeb6c07a5d (patch)
tree2729b03276f4d8c8c6a8030a6d2604908aab094c /activerecord
parentc159b01b85ac3955c53cd6b8a62d5d90ee973cfb (diff)
downloadrails-70b762d1a744c2bec725de5f96610ddeb6c07a5d.tar.gz
rails-70b762d1a744c2bec725de5f96610ddeb6c07a5d.tar.bz2
rails-70b762d1a744c2bec725de5f96610ddeb6c07a5d.zip
Fix race condition :bomb:
Diffstat (limited to 'activerecord')
-rw-r--r--activerecord/lib/active_record/attribute_methods.rb15
1 files changed, 11 insertions, 4 deletions
diff --git a/activerecord/lib/active_record/attribute_methods.rb b/activerecord/lib/active_record/attribute_methods.rb
index 54086a8fbb..31cd2edc12 100644
--- a/activerecord/lib/active_record/attribute_methods.rb
+++ b/activerecord/lib/active_record/attribute_methods.rb
@@ -1,5 +1,6 @@
require 'active_support/core_ext/enumerable'
require 'active_support/deprecation'
+require 'thread'
module ActiveRecord
# = Active Record Attribute Methods
@@ -36,10 +37,16 @@ module ActiveRecord
# Generates all the attribute related methods for columns in the database
# accessors, mutators and query methods.
def define_attribute_methods
- return if attribute_methods_generated?
- superclass.define_attribute_methods unless self == base_class
- super(column_names)
- @attribute_methods_generated = true
+ # Use a mutex; we don't want two thread simaltaneously trying to define
+ # attribute methods.
+ @attribute_methods_mutex ||= Mutex.new
+
+ @attribute_methods_mutex.synchronize do
+ return if attribute_methods_generated?
+ superclass.define_attribute_methods unless self == base_class
+ super(column_names)
+ @attribute_methods_generated = true
+ end
end
def attribute_methods_generated?