diff --git a/OpenRTM_aist/InPortCorbaCdrConsumer.py b/OpenRTM_aist/InPortCorbaCdrConsumer.py index d8432bbf..1de0e849 100644 --- a/OpenRTM_aist/InPortCorbaCdrConsumer.py +++ b/OpenRTM_aist/InPortCorbaCdrConsumer.py @@ -16,7 +16,7 @@ # All rights reserved. # - +import omniORB from omniORB import any from omniORB import CORBA import OpenRTM_aist @@ -155,8 +155,18 @@ def put(self, data): try: inportcdr = self._ptr() + if inportcdr: - return self.convertReturnCode(inportcdr.put(data)) + try: + return self.convertReturnCode(inportcdr.put(data)) + except CORBA.COMM_FAILURE as ex: + if ex.minor == omniORB.COMM_FAILURE_WaitingForReply: + self._rtcout.RTC_DEBUG("Retry put message") + return self.convertReturnCode(inportcdr.put(data)) + else: + raise + except BaseException: + raise return self.CONNECTION_LOST except BaseException: self._rtcout.RTC_ERROR(OpenRTM_aist.Logger.print_exception()) diff --git a/OpenRTM_aist/InPortDSConsumer.py b/OpenRTM_aist/InPortDSConsumer.py index c923c664..ad8f970c 100644 --- a/OpenRTM_aist/InPortDSConsumer.py +++ b/OpenRTM_aist/InPortDSConsumer.py @@ -15,6 +15,7 @@ # All rights reserved. +import omniORB from omniORB import any from omniORB import CORBA import OpenRTM_aist @@ -154,7 +155,16 @@ def put(self, data): try: dataservice = self._ptr() if dataservice: - return self.convertReturnCode(dataservice.push(data)) + try: + return self.convertReturnCode(dataservice.push(data)) + except CORBA.COMM_FAILURE as ex: + if ex.minor == omniORB.COMM_FAILURE_WaitingForReply: + self._rtcout.RTC_DEBUG("Retry push message") + return self.convertReturnCode(dataservice.push(data)) + else: + raise + except BaseException: + raise return self.CONNECTION_LOST except BaseException: self._rtcout.RTC_ERROR(OpenRTM_aist.Logger.print_exception()) diff --git a/OpenRTM_aist/InPortSHMConsumer.py b/OpenRTM_aist/InPortSHMConsumer.py index 7afd66c2..10c49855 100644 --- a/OpenRTM_aist/InPortSHMConsumer.py +++ b/OpenRTM_aist/InPortSHMConsumer.py @@ -8,7 +8,8 @@ # @author Nobuhiko Miyamoto # - +import omniORB +from omniORB import CORBA import OpenRTM_aist import OpenRTM__POA @@ -184,12 +185,24 @@ def put(self, data): if portshmem: guard = OpenRTM_aist.ScopedLock(self._mutex) - - self._shmem.setEndian(self._endian) - self._shmem.create_memory(self._memory_size, self._shm_address) - self._shmem.write(data) - - ret = portshmem.put() + try: + self._shmem.setEndian(self._endian) + self._shmem.create_memory( + self._memory_size, self._shm_address) + self._shmem.write(data) + ret = portshmem.put() + except CORBA.COMM_FAILURE as ex: + if ex.minor == omniORB.COMM_FAILURE_WaitingForReply: + self._rtcout.RTC_DEBUG("Retry put message") + self._shmem.setEndian(self._endian) + self._shmem.create_memory( + self._memory_size, self._shm_address) + self._shmem.write(data) + ret = portshmem.put() + else: + raise + except BaseException: + raise del guard return self.convertReturnCode(ret) return self.CONNECTION_LOST diff --git a/OpenRTM_aist/OutPortCorbaCdrConsumer.py b/OpenRTM_aist/OutPortCorbaCdrConsumer.py index 142ff4c7..f87d4654 100644 --- a/OpenRTM_aist/OutPortCorbaCdrConsumer.py +++ b/OpenRTM_aist/OutPortCorbaCdrConsumer.py @@ -18,7 +18,9 @@ # +import omniORB from omniORB import any +from omniORB import CORBA import OpenRTM_aist import OpenRTM @@ -201,7 +203,16 @@ def get(self): try: data = None outportcdr = self._ptr() - ret, cdr_data = outportcdr.get() + try: + ret, cdr_data = outportcdr.get() + except CORBA.COMM_FAILURE as ex: + if ex.minor == omniORB.COMM_FAILURE_WaitingForReply: + self._rtcout.RTC_DEBUG("Retry get message") + ret, cdr_data = outportcdr.get() + else: + raise + except BaseException: + raise if ret == OpenRTM.PORT_OK: self._rtcout.RTC_DEBUG("get() successful") diff --git a/OpenRTM_aist/OutPortDSConsumer.py b/OpenRTM_aist/OutPortDSConsumer.py index 2183717d..5c8cb4ad 100644 --- a/OpenRTM_aist/OutPortDSConsumer.py +++ b/OpenRTM_aist/OutPortDSConsumer.py @@ -16,7 +16,9 @@ # All rights reserved. +import omniORB from omniORB import any +from omniORB import CORBA import OpenRTM_aist import RTC @@ -199,7 +201,16 @@ def get(self): try: data = None dataservice = self._ptr() - ret, cdr_data = dataservice.pull() + try: + ret, cdr_data = dataservice.pull() + except CORBA.COMM_FAILURE as ex: + if ex.minor == omniORB.COMM_FAILURE_WaitingForReply: + self._rtcout.RTC_DEBUG("Retry pull message") + ret, cdr_data = dataservice.pull() + else: + raise + except BaseException: + raise if ret == RTC.PORT_OK: self._rtcout.RTC_DEBUG("get() successful") diff --git a/OpenRTM_aist/OutPortSHMConsumer.py b/OpenRTM_aist/OutPortSHMConsumer.py index 6267d368..e8e4cc6d 100644 --- a/OpenRTM_aist/OutPortSHMConsumer.py +++ b/OpenRTM_aist/OutPortSHMConsumer.py @@ -10,11 +10,11 @@ # # - +import omniORB +from omniORB import CORBA import OpenRTM_aist import OpenRTM import OpenRTM__POA -from omniORB import CORBA import threading @@ -158,7 +158,17 @@ def get(self): portshmem = self._ptr() guard = OpenRTM_aist.ScopedLock(self._mutex) - ret = portshmem.get() + + try: + ret = portshmem.get() + except CORBA.COMM_FAILURE as ex: + if ex.minor == omniORB.COMM_FAILURE_WaitingForReply: + self._rtcout.RTC_DEBUG("Retry get message") + ret = portshmem.get() + else: + raise + except BaseException: + raise data = None diff --git a/OpenRTM_aist/OutPortSHMProvider.py b/OpenRTM_aist/OutPortSHMProvider.py index 8b6df993..be4ab2ab 100644 --- a/OpenRTM_aist/OutPortSHMProvider.py +++ b/OpenRTM_aist/OutPortSHMProvider.py @@ -9,7 +9,8 @@ # # - +import omniORB +from omniORB import CORBA import OpenRTM_aist import OpenRTM @@ -171,8 +172,26 @@ def get(self): self._rtcout.RTC_TRACE(OpenRTM_aist.Logger.print_exception()) return OpenRTM.UNKNOWN_ERROR - self.setEndian(self._endian) - self.create_memory(self._memory_size, self._shm_address) + try: + self.setEndian(self._endian) + self.create_memory(self._memory_size, self._shm_address) + except CORBA.COMM_FAILURE as ex: + if ex.minor == omniORB.COMM_FAILURE_WaitingForReply: + self._rtcout.RTC_DEBUG("Retry set memory") + try: + self.setEndian(self._endian) + self.create_memory(self._memory_size, self._shm_address) + except BaseException: + self._rtcout.RTC_TRACE( + OpenRTM_aist.Logger.print_exception()) + return OpenRTM.UNKNOWN_ERROR + else: + self._rtcout.RTC_TRACE(OpenRTM_aist.Logger.print_exception()) + return OpenRTM.UNKNOWN_ERROR + except BaseException: + self._rtcout.RTC_TRACE(OpenRTM_aist.Logger.print_exception()) + return OpenRTM.UNKNOWN_ERROR + if cdr: self.write(cdr) diff --git a/OpenRTM_aist/PortBase.py b/OpenRTM_aist/PortBase.py index 6bc59b0f..7cdb2823 100644 --- a/OpenRTM_aist/PortBase.py +++ b/OpenRTM_aist/PortBase.py @@ -17,6 +17,8 @@ import threading import copy +import omniORB +from omniORB import CORBA import OpenRTM_aist import OpenRTM_aist.CORBA_RTCUtil @@ -2305,6 +2307,16 @@ def checkPorts(self, ports): if port._non_existent(): self._rtcout.RTC_WARN("Dead Port reference detected.") return False + except CORBA.COMM_FAILURE as ex: + if ex.minor == omniORB.COMM_FAILURE_WaitingForReply: + self._rtcout.RTC_DEBUG("Retry access connected port") + if port._non_existent(): + self._rtcout.RTC_WARN("Dead Port reference detected.") + return False + else: + self._rtcout.RTC_WARN( + OpenRTM_aist.Logger.print_exception()) + return False except BaseException: self._rtcout.RTC_WARN(OpenRTM_aist.Logger.print_exception()) return False