diff options
| author | Joshua Peek <josh@joshpeek.com> | 2008-08-18 20:14:56 -0500 | 
|---|---|---|
| committer | Joshua Peek <josh@joshpeek.com> | 2008-08-18 20:17:08 -0500 | 
| commit | a4da8175a2c989104de1a38e43d5ddfb0f89b055 (patch) | |
| tree | 5446ffe7473aaf8f2275e792a3237df4d011ada6 | |
| parent | cd8e653d5b18e6d3c3acc9930832f8e23945e392 (diff) | |
| download | rails-a4da8175a2c989104de1a38e43d5ddfb0f89b055.tar.gz rails-a4da8175a2c989104de1a38e43d5ddfb0f89b055.tar.bz2 rails-a4da8175a2c989104de1a38e43d5ddfb0f89b055.zip | |
Replace MemoryStore mutex with a monitor to avoid issues with nested calls
| -rw-r--r-- | activesupport/lib/active_support/cache/memory_store.rb | 36 | ||||
| -rw-r--r-- | activesupport/test/caching_test.rb | 24 | 
2 files changed, 48 insertions, 12 deletions
| diff --git a/activesupport/lib/active_support/cache/memory_store.rb b/activesupport/lib/active_support/cache/memory_store.rb index a44f877414..7ac6f35357 100644 --- a/activesupport/lib/active_support/cache/memory_store.rb +++ b/activesupport/lib/active_support/cache/memory_store.rb @@ -3,51 +3,63 @@ module ActiveSupport      class MemoryStore < Store        def initialize          @data = {} -        @mutex = Mutex.new +        @guard = Monitor.new        end        def fetch(key, options = {}) -        @mutex.synchronize do +        @guard.synchronize do            super          end        end        def read(name, options = nil) -        super -        @data[name] +        @guard.synchronize do +          super +          @data[name] +        end        end        def write(name, value, options = nil) -        super -        @data[name] = value +        @guard.synchronize do +          super +          @data[name] = value +        end        end        def delete(name, options = nil) -        @data.delete(name) +        @guard.synchronize do +          @data.delete(name) +        end        end        def delete_matched(matcher, options = nil) -        @data.delete_if { |k,v| k =~ matcher } +        @guard.synchronize do +          @data.delete_if { |k,v| k =~ matcher } +        end        end        def exist?(name,options = nil) -        @data.has_key?(name) +        @guard.synchronize do +          @data.has_key?(name) +        end        end        def increment(key, amount = 1) -        @mutex.synchronize do +        @guard.synchronize do            super          end        end        def decrement(key, amount = 1) -        @mutex.synchronize do +        @guard.synchronize do            super          end        end        def clear -        @data.clear +        @guard.synchronize do +          @data.clear +        end        end      end    end diff --git a/activesupport/test/caching_test.rb b/activesupport/test/caching_test.rb index c5f7fb7fdd..ce27b464f8 100644 --- a/activesupport/test/caching_test.rb +++ b/activesupport/test/caching_test.rb @@ -97,3 +97,27 @@ class FileStoreTest < Test::Unit::TestCase      File.delete("foo.cache")    end  end + +class MemoryStoreTest < Test::Unit::TestCase +  def setup +    @cache = ActiveSupport::Cache.lookup_store(:memory_store) +  end + +  def test_should_read_and_write +    @cache.write('foo', 'bar') +    assert_equal 'bar', @cache.read('foo') +  end + +  def test_fetch_without_cache_miss +    @cache.write('foo', 'bar') +    assert_equal 'bar', @cache.fetch('foo') { 'baz' } +  end + +  def test_fetch_with_cache_miss +    assert_equal 'baz', @cache.fetch('foo') { 'baz' } +  end + +  def test_fetch_with_forced_cache_miss +    @cache.fetch('foo', :force => true) { 'bar' } +  end +end | 
