Skip to content
Snippets Groups Projects
Commit 032ea0ac authored by David Trattnig's avatar David Trattnig
Browse files

refact(decorator): store sync lock on instance

parent fce6e214
No related branches found
No related tags found
No related merge requests found
......@@ -30,19 +30,22 @@ def synchronized(member):
"""
@synchronized decorator.
Lock a method for synchronized access only.
Lock a method for synchronized access only. The lock is stored to the function or class
instance, depending on what is available.
"""
mutex = Lock()
@wraps(member)
def wrapper(*args, **vargs):
def wrapper(*args, **kwargs):
lock = vars(member).get("_synchronized_lock", None)
result = ""
try:
mutex.acquire()
result = member(*args, **vargs)
mutex.release()
if lock is None:
lock = vars(member).setdefault("_synchronized_lock", Lock())
lock.acquire()
result = member(*args, **kwargs)
lock.release()
except Exception as e:
mutex.release()
lock.release()
raise e
return result
......@@ -59,7 +62,7 @@ def private(member):
"""
@wraps(member)
def wrapper(*args, **vargs):
def wrapper(*args, **kwargs):
me = member.__name__
stack = inspect.stack()
calling_class = stack[1][0].f_locals["self"].__class__.__name__
......@@ -68,7 +71,7 @@ def private(member):
msg = f'"{me}(..)" called by "{calling_class}.{calling_method}(..)" is private'
print(msg)
raise Exception(msg)
return member(*args, **vargs)
return member(*args, **kwargs)
return wrapper
......
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Please register or to comment