aboutsummaryrefslogtreecommitdiffstatshomepage
path: root/Lib/asyncio/selector_events.py
diff options
context:
space:
mode:
authorAlex Grönholm <alex.gronholm@nextday.fi>2020-07-23 22:45:08 +0300
committerGitHub <noreply@github.com>2020-07-23 12:45:08 -0700
commit0dd98c2d00a75efbec19c2ed942923981bc06683 (patch)
tree38c7e97824d54b943d64befd671660ec2eac52bb /Lib/asyncio/selector_events.py
parent680254a8dc64e3ada00f88a7c42d41eb02108353 (diff)
downloadcpython-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.py13
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: