From fffca5949cb8aa339fd07ad4952def0c43aee8d8 Mon Sep 17 00:00:00 2001
From: Dominic Kempf <dominic.kempf@iwr.uni-heidelberg.de>
Date: Tue, 12 Apr 2016 11:30:35 +0200
Subject: [PATCH] Define a cache context that allows to temporarily add global
 tags

---
 python/dune/perftool/generation/__init__.py |  3 +-
 python/dune/perftool/generation/cache.py    | 33 +++++++++++++++++++++
 2 files changed, 35 insertions(+), 1 deletion(-)

diff --git a/python/dune/perftool/generation/__init__.py b/python/dune/perftool/generation/__init__.py
index d1e9fc44..48ba3a7f 100644
--- a/python/dune/perftool/generation/__init__.py
+++ b/python/dune/perftool/generation/__init__.py
@@ -1,6 +1,7 @@
 from __future__ import absolute_import
 
-from dune.perftool.generation.cache import (generator_factory,
+from dune.perftool.generation.cache import (cache_context,
+                                            generator_factory,
                                             retrieve_cache_items,
                                             delete_cache_items,
                                             )
diff --git a/python/dune/perftool/generation/cache.py b/python/dune/perftool/generation/cache.py
index 5a0e026a..f32849a0 100644
--- a/python/dune/perftool/generation/cache.py
+++ b/python/dune/perftool/generation/cache.py
@@ -7,9 +7,35 @@ a complex requirement structure. This includes:
 from __future__ import absolute_import
 from pytools import memoize
 
+
 # have one cache the module level. It is easier than handing around an instance of it.
 _cache = {}
 
+# Implement a context manager that allows to temporarily define tags globally.
+_cache_context_stack = []
+
+
+class _CacheContext(object):
+    def __init__(self, tags):
+        self.tags = tags
+
+    def __enter__(self):
+        _cache_context_stack.append(self.tags)
+
+    def __exit__(self, exc_type, exc_value, traceback):
+        _cache_context_stack.pop()
+
+
+def cache_context(*tags):
+    return _CacheContext(tags)
+
+
+def _get_context_tags():
+    result = tuple()
+    for items in _cache_context_stack:
+        result = result + items
+    return result
+
 
 def _freeze(data):
     """ A function that deterministically generates an
@@ -105,6 +131,13 @@ class _RegisteredFunction(object):
                  ):
         self.func = func
         self.cache_key_generator = cache_key_generator
+
+        # Append the current context item tags to the given ones
+        if 'item_tags' in kwargs:
+            kwargs['item_tags'] = tuple(kwargs['item_tags']) + _get_context_tags()
+        else:
+            kwargs['item_tags'] = _get_context_tags()
+
         self.itemtype = _construct_cache_item_type("CacheItemType", **kwargs)
 
     def __call__(self, *args, **kwargs):
-- 
GitLab