Просмотр исходного кода

Merge pull request #3191 from getsentry/bugfix/locked-context-patching

Use a thread lock to patch contexts.
Armin Ronacher 8 лет назад
Родитель
Сommit
a6c2791bff
1 измененных файлов с 17 добавлено и 12 удалено
  1. 17 12
      src/sentry/debug/utils/patch_context.py

+ 17 - 12
src/sentry/debug/utils/patch_context.py

@@ -1,5 +1,6 @@
 from __future__ import absolute_import
 
+from threading import Lock
 from sentry.utils.imports import import_string
 
 
@@ -7,10 +8,12 @@ class PatchContext(object):
     def __init__(self, target, callback):
         target, attr = target.rsplit('.', 1)
         target = import_string(target)
-        self.func = getattr(target, attr)
         self.target = target
         self.attr = attr
         self.callback = callback
+        self._lock = Lock()
+        with self._lock:
+            self.func = getattr(target, attr)
 
     def __enter__(self):
         self.patch()
@@ -20,19 +23,21 @@ class PatchContext(object):
         self.unpatch()
 
     def patch(self):
-        func = getattr(self.target, self.attr)
+        with self._lock:
+            func = getattr(self.target, self.attr)
 
-        def wrapped(*args, **kwargs):
-            __traceback_hide__ = True  # NOQA
-            return self.callback(self.func, *args, **kwargs)
+            def wrapped(*args, **kwargs):
+                __traceback_hide__ = True  # NOQA
+                return self.callback(self.func, *args, **kwargs)
 
-        wrapped.__name__ = func.__name__
-        if hasattr(func, '__doc__'):
-            wrapped.__doc__ = func.__doc__
-        if hasattr(func, '__module__'):
-            wrapped.__module__ = func.__module__
+            wrapped.__name__ = func.__name__
+            if hasattr(func, '__doc__'):
+                wrapped.__doc__ = func.__doc__
+            if hasattr(func, '__module__'):
+                wrapped.__module__ = func.__module__
 
-        setattr(self.target, self.attr, wrapped)
+            setattr(self.target, self.attr, wrapped)
 
     def unpatch(self):
-        setattr(self.target, self.attr, self.func)
+        with self._lock:
+            setattr(self.target, self.attr, self.func)