From 3c841fd4369d375a8b5d2cfb4437bf6157e7e1f3 Mon Sep 17 00:00:00 2001 From: Neil Williams Date: Fri, 20 Apr 2012 16:52:28 -0700 Subject: [PATCH] Make TPM more thread-safe. --- r2/r2/lib/manager/tp_manager.py | 19 ++++++++++++------- 1 file changed, 12 insertions(+), 7 deletions(-) diff --git a/r2/r2/lib/manager/tp_manager.py b/r2/r2/lib/manager/tp_manager.py index 898016782..1db5adb02 100644 --- a/r2/r2/lib/manager/tp_manager.py +++ b/r2/r2/lib/manager/tp_manager.py @@ -41,6 +41,7 @@ class tp_manager: elif not file.startswith('/'): file = '/' + file self.templates[key] = file + return file def add_handler(self, name, style, handler): key = (name.lower(), style.lower()) @@ -57,14 +58,18 @@ class tp_manager: for cls in inspect.getmro(thing): name = cls.__name__.lower() key = (name, style) - if not self.templates.has_key(key): - self.add(name, style) - if isinstance(self.templates[key], self.Template): - template = self.templates[key] + + template_or_name = self.templates.get(key) + if not template_or_name: + template_or_name = self.add(name, style) + + if isinstance(template_or_name, self.Template): + template = template_or_name + break else: try: _loader = pylons.buffet.engines[self.engine]['engine'] - template = _loader.load_template(self.templates[key]) + template = _loader.load_template(template_or_name) if cache: self.templates[key] = template # also store a hash for the template @@ -76,9 +81,9 @@ class tp_manager: # introspection is not required on subsequent passes if key != top_key: self.templates[top_key] = template + break except TemplateLookupException: - continue - break + pass if not template or not isinstance(template, self.Template): raise AttributeError, ("template doesn't exist for %s" % str(top_key))