diff --git a/src/aura_engine/base/lang.py b/src/aura_engine/base/lang.py index 8f6f043e9456dc2b5dc8915cf705c0db7ef2165c..4e8188cd6841cd780213da6d309e96eb86d411f2 100644 --- a/src/aura_engine/base/lang.py +++ b/src/aura_engine/base/lang.py @@ -18,16 +18,40 @@ """ -A collection of Python meta-programming and language utilities. +A collection of meta-programming and language utilities. """ import inspect from functools import wraps +from multiprocessing import Lock + + +def synchronized(member): + """ + @synchronized decorator. + + Lock a method for synchronized access only. + """ + mutex = Lock() + + @wraps(member) + def wrapper(*args, **vargs): + result = "" + try: + mutex.acquire() + result = member(*args, **vargs) + mutex.release() + except Exception as e: + mutex.release() + raise e + return result + + return wrapper def private(member): """ - @private Decorator. + @private decorator. Use this to annotate your methods for private-visibility. @@ -35,7 +59,7 @@ def private(member): """ @wraps(member) - def wrapper(*args): + def wrapper(*args, **vargs): me = member.__name__ stack = inspect.stack() calling_class = stack[1][0].f_locals["self"].__class__.__name__ @@ -44,7 +68,7 @@ def private(member): msg = f'"{me}(..)" called by "{calling_class}.{calling_method}(..)" is private' print(msg) raise Exception(msg) - return member(*args) + return member(*args, **vargs) return wrapper