summaryrefslogtreecommitdiffhomepage
diff options
context:
space:
mode:
authorJeff Forcier <jeff@bitprophet.org>2016-06-11 23:29:06 -0700
committerJeff Forcier <jeff@bitprophet.org>2016-06-11 23:29:06 -0700
commitcd64b7f78dca28ac771a8cf5b3a0cbfec51e1d09 (patch)
treed48efd9b4195130327e5e9d8ec8b9d35734deca7
parentda125c13a09bac42f5565ac24e6ed454629d9aa8 (diff)
parent0e54d0f91d78f500a5081c51cf136cf009ace4b8 (diff)
Merge branch '1.16' into 1.17
-rw-r--r--paramiko/packet.py4
-rw-r--r--paramiko/transport.py13
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...