Skip to content
Snippets Groups Projects
Commit 806f380a authored by Erik Johnston's avatar Erik Johnston
Browse files

Make LruCache thread safe, as its used for event cache

parent a5c72780
No related branches found
No related tags found
No related merge requests found
......@@ -14,6 +14,10 @@
# limitations under the License.
from functools import wraps
import threading
class LruCache(object):
"""Least-recently-used cache."""
# TODO(mjark) Add mutex for linked list for thread safety.
......@@ -24,6 +28,16 @@ class LruCache(object):
PREV, NEXT, KEY, VALUE = 0, 1, 2, 3
lock = threading.Lock()
def synchronized(f):
@wraps(f)
def inner(*args, **kwargs):
with lock:
return f(*args, **kwargs)
return inner
def add_node(key, value):
prev_node = list_root
next_node = prev_node[NEXT]
......@@ -51,6 +65,7 @@ class LruCache(object):
next_node[PREV] = prev_node
cache.pop(node[KEY], None)
@synchronized
def cache_get(key, default=None):
node = cache.get(key, None)
if node is not None:
......@@ -59,6 +74,7 @@ class LruCache(object):
else:
return default
@synchronized
def cache_set(key, value):
node = cache.get(key, None)
if node is not None:
......@@ -69,6 +85,7 @@ class LruCache(object):
if len(cache) > max_size:
delete_node(list_root[PREV])
@synchronized
def cache_set_default(key, value):
node = cache.get(key, None)
if node is not None:
......@@ -79,6 +96,7 @@ class LruCache(object):
delete_node(list_root[PREV])
return value
@synchronized
def cache_pop(key, default=None):
node = cache.get(key, None)
if node:
......@@ -87,9 +105,11 @@ class LruCache(object):
else:
return default
@synchronized
def cache_len():
return len(cache)
@synchronized
def cache_contains(key):
return key in cache
......
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment