diff --git a/pycyphal/_version.py b/pycyphal/_version.py index 9813fabb..e7f9341b 100644 --- a/pycyphal/_version.py +++ b/pycyphal/_version.py @@ -1 +1 @@ -__version__ = "1.27.0" +__version__ = "1.27.1" diff --git a/pycyphal/transport/serial/_serial.py b/pycyphal/transport/serial/_serial.py index 0b093e29..a477d88b 100644 --- a/pycyphal/transport/serial/_serial.py +++ b/pycyphal/transport/serial/_serial.py @@ -452,7 +452,13 @@ def callback(ts: Timestamp, buf: memoryview, frame: typing.Optional[SerialFrame] self._serial_port, ) self._closed = True - self._serial_port.close() + try: + self._serial_port.close() + except Exception: + # close() is not atomic (see __init__), so when SerialTransport.close() runs at the + # same time, the reader thread can try to close an already-closed port. The resulting + # OSError is harmless, so ignore it. + pass finally: _logger.debug("%s: Reader thread is exiting. Head aega.", self)