diff --git a/python/dune/perftool/generation/__init__.py b/python/dune/perftool/generation/__init__.py index d1e9fc443a1f7acb40204eb5e1ea6964e8a1e71b..48ba3a7f3af1fd8188c03317997338b04ef11196 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 5a0e026aa6c7aa8fb00edf962c94f54b4bcf951d..f32849a06b9d52a5a82ccdb91b52475875201682 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):