From e559ebecd5ae55accbf5a4ebe61aa73fa2f98f34 Mon Sep 17 00:00:00 2001
From: Dominic Kempf <dominic.kempf@iwr.uni-heidelberg.de>
Date: Tue, 22 Nov 2016 17:00:54 +0100
Subject: [PATCH] Have {retrieve,delete}_cache_items respect context tags

---
 python/dune/perftool/generation/cache.py      |  8 ++-
 python/dune/perftool/generation/context.py    |  2 +-
 .../dune/perftool/generation/test_cache.py    | 63 +++++++++++++++++--
 3 files changed, 65 insertions(+), 8 deletions(-)

diff --git a/python/dune/perftool/generation/cache.py b/python/dune/perftool/generation/cache.py
index bcbc8b1e..788ba192 100644
--- a/python/dune/perftool/generation/cache.py
+++ b/python/dune/perftool/generation/cache.py
@@ -193,7 +193,13 @@ class _ConditionDict(dict):
 
 
 def _filter_cache_items(gen, condition):
-    return {k: v for k, v in gen._memoize_cache.items() if eval(condition, _ConditionDict(gen.item_tags))}
+    ret = {}
+    for k, v in gen._memoize_cache.items():
+        _, context_tags = k
+        if eval(condition, _ConditionDict(gen.item_tags + context_tags)):
+            ret[k] = v
+
+    return ret
 
 
 def retrieve_cache_items(condition=True, make_generable=False):
diff --git a/python/dune/perftool/generation/context.py b/python/dune/perftool/generation/context.py
index 3766971d..55feda42 100644
--- a/python/dune/perftool/generation/context.py
+++ b/python/dune/perftool/generation/context.py
@@ -12,7 +12,7 @@ class _GlobalContext(object):
         for k, v in self.kw.items():
             # First store existing values of the same keys
             if k in _global_context_cache:
-                self.old_kw[k] = v
+                self.old_kw[k] = _global_context_cache[k]
             # Now replace the value with the new one
             _global_context_cache[k] = v
 
diff --git a/python/test/dune/perftool/generation/test_cache.py b/python/test/dune/perftool/generation/test_cache.py
index f974a518..3d970480 100644
--- a/python/test/dune/perftool/generation/test_cache.py
+++ b/python/test/dune/perftool/generation/test_cache.py
@@ -1,11 +1,12 @@
 from collections import Counter
 
-from dune.perftool.generation.cache import(delete_cache_items,
-                                           generator_factory,
-                                           no_caching,
-                                           retrieve_cache_functions,
-                                           retrieve_cache_items,
-                                           )
+from dune.perftool.generation import(delete_cache_items,
+                                     generator_factory,
+                                     global_context,
+                                     no_caching,
+                                     retrieve_cache_functions,
+                                     retrieve_cache_items,
+                                     )
 
 
 def print_cache():
@@ -202,3 +203,53 @@ def test_no_caching_function():
     assert compare(["one", "one"], list(retrieve_cache_items("no_caching")))
     no_caching_function("two")
     assert compare(["one", "one", "two"], list(retrieve_cache_items("no_caching")))
+
+
+# =====================
+# Test multiple kernels
+# =====================
+
+
+preamble = generator_factory(item_tags=("preamble",), context_tags=("kernel",))
+
+
+@preamble
+def pre1():
+    return "blubb"
+
+
+@preamble
+def pre2():
+    return "bla"
+
+
+def test_multiple_kernels():
+    with global_context(kernel="k1"):
+        pre1()
+    with global_context(kernel="k2"):
+        pre2()
+
+    preambles = [p for p in retrieve_cache_items("preamble")]
+    assert len(preambles) == 2
+
+    k1, = retrieve_cache_items("k1")
+    assert k1 == "blubb"
+
+    k2, = retrieve_cache_items("k2")
+    assert k2 == "bla"
+
+    delete_cache_items()
+
+    with global_context(kernel="k1"):
+        with global_context(kernel="k2"):
+            pre2()
+        pre1()
+
+    preambles = [p for p in retrieve_cache_items("preamble")]
+    assert len(preambles) == 2
+
+    k1, = retrieve_cache_items("k1")
+    assert k1 == "blubb"
+
+    k2, = retrieve_cache_items("k2")
+    assert k2 == "bla"
-- 
GitLab