diff options
author | Victor Stinner <victor.stinner@gmail.com> | 2014-06-10 08:23:10 (GMT) |
---|---|---|
committer | Victor Stinner <victor.stinner@gmail.com> | 2014-06-10 08:23:10 (GMT) |
commit | bb2fc5b2a58993c80ee81f10fe463039520a4162 (patch) | |
tree | 7f072c58fe93ed3fec34e99c5bb642e81f68be52 /Lib/asyncio/proactor_events.py | |
parent | 15386652bfc57721d52e00e43a0e2ed66724995d (diff) | |
download | cpython-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.py | 23 |
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() |