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