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