diff options
author | Jon Leighton <j@jonathanleighton.com> | 2012-01-13 22:57:21 +0000 |
---|---|---|
committer | Jon Leighton <j@jonathanleighton.com> | 2012-01-13 22:58:26 +0000 |
commit | 70b762d1a744c2bec725de5f96610ddeb6c07a5d (patch) | |
tree | 2729b03276f4d8c8c6a8030a6d2604908aab094c | |
parent | c159b01b85ac3955c53cd6b8a62d5d90ee973cfb (diff) | |
download | rails-70b762d1a744c2bec725de5f96610ddeb6c07a5d.tar.gz rails-70b762d1a744c2bec725de5f96610ddeb6c07a5d.tar.bz2 rails-70b762d1a744c2bec725de5f96610ddeb6c07a5d.zip |
Fix race condition :bomb:
-rw-r--r-- | activerecord/lib/active_record/attribute_methods.rb | 15 |
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? |