From a9e31d01f943da5758dfc442032e4ba6282a6cba Mon Sep 17 00:00:00 2001 From: BodgeMaster <> Date: Sun, 20 Mar 2022 10:34:56 +0100 Subject: [PATCH] make Communication thread safe --- util.py | 16 +++++++++++++++- 1 file changed, 15 insertions(+), 1 deletion(-) diff --git a/util.py b/util.py index 1b80b05..2f0605e 100644 --- a/util.py +++ b/util.py @@ -1,4 +1,4 @@ -import sys, traceback +import sys, traceback, threading EXIT_SUCCESS=0 EXIT_ERROR=1 @@ -30,10 +30,12 @@ def error(message, is_exception=True, handle_gracefully=True): #TODO: make thread safe class Communication: def __init__(self): + self.lock = threading.Lock() self.__messages = {} # send a message tagged with name and containing content, adds to the beginning of the list of messages with the same tag by default, a function to run as an additional action can be provided def send(self, name, content, reverse_order=True, additional_action=None): + self.lock.acquire() if name in self.__messages: if reverse_order: self.__messages[name] = [content] + self.__messages[name] @@ -45,32 +47,44 @@ class Communication: pass else: additional_action() + self.lock.release() # get the content of the first message tagged with name, removes the returned message by default def get(self, name, remove=True): + self.lock.acquire() if name in self.__messages and len(self.__messages[name])>0: if remove: content = self.__messages[name].pop(0) if len(self.__messages[name])==0: del self.__messages[name] + self.lock.release() return content else: + self.lock.release() return self.__messages[name][0] else: + self.lock.release() return None # get the contents for all messages tagged with name def get_all(self, name, clear=False): + self.lock.acquire() if name in self.__messages and len(self.__messages[name])>0: contents = self.__messages[name] if clear: del self.__messages[name] + self.lock.release() return contents + else: + self.lock.release() + return None # deletes all messages tagged with name def clear(self, name): + self.lock.acquire() if name in self.__messages: del self.__messages[name] + self.lock.release() def __del__(self): if len(self.__messages)>0: