From 2e34b3ed3f9d4c15506a6253ccad12f236562114 Mon Sep 17 00:00:00 2001 From: thedarkone Date: Sun, 29 Sep 2013 19:24:31 +0200 Subject: [PATCH] Avoid using global lazily populated Hashes. Replace them with ThreadSafe::Cache. --- Gemfile.lock | 4 ++++ ci/Gemfile.no-rails | 1 + ci/Gemfile.no-rails.lock | 4 ++++ ci/Gemfile.rails-2.3.x | 1 + ci/Gemfile.rails-2.3.x.lock | 4 ++++ ci/Gemfile.rails-3.x | 1 + ci/Gemfile.rails-3.x.lock | 4 ++++ i18n.gemspec | 2 ++ lib/i18n.rb | 7 ++++++- lib/i18n/backend/flatten.rb | 4 ++-- lib/i18n/backend/memoize.rb | 2 +- 11 files changed, 30 insertions(+), 4 deletions(-) diff --git a/Gemfile.lock b/Gemfile.lock index 6dde73ae..d8f385fb 100644 --- a/Gemfile.lock +++ b/Gemfile.lock @@ -1,10 +1,13 @@ GEM remote: https://rubygems.org/ specs: + atomic (1.1.14) mocha (0.9.9) rake rake (0.8.7) test_declarative (0.0.4) + thread_safe (0.1.3) + atomic PLATFORMS java @@ -13,3 +16,4 @@ PLATFORMS DEPENDENCIES mocha test_declarative + thread_safe (~> 0.1) diff --git a/ci/Gemfile.no-rails b/ci/Gemfile.no-rails index 449613e8..3322c5fd 100644 --- a/ci/Gemfile.no-rails +++ b/ci/Gemfile.no-rails @@ -1,5 +1,6 @@ source 'https://rubygems.org' +gem 'thread_safe', '~> 0.1' gem 'mocha' gem 'test_declarative' diff --git a/ci/Gemfile.no-rails.lock b/ci/Gemfile.no-rails.lock index 569b32a7..11b4dafe 100644 --- a/ci/Gemfile.no-rails.lock +++ b/ci/Gemfile.no-rails.lock @@ -1,10 +1,13 @@ GEM remote: http://rubygems.org/ specs: + atomic (1.1.14) mocha (0.9.9) rake rake (0.8.7) test_declarative (0.0.4) + thread_safe (0.1.3) + atomic PLATFORMS ruby @@ -12,3 +15,4 @@ PLATFORMS DEPENDENCIES mocha test_declarative + thread_safe (~> 0.1) diff --git a/ci/Gemfile.rails-2.3.x b/ci/Gemfile.rails-2.3.x index 3227b3ae..f84ae9c5 100644 --- a/ci/Gemfile.rails-2.3.x +++ b/ci/Gemfile.rails-2.3.x @@ -1,5 +1,6 @@ source 'https://rubygems.org' +gem 'thread_safe', '~> 0.1' gem 'activesupport', '~> 2.3' gem 'sqlite3-ruby' gem 'mocha' diff --git a/ci/Gemfile.rails-2.3.x.lock b/ci/Gemfile.rails-2.3.x.lock index 60106158..39e4f1d2 100644 --- a/ci/Gemfile.rails-2.3.x.lock +++ b/ci/Gemfile.rails-2.3.x.lock @@ -2,6 +2,7 @@ GEM remote: http://rubygems.org/ specs: activesupport (2.3.10) + atomic (1.1.14) ffi (0.6.3) rake (>= 0.8.7) mocha (0.9.9) @@ -10,6 +11,8 @@ GEM rufus-tokyo (1.0.7) sqlite3-ruby (1.3.2) test_declarative (0.0.4) + thread_safe (0.1.3) + atomic PLATFORMS ruby @@ -21,3 +24,4 @@ DEPENDENCIES rufus-tokyo sqlite3-ruby test_declarative + thread_safe (~> 0.1) diff --git a/ci/Gemfile.rails-3.x b/ci/Gemfile.rails-3.x index d0947e55..d05f6781 100644 --- a/ci/Gemfile.rails-3.x +++ b/ci/Gemfile.rails-3.x @@ -1,5 +1,6 @@ source 'https://rubygems.org' +gem 'thread_safe', '~> 0.1' gem 'activesupport', '~> 3.0.0' gem 'sqlite3-ruby' gem 'mocha' diff --git a/ci/Gemfile.rails-3.x.lock b/ci/Gemfile.rails-3.x.lock index de7aad6a..a40c0ff6 100644 --- a/ci/Gemfile.rails-3.x.lock +++ b/ci/Gemfile.rails-3.x.lock @@ -2,6 +2,7 @@ GEM remote: http://rubygems.org/ specs: activesupport (3.0.3) + atomic (1.1.14) ffi (0.6.3) rake (>= 0.8.7) mocha (0.9.9) @@ -10,6 +11,8 @@ GEM rufus-tokyo (1.0.7) sqlite3-ruby (1.3.2) test_declarative (0.0.4) + thread_safe (0.1.3) + atomic PLATFORMS ruby @@ -21,3 +24,4 @@ DEPENDENCIES rufus-tokyo sqlite3-ruby test_declarative + thread_safe (~> 0.1) diff --git a/i18n.gemspec b/i18n.gemspec index 8e925082..273978ad 100644 --- a/i18n.gemspec +++ b/i18n.gemspec @@ -19,6 +19,8 @@ Gem::Specification.new do |s| s.rubyforge_project = '[none]' s.required_rubygems_version = '>= 1.3.5' + s.add_dependency 'thread_safe', '~> 0.1' + s.add_development_dependency 'activesupport', '>= 3.0.0' s.add_development_dependency 'sqlite3' s.add_development_dependency 'mocha' diff --git a/lib/i18n.rb b/lib/i18n.rb index 5b421769..9bf7facd 100755 --- a/lib/i18n.rb +++ b/lib/i18n.rb @@ -1,6 +1,7 @@ require 'i18n/version' require 'i18n/exceptions' require 'i18n/interpolate/ruby' +require 'thread_safe' module I18n autoload :Backend, 'i18n/backend' @@ -268,6 +269,10 @@ def normalize_keys(locale, key, scope, separator = nil) keys end + def new_double_nested_cache # :nodoc: + ThreadSafe::Cache.new { |h,k| h[k] = ThreadSafe::Cache.new } + end + # making these private until Ruby 1.9.2 can send to protected methods again # see http://redmine.ruby-lang.org/repositories/revision/ruby-19?rev=24280 private @@ -320,7 +325,7 @@ def normalize_key(key, separator) end def normalized_key_cache - @normalized_key_cache ||= Hash.new { |h,k| h[k] = {} } + @normalized_key_cache ||= new_double_nested_cache end # DEPRECATED. Use I18n.normalize_keys instead. diff --git a/lib/i18n/backend/flatten.rb b/lib/i18n/backend/flatten.rb index c23f7c13..05e576c8 100644 --- a/lib/i18n/backend/flatten.rb +++ b/lib/i18n/backend/flatten.rb @@ -43,7 +43,7 @@ def normalize_flat_keys(locale, key, scope, separator) # Store flattened links. def links - @links ||= Hash.new { |h,k| h[k] = {} } + @links ||= I18n.new_double_nested_cache end # Flatten keys for nested Hashes by chaining up keys: @@ -99,7 +99,7 @@ def resolve_link(locale, key) end def find_link(locale, key) #:nodoc: - links[locale].each do |from, to| + links[locale].each_pair do |from, to| return [from, to] if key[0, from.length] == from end && nil end diff --git a/lib/i18n/backend/memoize.rb b/lib/i18n/backend/memoize.rb index ae9801fc..a11bdec1 100644 --- a/lib/i18n/backend/memoize.rb +++ b/lib/i18n/backend/memoize.rb @@ -34,7 +34,7 @@ def lookup(locale, key, scope = nil, options = {}) end def memoized_lookup - @memoized_lookup ||= Hash.new { |h, k| h[k] = {} } + @memoized_lookup ||= I18n.new_double_nested_cache end def reset_memoizations!(locale=nil)