aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--activesupport/lib/active_support/cache/memory_store.rb36
-rw-r--r--activesupport/test/caching_test.rb24
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