diff --git a/python/dune/perftool/generation/cache.py b/python/dune/perftool/generation/cache.py index bcbc8b1e82a27e3612452d2b68217f03c8d8b341..788ba19253c58f1c0d14b46cfd67a3859f35dde6 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 3766971dd6d469778f71ee74cdc7cd210ed99722..55feda422efbabe48c7663e87fea289585253cde 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 f974a518f5e4f177e123f3b3222986b31c1f5158..3d97048032d407b41d16699d11bc229bc9b31df1 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"