diff options
author | Jeff Forcier <jeff@bitprophet.org> | 2016-06-11 23:28:56 -0700 |
---|---|---|
committer | Jeff Forcier <jeff@bitprophet.org> | 2016-06-11 23:28:59 -0700 |
commit | 0e54d0f91d78f500a5081c51cf136cf009ace4b8 (patch) | |
tree | c96248b4b46fa0da76e0acee6a10ad24ec3d71bf | |
parent | 20aa3230e32a5018cb5b4245eab1af19dd28acf7 (diff) |
Experimental fix re #520
-rw-r--r-- | paramiko/packet.py | 4 | ||||
-rw-r--r-- | paramiko/transport.py | 13 |
2 files changed, 15 insertions, 2 deletions
diff --git a/paramiko/packet.py b/paramiko/packet.py index 89a514d1..5dd4c49f 100644 --- a/paramiko/packet.py +++ b/paramiko/packet.py @@ -103,6 +103,10 @@ class Packetizer (object): self.__handshake_complete = False self.__timer_expired = False + @property + def closed(self): + return self.__closed + def set_log(self, log): """ Set the Python log object to use for logging. diff --git a/paramiko/transport.py b/paramiko/transport.py index 5e175230..64b96d4f 100644 --- a/paramiko/transport.py +++ b/paramiko/transport.py @@ -1532,8 +1532,17 @@ class Transport (threading.Thread, ClosingContextManager): def stop_thread(self): self.active = False self.packetizer.close() - while self.is_alive() and (self is not threading.current_thread()): - self.join(10) + # Keep trying to join() our main thread, quickly, until: + # * We join()ed successfully (self.is_alive() == False) + # * Or it looks like we've hit issue #520 (socket.recv hitting some + # race condition preventing it from timing out correctly), wherein our + # socket and packetizer are both closed (but where we'd otherwise be + # sitting forever on that recv()). + while ( + self.is_alive() and self is not threading.current_thread() + and not self.sock._closed and not self.packetizer.closed + ): + self.join(0.1) ### internals... |