# HG changeset patch # User Edouard Tisserant # Date 1549026853 -3600 # Node ID 44c2a4e2b84d5c8f33b11dba2b3e2eb8c26bb3ba # Parent ef327451d0675d73a4bc56bbbf742adee1a6ac0a Fixed deadlock in runtime's Worker. Was discovered while using WAMP and PYRO simultaneously. diff -r ef327451d067 -r 44c2a4e2b84d runtime/PLCObject.py --- a/runtime/PLCObject.py Thu Jan 31 14:10:06 2019 +0100 +++ b/runtime/PLCObject.py Fri Feb 01 14:14:13 2019 +0100 @@ -37,6 +37,7 @@ import md5 from tempfile import mkstemp import shutil +from functools import wraps from runtime.typemapping import TypeTranslator from runtime.loglevels import LogLevelsDefault, LogLevelsCount @@ -72,6 +73,7 @@ def RunInMain(func): + @wraps(func) def func_wrapper(*args, **kwargs): return MainWorker.call(func, *args, **kwargs) return func_wrapper diff -r ef327451d067 -r 44c2a4e2b84d runtime/Worker.py --- a/runtime/Worker.py Thu Jan 31 14:10:06 2019 +0100 +++ b/runtime/Worker.py Fri Feb 01 14:14:13 2019 +0100 @@ -65,13 +65,15 @@ pass else: raise _job.exc_info[0], _job.exc_info[1], _job.exc_info[2] + while not self._finish: self.todo.wait() if self.job is not None: self.job.do() self.done.notify() else: - self.free.notify() + break + self.mutex.release() def call(self, *args, **kwargs): @@ -97,8 +99,8 @@ self.job = _job self.todo.notify() self.done.wait() - _job = self.job self.job = None + self.free.notify() self.mutex.release() if _job.success: