aboutsummaryrefslogtreecommitdiffstats
path: root/activerecord/lib
diff options
context:
space:
mode:
authorRafael Mendonça França <rafaelmfranca@gmail.com>2013-09-28 17:16:25 -0700
committerRafael Mendonça França <rafaelmfranca@gmail.com>2013-09-28 17:16:25 -0700
commitf90a5888baf90160f359d4dbffcb56ce7e86b747 (patch)
tree07a0445e05602fb702c33289fec15115d1973a65 /activerecord/lib
parent8771a565d3d5185bb0b73d93a24bf6d2a22bd718 (diff)
parentf31ec1c4720abfc51f7f74d23d328eaa1401336e (diff)
downloadrails-f90a5888baf90160f359d4dbffcb56ce7e86b747.tar.gz
rails-f90a5888baf90160f359d4dbffcb56ce7e86b747.tar.bz2
rails-f90a5888baf90160f359d4dbffcb56ce7e86b747.zip
Merge pull request #12398 from thedarkone/thread-safety-stuff
Thread safety fixes
Diffstat (limited to 'activerecord/lib')
-rw-r--r--activerecord/lib/active_record/attribute_methods.rb20
1 files changed, 8 insertions, 12 deletions
diff --git a/activerecord/lib/active_record/attribute_methods.rb b/activerecord/lib/active_record/attribute_methods.rb
index 208da2cb77..bf270c1829 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 'mutex_m'
+require 'thread_safe'
module ActiveRecord
# = Active Record Attribute Methods
@@ -29,23 +30,18 @@ module ActiveRecord
}
class AttributeMethodCache
- include Mutex_m
-
def initialize
- super
@module = Module.new
- @method_cache = {}
+ @method_cache = ThreadSafe::Cache.new
end
def [](name)
- synchronize do
- @method_cache.fetch(name) {
- safe_name = name.unpack('h*').first
- temp_method = "__temp__#{safe_name}"
- ActiveRecord::AttributeMethods::AttrNames.set_name_cache safe_name, name
- @module.module_eval method_body(temp_method, safe_name), __FILE__, __LINE__
- @method_cache[name] = @module.instance_method temp_method
- }
+ @method_cache.compute_if_absent(name) do
+ safe_name = name.unpack('h*').first
+ temp_method = "__temp__#{safe_name}"
+ ActiveRecord::AttributeMethods::AttrNames.set_name_cache safe_name, name
+ @module.module_eval method_body(temp_method, safe_name), __FILE__, __LINE__
+ @module.instance_method temp_method
end
end