Permalink
Browse files

Adding a local thread registry to store local caches.

  • Loading branch information...
1 parent 5e4683f commit 8d8e171a6126fe34159f7d42cca07cc8010a217c @wangjohn wangjohn committed Apr 17, 2013
Showing with 32 additions and 15 deletions.
  1. +32 −15 activesupport/lib/active_support/cache/strategy/local_cache.rb
@@ -8,6 +8,23 @@ module Strategy
# duration of a block. Repeated calls to the cache for the same key will hit the
# in-memory cache for faster access.
module LocalCache
+ # Class for storing and registering the local caches.
+ class LocalCacheRegistry
frodsan
frodsan Apr 17, 2013 Contributor

Are there plans to use this outside of Rails?

wangjohn
wangjohn Apr 17, 2013 Contributor

No, this is pretty much just intended to be used internally. I guess we should slap a :nodoc: onto this

+ extend ActiveSupport::PerThreadRegistry
+
+ def initialize
+ @registry = {}
+ end
+
+ def cache_for(local_cache_key)
+ @registry[local_cache_key]
+ end
+
+ def set_cache_for(local_cache_key, value)
+ @registry[local_cache_key] = value
+ end
+ end
+
# Simple memory backed cache. This cache is not thread safe and is intended only
# for serving as a temporary memory cache for a single thread.
class LocalStore < Store
@@ -41,24 +58,24 @@ def delete_entry(key, options)
# Use a local cache for the duration of block.
def with_local_cache
- save_val = Thread.current[thread_local_key]
+ save_val = LocalCacheRegistry.cache_for(local_cache_key)
begin
- Thread.current[thread_local_key] = LocalStore.new
+ LocalCacheRegistry.set_cache_for(local_cache_key, LocalStore.new)
yield
ensure
- Thread.current[thread_local_key] = save_val
+ LocalCacheRegistry.set_cache_for(local_cache_key, save_val)
end
end
#--
# This class wraps up local storage for middlewares. Only the middleware method should
# construct them.
class Middleware # :nodoc:
- attr_reader :name, :thread_local_key
+ attr_reader :name, :local_cache_key
- def initialize(name, thread_local_key)
+ def initialize(name, local_cache_key)
@name = name
- @thread_local_key = thread_local_key
+ @local_cache_key = local_cache_key
@app = nil
end
@@ -68,10 +85,10 @@ def new(app)
end
def call(env)
- Thread.current[thread_local_key] = LocalStore.new
+ LocalCacheRegistry.set_cache_for(local_cache_key, LocalStore.new)
@app.call(env)
ensure
- Thread.current[thread_local_key] = nil
+ LocalCacheRegistry.set_cache_for(local_cache_key, nil)
end
end
@@ -80,7 +97,7 @@ def call(env)
def middleware
@middleware ||= Middleware.new(
"ActiveSupport::Cache::Strategy::LocalCache",
- thread_local_key)
+ local_cache_key)
end
def clear(options = nil) # :nodoc:
@@ -146,21 +163,21 @@ def delete_entry(key, options) # :nodoc:
end
private
- def thread_local_key
- @thread_local_key ||= "#{self.class.name.underscore}_local_cache_#{object_id}".gsub(/[\/-]/, '_').to_sym
+ def local_cache_key
+ @local_cache_key ||= "#{self.class.name.underscore}_local_cache_#{object_id}".gsub(/[\/-]/, '_').to_sym
end
def local_cache
- Thread.current[thread_local_key]
+ LocalCacheRegistry.cache_for(local_cache_key)
end
def bypass_local_cache
- save_cache = Thread.current[thread_local_key]
+ save_cache = LocalCacheRegistry.cache_for(local_cache_key)
begin
- Thread.current[thread_local_key] = nil
+ LocalCacheRegistry.set_cache_for(local_cache_key, nil)
yield
ensure
- Thread.current[thread_local_key] = save_cache
+ LocalCacheRegistry.set_cache_for(local_cache_key, save_cache)
end
end
end

0 comments on commit 8d8e171

Please sign in to comment.