From 032ea0ac78c779b7103b6a22146dc671f476ada2 Mon Sep 17 00:00:00 2001 From: David Trattnig <david@subsquare.at> Date: Tue, 9 Aug 2022 20:22:44 +0200 Subject: [PATCH] refact(decorator): store sync lock on instance --- src/aura_engine/base/lang.py | 21 ++++++++++++--------- 1 file changed, 12 insertions(+), 9 deletions(-) diff --git a/src/aura_engine/base/lang.py b/src/aura_engine/base/lang.py index 4e8188cd..87f91d99 100644 --- a/src/aura_engine/base/lang.py +++ b/src/aura_engine/base/lang.py @@ -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 -- GitLab