Initial port of 3709d2e02bf67ccc272e1f2311e5db125a922ba0 from 'ssh'

Re #17
This commit is contained in:
Jeff Forcier 2012-09-13 17:17:34 -07:00
parent edddc61fb5
commit 8f9b37add4
1 changed files with 95 additions and 83 deletions

View File

@ -1505,12 +1505,17 @@ class Transport (threading.Thread):
# indefinitely, creating a GC cycle and not letting Transport ever be # indefinitely, creating a GC cycle and not letting Transport ever be
# GC'd. it's a bug in Thread.) # GC'd. it's a bug in Thread.)
# Hold reference to 'sys' so we can test sys.modules to detect
# interpreter shutdown.
self.sys = sys
# active=True occurs before the thread is launched, to avoid a race # active=True occurs before the thread is launched, to avoid a race
_active_threads.append(self) _active_threads.append(self)
if self.server_mode: if self.server_mode:
self._log(DEBUG, 'starting thread (server mode): %s' % hex(long(id(self)) & 0xffffffffL)) self._log(DEBUG, 'starting thread (server mode): %s' % hex(long(id(self)) & 0xffffffffL))
else: else:
self._log(DEBUG, 'starting thread (client mode): %s' % hex(long(id(self)) & 0xffffffffL)) self._log(DEBUG, 'starting thread (client mode): %s' % hex(long(id(self)) & 0xffffffffL))
try:
try: try:
self.packetizer.write_all(self.local_version + '\r\n') self.packetizer.write_all(self.local_version + '\r\n')
self._check_banner() self._check_banner()
@ -1600,6 +1605,13 @@ class Transport (threading.Thread):
finally: finally:
self.lock.release() self.lock.release()
self.sock.close() self.sock.close()
except:
# Don't raise spurious 'NoneType has no attribute X' errors when we
# wake up during interpreter shutdown. Or rather -- raise
# everything *if* sys.modules (used as a convenient sentinel)
# appears to still exist.
if self.sys.modules is not None:
raise
### protocol stages ### protocol stages