summaryrefslogtreecommitdiffstats
path: root/Lib/asyncio
diff options
context:
space:
mode:
authorTony Solomonik <tony.solomonik@gmail.com>2022-10-13 18:05:16 (GMT)
committerGitHub <noreply@github.com>2022-10-13 18:05:16 (GMT)
commitb863b9cd4b8681cf5fff5f121837a1039045783f (patch)
tree00e3253a101e12d9750fb16861d33d18c3e34d49 /Lib/asyncio
parentc9ed0327a9c741a1808926b409df29467baf303a (diff)
downloadcpython-b863b9cd4b8681cf5fff5f121837a1039045783f.zip
cpython-b863b9cd4b8681cf5fff5f121837a1039045783f.tar.gz
cpython-b863b9cd4b8681cf5fff5f121837a1039045783f.tar.bz2
Bpo-41246: IOCP Proactor avoid callback code duplication (#21399)
Use the same callback function for overlapped operations recv, recv_into, recvfrom, sendto, send, and sendfile inside IocpProactor.
Diffstat (limited to 'Lib/asyncio')
-rw-r--r--Lib/asyncio/windows_events.py82
1 files changed, 17 insertions, 65 deletions
diff --git a/Lib/asyncio/windows_events.py b/Lib/asyncio/windows_events.py
index 90b259c..acc97da 100644
--- a/Lib/asyncio/windows_events.py
+++ b/Lib/asyncio/windows_events.py
@@ -446,6 +446,17 @@ class IocpProactor:
fut.set_result(value)
return fut
+ @staticmethod
+ def finish_socket_func(trans, key, ov):
+ try:
+ return ov.getresult()
+ except OSError as exc:
+ if exc.winerror in (_overlapped.ERROR_NETNAME_DELETED,
+ _overlapped.ERROR_OPERATION_ABORTED):
+ raise ConnectionResetError(*exc.args)
+ else:
+ raise
+
def recv(self, conn, nbytes, flags=0):
self._register_with_iocp(conn)
ov = _overlapped.Overlapped(NULL)
@@ -457,17 +468,7 @@ class IocpProactor:
except BrokenPipeError:
return self._result(b'')
- def finish_recv(trans, key, ov):
- try:
- return ov.getresult()
- except OSError as exc:
- if exc.winerror in (_overlapped.ERROR_NETNAME_DELETED,
- _overlapped.ERROR_OPERATION_ABORTED):
- raise ConnectionResetError(*exc.args)
- else:
- raise
-
- return self._register(ov, conn, finish_recv)
+ return self._register(ov, conn, self.finish_socket_func)
def recv_into(self, conn, buf, flags=0):
self._register_with_iocp(conn)
@@ -480,17 +481,7 @@ class IocpProactor:
except BrokenPipeError:
return self._result(0)
- def finish_recv(trans, key, ov):
- try:
- return ov.getresult()
- except OSError as exc:
- if exc.winerror in (_overlapped.ERROR_NETNAME_DELETED,
- _overlapped.ERROR_OPERATION_ABORTED):
- raise ConnectionResetError(*exc.args)
- else:
- raise
-
- return self._register(ov, conn, finish_recv)
+ return self._register(ov, conn, self.finish_socket_func)
def recvfrom(self, conn, nbytes, flags=0):
self._register_with_iocp(conn)
@@ -500,17 +491,7 @@ class IocpProactor:
except BrokenPipeError:
return self._result((b'', None))
- def finish_recv(trans, key, ov):
- try:
- return ov.getresult()
- except OSError as exc:
- if exc.winerror in (_overlapped.ERROR_NETNAME_DELETED,
- _overlapped.ERROR_OPERATION_ABORTED):
- raise ConnectionResetError(*exc.args)
- else:
- raise
-
- return self._register(ov, conn, finish_recv)
+ return self._register(ov, conn, self.finish_socket_func)
def recvfrom_into(self, conn, buf, flags=0):
self._register_with_iocp(conn)
@@ -538,17 +519,7 @@ class IocpProactor:
ov.WSASendTo(conn.fileno(), buf, flags, addr)
- def finish_send(trans, key, ov):
- try:
- return ov.getresult()
- except OSError as exc:
- if exc.winerror in (_overlapped.ERROR_NETNAME_DELETED,
- _overlapped.ERROR_OPERATION_ABORTED):
- raise ConnectionResetError(*exc.args)
- else:
- raise
-
- return self._register(ov, conn, finish_send)
+ return self._register(ov, conn, self.finish_socket_func)
def send(self, conn, buf, flags=0):
self._register_with_iocp(conn)
@@ -558,17 +529,7 @@ class IocpProactor:
else:
ov.WriteFile(conn.fileno(), buf)
- def finish_send(trans, key, ov):
- try:
- return ov.getresult()
- except OSError as exc:
- if exc.winerror in (_overlapped.ERROR_NETNAME_DELETED,
- _overlapped.ERROR_OPERATION_ABORTED):
- raise ConnectionResetError(*exc.args)
- else:
- raise
-
- return self._register(ov, conn, finish_send)
+ return self._register(ov, conn, self.finish_socket_func)
def accept(self, listener):
self._register_with_iocp(listener)
@@ -639,16 +600,7 @@ class IocpProactor:
offset_low, offset_high,
count, 0, 0)
- def finish_sendfile(trans, key, ov):
- try:
- return ov.getresult()
- except OSError as exc:
- if exc.winerror in (_overlapped.ERROR_NETNAME_DELETED,
- _overlapped.ERROR_OPERATION_ABORTED):
- raise ConnectionResetError(*exc.args)
- else:
- raise
- return self._register(ov, sock, finish_sendfile)
+ return self._register(ov, sock, self.finish_socket_func)
def accept_pipe(self, pipe):
self._register_with_iocp(pipe)