diff --git a/telnetlib3/server.py b/telnetlib3/server.py index a9b808e..0921c2d 100755 --- a/telnetlib3/server.py +++ b/telnetlib3/server.py @@ -111,7 +111,7 @@ def check_negotiation(self, final=False): encoding = self.encoding(outgoing=True, incoming=True) if not self.waiter_encoding.done() and result: self.log.debug('encoding complete: {0!r}'.format(encoding)) - self.waiter_encoding.set_result(self) + self.waiter_encoding.set_result(True) elif (not self.waiter_encoding.done() and self.writer.remote_option.get(TTYPE) is False): @@ -120,13 +120,13 @@ def check_negotiation(self, final=False): # the distant end would not support it, declaring encoding failed. self.log.debug('encoding failed after {0:1.2f}s: {1}' .format(self.duration, encoding)) - self.waiter_encoding.set_result(self) + self.waiter_encoding.set_result(True) return parent elif not self.waiter_encoding.done() and final: self.log.debug('encoding failed after {0:1.2f}s: {1}' .format(self.duration, encoding)) - self.waiter_encoding.set_result(self) + self.waiter_encoding.set_result(True) return parent return parent and result diff --git a/telnetlib3/server_base.py b/telnetlib3/server_base.py index b7e482b..298222b 100644 --- a/telnetlib3/server_base.py +++ b/telnetlib3/server_base.py @@ -85,7 +85,11 @@ def connection_lost(self, exc): self._transport.close() self._waiter_connected.cancel() if self.shell is None: - self._waiter_closed.set_result(self) + self._waiter_closed.set_result(True) + + # break circular refrences. + self._transport = None + self.reader.fn_encoding = None def connection_made(self, transport): """ @@ -134,7 +138,7 @@ def begin_shell(self, result): if asyncio.iscoroutine(coro): fut = self._loop.create_task(coro) fut.add_done_callback( - lambda fut_obj: self._waiter_closed.set_result(self)) + lambda fut_obj: self._waiter_closed.set_result(True)) def data_received(self, data): """Process bytes received by transport.""" @@ -277,11 +281,11 @@ def _check_negotiation_timer(self): if self.check_negotiation(final=final): self.log.debug('negotiation complete after {:1.2f}s.' .format(self.duration)) - self._waiter_connected.set_result(self) + self._waiter_connected.set_result(True) elif final: self.log.debug('negotiation failed after {:1.2f}s.' .format(self.duration)) - self._waiter_connected.set_result(self) + self._waiter_connected.set_result(True) else: # keep re-queuing until complete self._check_later = self._loop.call_later( diff --git a/telnetlib3/stream_writer.py b/telnetlib3/stream_writer.py index 798a808..30eaefb 100644 --- a/telnetlib3/stream_writer.py +++ b/telnetlib3/stream_writer.py @@ -182,6 +182,17 @@ def __init__(self, transport, protocol, *, client=False, server=False, # Base protocol methods + def close(self): + super().close() + # break circular refs + self._ext_callback.clear() + self._ext_send_callback.clear() + self._slc_callback.clear() + self._iac_callback.clear() + self.fn_encoding = None + self._protocol = None + self._transport = None + def __repr__(self): """Description of stream encoding state.""" info = ['TelnetWriter']