Skip to content

Commit

Permalink
Merge pull request #3191 from getsentry/bugfix/locked-context-patching
Browse files Browse the repository at this point in the history
Use a thread lock to patch contexts.
  • Loading branch information
mitsuhiko authored and mattrobenolt committed May 11, 2016
1 parent 60648b5 commit 04a2027
Showing 1 changed file with 17 additions and 12 deletions.
29 changes: 17 additions & 12 deletions src/sentry/debug/utils/patch_context.py
Original file line number Diff line number Diff line change
@@ -1,16 +1,19 @@
from __future__ import absolute_import

from threading import Lock
from sentry.utils.imports import import_string


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()
Expand All @@ -20,19 +23,21 @@ def __exit__(self, exc_type, exc_value, traceback):
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)

0 comments on commit 04a2027

Please sign in to comment.