]> git.ipfire.org Git - thirdparty/Python/cpython.git/commitdiff
Bpo-41246: IOCP Proactor avoid callback code duplication (#21399) 98272/head
authorTony Solomonik <tony.solomonik@gmail.com>
Thu, 13 Oct 2022 18:05:16 +0000 (21:05 +0300)
committerGitHub <noreply@github.com>
Thu, 13 Oct 2022 18:05:16 +0000 (11:05 -0700)
Use the same callback function for overlapped operations recv, recv_into, recvfrom, sendto, send, and sendfile inside IocpProactor.

Lib/asyncio/windows_events.py
Misc/NEWS.d/next/Library/2020-07-08-20-32-13.bpo-41246.2trYf3.rst [new file with mode: 0644]

index 90b259cbafead236be0a74d4a7512867501338f5..acc97daafecc0b3b2aa4205118202091e7e3b86b 100644 (file)
@@ -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)
diff --git a/Misc/NEWS.d/next/Library/2020-07-08-20-32-13.bpo-41246.2trYf3.rst b/Misc/NEWS.d/next/Library/2020-07-08-20-32-13.bpo-41246.2trYf3.rst
new file mode 100644 (file)
index 0000000..17b884e
--- /dev/null
@@ -0,0 +1,3 @@
+Give the same callback function for when the overlapped operation is done to
+the functions ``recv``, ``recv_into``, ``recvfrom``, ``sendto``, ``send``
+and ``sendfile`` inside ``IocpProactor``.