diff options
author | Alex Grönholm <alex.gronholm@nextday.fi> | 2020-07-23 22:45:08 +0300 |
---|---|---|
committer | GitHub <noreply@github.com> | 2020-07-23 12:45:08 -0700 |
commit | 0dd98c2d00a75efbec19c2ed942923981bc06683 (patch) | |
tree | 38c7e97824d54b943d64befd671660ec2eac52bb /Lib/asyncio/selector_events.py | |
parent | 680254a8dc64e3ada00f88a7c42d41eb02108353 (diff) | |
download | cpython-0dd98c2d00a75efbec19c2ed942923981bc06683.tar.gz cpython-0dd98c2d00a75efbec19c2ed942923981bc06683.zip |
bpo-41317: Remove reader on cancellation in asyncio.loop.sock_accept() (#21595)
Diffstat (limited to 'Lib/asyncio/selector_events.py')
-rw-r--r-- | Lib/asyncio/selector_events.py | 13 |
1 files changed, 6 insertions, 7 deletions
diff --git a/Lib/asyncio/selector_events.py b/Lib/asyncio/selector_events.py index 884a58f2ed6..8495a7901cd 100644 --- a/Lib/asyncio/selector_events.py +++ b/Lib/asyncio/selector_events.py @@ -555,20 +555,19 @@ class BaseSelectorEventLoop(base_events.BaseEventLoop): if self._debug and sock.gettimeout() != 0: raise ValueError("the socket must be non-blocking") fut = self.create_future() - self._sock_accept(fut, False, sock) + self._sock_accept(fut, sock) return await fut - def _sock_accept(self, fut, registered, sock): + def _sock_accept(self, fut, sock): fd = sock.fileno() - if registered: - self.remove_reader(fd) - if fut.done(): - return try: conn, address = sock.accept() conn.setblocking(False) except (BlockingIOError, InterruptedError): - self.add_reader(fd, self._sock_accept, fut, True, sock) + self._ensure_fd_no_transport(fd) + handle = self._add_reader(fd, self._sock_accept, fut, sock) + fut.add_done_callback( + functools.partial(self._sock_read_done, fd, handle=handle)) except (SystemExit, KeyboardInterrupt): raise except BaseException as exc: |