Skip to content

Commit

Permalink
Get rid of __del__ in connector
Browse files Browse the repository at this point in the history
  • Loading branch information
asvetlov committed May 2, 2014
1 parent 7e6e3c0 commit a229110
Show file tree
Hide file tree
Showing 2 changed files with 21 additions and 10 deletions.
24 changes: 16 additions & 8 deletions aiohttp/connector.py
Original file line number Diff line number Diff line change
Expand Up @@ -8,6 +8,7 @@
import time
import ssl
import socket
import weakref


class Connection(object):
Expand All @@ -20,20 +21,20 @@ def __init__(self, connector, key, request, transport, protocol):
self._protocol = protocol
self.reader = protocol.reader
self.writer = protocol.writer

def __del__(self):
self.close()
self._wr = weakref.ref(self, lambda wr, tr=self._transport: tr.close())

def close(self):
if self._transport is not None:
self._transport.close()
self._transport = None
self._wr = None

def release(self):
if self._transport:
self._connector._release(
self._key, self._request, self._transport, self._protocol)
self._transport = None
self._wr = None


class BaseConnector(object):
Expand All @@ -52,9 +53,9 @@ def __init__(self, *, reuse_timeout=30, conn_timeout=None,
self._factory = functools.partial(aiohttp.StreamProtocol, loop=loop)

self.cookies = http.cookies.SimpleCookie()

def __del__(self):
self.close()
self._wr = weakref.ref(self,
lambda wr, f=self._do_close, conns=self._conns:
f(conns))

def _cleanup(self):
"""Cleanup unused transports."""
Expand Down Expand Up @@ -85,6 +86,9 @@ def _cleanup(self):
self._reuse_timeout, self._cleanup)

self._conns = connections
self._wr = weakref.ref(self,
lambda wr, f=self._do_close, conns=self._conns:
f(conns))

def _start_cleanup_task(self):
if self._cleanup_handle is None:
Expand All @@ -93,11 +97,15 @@ def _start_cleanup_task(self):

def close(self):
"""Close all opened transports."""
for key, data in self._conns.items():
self._do_close(self._conns)

@staticmethod
def _do_close(conns):
for key, data in conns.items():
for transport, proto, td in data:
transport.close()

self._conns.clear()
conns.clear()

def update_cookies(self, cookies):
if isinstance(cookies, dict):
Expand Down
7 changes: 5 additions & 2 deletions tests/test_connector.py
Original file line number Diff line number Diff line change
Expand Up @@ -67,10 +67,13 @@ def tearDown(self):

def test_del(self):
conn = aiohttp.BaseConnector(loop=self.loop)
close = conn.close = unittest.mock.Mock()
transp = unittest.mock.Mock()
conn._conns['a'] = [(transp, 'proto', 123)]

conns_impl = conn._conns
del conn
self.assertTrue(close.called)
self.assertFalse(conns_impl)
transp.close.assert_called_with()

def test_create_conn(self):
conn = aiohttp.BaseConnector(loop=self.loop)
Expand Down

0 comments on commit a229110

Please sign in to comment.