# HG changeset patch # User Edouard Tisserant # Date 1367224284 -32400 # Node ID 786b12887e91613392b1ff03db148ef7913564fa # Parent a6577420a27b5d70f39fa9f00679891ac9a46786 Moved serial transaction lock in order to encompass serial port teardown in case of error, to avoid deadlocks and multiple close in some cases diff -r a6577420a27b -r 786b12887e91 LPCconnector/LPCAppProto.py --- a/LPCconnector/LPCAppProto.py Mon Apr 29 17:29:59 2013 +0900 +++ b/LPCconnector/LPCAppProto.py Mon Apr 29 17:31:24 2013 +0900 @@ -6,7 +6,6 @@ class LPCAppProto(LPCProto): def HandleTransaction(self, transaction): - self.TransactionLock.acquire() try: transaction.SetPseudoFile(self.serialPort) # send command, wait ack (timeout) @@ -18,8 +17,6 @@ raise LPCProtoError("controller did not answer as expected") except Exception, e: raise LPCProtoError("application mode transaction error : "+str(e)) - finally: - self.TransactionLock.release() return LPC_STATUS.get(current_plc_status,"Broken"), res class LPCAppTransaction: diff -r a6577420a27b -r 786b12887e91 LPCconnector/LPCBootProto.py --- a/LPCconnector/LPCBootProto.py Mon Apr 29 17:29:59 2013 +0900 +++ b/LPCconnector/LPCBootProto.py Mon Apr 29 17:31:24 2013 +0900 @@ -2,12 +2,12 @@ class LPCBootProto(LPCProto): def HandleTransaction(self, transaction): - self.TransactionLock.acquire() + res = None try: transaction.SetPseudoFile(self.serialPort) res = transaction.ExchangeData() - finally: - self.TransactionLock.release() + except: + pass return "Stopped", res class LPCBootTransaction: diff -r a6577420a27b -r 786b12887e91 LPCconnector/LPCObject.py --- a/LPCconnector/LPCObject.py Mon Apr 29 17:29:59 2013 +0900 +++ b/LPCconnector/LPCObject.py Mon Apr 29 17:31:24 2013 +0900 @@ -24,15 +24,13 @@ from LPCProto import * - - class LPCObject(): def __init__(self, confnodesroot, comportstr): + self.TransactionLock = Lock() self.PLCStatus = "Disconnected" self.confnodesroot = confnodesroot self.PLCprint = confnodesroot.logger.writeyield self._Idxs = [] - comport = int(comportstr[3:]) - 1 try: self.connect(comportstr) except Exception,e: @@ -41,19 +39,28 @@ self.PLCStatus = "Disconnected" def HandleSerialTransaction(self, transaction): + res = None + disconnected=False + failure=None + self.TransactionLock.acquire() if self.SerialConnection is not None: try: - self.PLCStatus, res = self.SerialConnection.HandleTransaction(transaction) - return res + self.PLCStatus, res = \ + self.SerialConnection.HandleTransaction(transaction) except LPCProtoError,e: - self.confnodesroot.logger.write(_("PLC disconnected\n")) + disconnected=True if self.SerialConnection is not None: self.SerialConnection.close() self.SerialConnection = None self.PLCStatus = "Disconnected" - return None except Exception,e: - self.confnodesroot.logger.write_warning(str(e)+"\n") + failure = str(e) + self.TransactionLock.release() + if disconnected: + self.confnodesroot.logger.write(_("PLC disconnected\n")) + if failure is not None: + self.confnodesroot.logger.write_warning(failure+"\n") + return res def StartPLC(self, debug=False): raise LPCProtoError("Not implemented") diff -r a6577420a27b -r 786b12887e91 LPCconnector/LPCProto.py --- a/LPCconnector/LPCProto.py Mon Apr 29 17:29:59 2013 +0900 +++ b/LPCconnector/LPCProto.py Mon Apr 29 17:31:24 2013 +0900 @@ -14,7 +14,6 @@ class LPCProto: def __init__(self, port, rate, timeout): # serialize access lock - self.TransactionLock = Lock() if BMZ_DBG: # Debugging serial stuff self._serialPort = serial.Serial( port, rate, timeout = timeout, writeTimeout = timeout )