Fix some leaks/hangs on close: unstarted StreamInterface streams & TCP reader unblock

This commit is contained in:
Ian McEwen
2026-05-31 13:48:06 -07:00
parent c2a01f8294
commit ce5bbcda68
4 changed files with 43 additions and 6 deletions

View File

@@ -74,16 +74,17 @@ class TCPInterface(StreamInterface):
def close(self) -> None:
"""Close a connection to the device"""
logger.debug("Closing TCP stream")
super().close()
# Sometimes the socket read might be blocked in the reader thread.
# Therefore we force the shutdown by closing the socket here
# Therefore force a shutdown first to unblock reader thread reads.
self._wantExit = True
if self.socket is not None:
with contextlib.suppress(Exception): # Ignore errors in shutdown, because we might have a race with the server
self._socket_shutdown()
self.socket.close()
with contextlib.suppress(Exception):
self.socket.close()
self.socket = None
super().close()
def _writeBytes(self, b: bytes) -> None:
"""Write an array of bytes to our stream and flush"""