summaryrefslogtreecommitdiffstats
path: root/Lib/asyncio/proactor_events.py
diff options
context:
space:
mode:
authorVictor Stinner <victor.stinner@gmail.com>2014-06-10 08:23:10 (GMT)
committerVictor Stinner <victor.stinner@gmail.com>2014-06-10 08:23:10 (GMT)
commitbb2fc5b2a58993c80ee81f10fe463039520a4162 (patch)
tree7f072c58fe93ed3fec34e99c5bb642e81f68be52 /Lib/asyncio/proactor_events.py
parent15386652bfc57721d52e00e43a0e2ed66724995d (diff)
downloadcpython-bb2fc5b2a58993c80ee81f10fe463039520a4162.zip
cpython-bb2fc5b2a58993c80ee81f10fe463039520a4162.tar.gz
cpython-bb2fc5b2a58993c80ee81f10fe463039520a4162.tar.bz2
Issue #21326: Add a new is_closed() method to asyncio.BaseEventLoop
Add BaseEventLoop._closed attribute and use it to check if the event loop was closed or not, instead of checking different attributes in each subclass of BaseEventLoop. run_forever() and run_until_complete() methods now raise a RuntimeError('Event loop is closed') exception if the event loop was closed. BaseProactorEventLoop.close() now also cancels "accept futures".
Diffstat (limited to 'Lib/asyncio/proactor_events.py')
-rw-r--r--Lib/asyncio/proactor_events.py23
1 files changed, 15 insertions, 8 deletions
diff --git a/Lib/asyncio/proactor_events.py b/Lib/asyncio/proactor_events.py
index d99e8ce..757a22e 100644
--- a/Lib/asyncio/proactor_events.py
+++ b/Lib/asyncio/proactor_events.py
@@ -353,13 +353,14 @@ class BaseProactorEventLoop(base_events.BaseEventLoop):
sock, protocol, waiter, extra)
def close(self):
- if self._proactor is not None:
- self._close_self_pipe()
- self._proactor.close()
- self._proactor = None
- self._selector = None
- super().close()
- self._accept_futures.clear()
+ if self.is_closed():
+ return
+ self._stop_accept_futures()
+ self._close_self_pipe()
+ self._proactor.close()
+ self._proactor = None
+ self._selector = None
+ super().close()
def sock_recv(self, sock, n):
return self._proactor.recv(sock, n)
@@ -428,6 +429,8 @@ class BaseProactorEventLoop(base_events.BaseEventLoop):
self._make_socket_transport(
conn, protocol,
extra={'peername': addr}, server=server)
+ if self.is_closed():
+ return
f = self._proactor.accept(sock)
except OSError as exc:
if sock.fileno() != -1:
@@ -448,8 +451,12 @@ class BaseProactorEventLoop(base_events.BaseEventLoop):
def _process_events(self, event_list):
pass # XXX hard work currently done in poll
- def _stop_serving(self, sock):
+ def _stop_accept_futures(self):
for future in self._accept_futures.values():
future.cancel()
+ self._accept_futures.clear()
+
+ def _stop_serving(self, sock):
+ self._stop_accept_futures()
self._proactor._stop_serving(sock)
sock.close()