From 2c667f69aa2daac5ee6c29ca9679616e2a71532a Mon Sep 17 00:00:00 2001 From: Jon Leighton Date: Fri, 13 Jan 2012 22:57:21 +0000 Subject: Fix race condition :bomb: --- activerecord/lib/active_record/attribute_methods.rb | 15 +++++++++++---- 1 file changed, 11 insertions(+), 4 deletions(-) (limited to 'activerecord/lib/active_record/attribute_methods.rb') diff --git a/activerecord/lib/active_record/attribute_methods.rb b/activerecord/lib/active_record/attribute_methods.rb index 02543db2ce..f8815fefc9 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 @@ -35,10 +36,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? -- cgit v1.2.3