summaryrefslogtreecommitdiff
path: root/asyncio/selector_events.py
diff options
context:
space:
mode:
authorVictor Stinner <victor.stinner@gmail.com>2015-01-29 17:32:39 +0100
committerVictor Stinner <victor.stinner@gmail.com>2015-01-29 17:32:39 +0100
commit190e78603a4ce58a2f248fdf8a3472fa1fc6c064 (patch)
tree0990f66b83b12d6466ba5042bfbb0b02442ab5e7 /asyncio/selector_events.py
parenta1611f147decd003b0ffe5d10eb011d0b8c2725e (diff)
downloadtrollius-master.tar.gz
Python issue #23243: On Python 3.4 and newer, emit a ResourceWarning when anHEADmaster
event loop or a transport is not explicitly closed
Diffstat (limited to 'asyncio/selector_events.py')
-rw-r--r--asyncio/selector_events.py16
1 files changed, 16 insertions, 0 deletions
diff --git a/asyncio/selector_events.py b/asyncio/selector_events.py
index 9147832..4bd6dc8 100644
--- a/asyncio/selector_events.py
+++ b/asyncio/selector_events.py
@@ -10,6 +10,8 @@ import collections
import errno
import functools
import socket
+import sys
+import warnings
try:
import ssl
except ImportError: # pragma: no cover
@@ -499,6 +501,11 @@ class _SelectorTransport(transports._FlowControlMixin,
_buffer_factory = bytearray # Constructs initial value for self._buffer.
+ # Attribute used in the destructor: it must be set even if the constructor
+ # is not called (see _SelectorSslTransport which may start by raising an
+ # exception)
+ _sock = None
+
def __init__(self, loop, sock, protocol, extra=None, server=None):
super().__init__(extra, loop)
self._extra['socket'] = sock
@@ -559,6 +566,15 @@ class _SelectorTransport(transports._FlowControlMixin,
self._conn_lost += 1
self._loop.call_soon(self._call_connection_lost, None)
+ # On Python 3.3 and older, objects with a destructor part of a reference
+ # cycle are never destroyed. It's not more the case on Python 3.4 thanks
+ # to the PEP 442.
+ if sys.version_info >= (3, 4):
+ def __del__(self):
+ if self._sock is not None:
+ warnings.warn("unclosed transport %r" % self, ResourceWarning)
+ self._sock.close()
+
def _fatal_error(self, exc, message='Fatal error on transport'):
# Should be called from exception handler only.
if isinstance(exc, (BrokenPipeError,