mirror of
https://github.com/python/cpython.git
synced 2025-10-12 18:02:39 +00:00
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.
This commit is contained in:
parent
c9ed0327a9
commit
b863b9cd4b
2 changed files with 20 additions and 65 deletions
|
@ -446,6 +446,17 @@ class IocpProactor:
|
||||||
fut.set_result(value)
|
fut.set_result(value)
|
||||||
return fut
|
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):
|
def recv(self, conn, nbytes, flags=0):
|
||||||
self._register_with_iocp(conn)
|
self._register_with_iocp(conn)
|
||||||
ov = _overlapped.Overlapped(NULL)
|
ov = _overlapped.Overlapped(NULL)
|
||||||
|
@ -457,17 +468,7 @@ class IocpProactor:
|
||||||
except BrokenPipeError:
|
except BrokenPipeError:
|
||||||
return self._result(b'')
|
return self._result(b'')
|
||||||
|
|
||||||
def finish_recv(trans, key, ov):
|
return self._register(ov, conn, self.finish_socket_func)
|
||||||
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)
|
|
||||||
|
|
||||||
def recv_into(self, conn, buf, flags=0):
|
def recv_into(self, conn, buf, flags=0):
|
||||||
self._register_with_iocp(conn)
|
self._register_with_iocp(conn)
|
||||||
|
@ -480,17 +481,7 @@ class IocpProactor:
|
||||||
except BrokenPipeError:
|
except BrokenPipeError:
|
||||||
return self._result(0)
|
return self._result(0)
|
||||||
|
|
||||||
def finish_recv(trans, key, ov):
|
return self._register(ov, conn, self.finish_socket_func)
|
||||||
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)
|
|
||||||
|
|
||||||
def recvfrom(self, conn, nbytes, flags=0):
|
def recvfrom(self, conn, nbytes, flags=0):
|
||||||
self._register_with_iocp(conn)
|
self._register_with_iocp(conn)
|
||||||
|
@ -500,17 +491,7 @@ class IocpProactor:
|
||||||
except BrokenPipeError:
|
except BrokenPipeError:
|
||||||
return self._result((b'', None))
|
return self._result((b'', None))
|
||||||
|
|
||||||
def finish_recv(trans, key, ov):
|
return self._register(ov, conn, self.finish_socket_func)
|
||||||
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)
|
|
||||||
|
|
||||||
def recvfrom_into(self, conn, buf, flags=0):
|
def recvfrom_into(self, conn, buf, flags=0):
|
||||||
self._register_with_iocp(conn)
|
self._register_with_iocp(conn)
|
||||||
|
@ -538,17 +519,7 @@ class IocpProactor:
|
||||||
|
|
||||||
ov.WSASendTo(conn.fileno(), buf, flags, addr)
|
ov.WSASendTo(conn.fileno(), buf, flags, addr)
|
||||||
|
|
||||||
def finish_send(trans, key, ov):
|
return self._register(ov, conn, self.finish_socket_func)
|
||||||
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)
|
|
||||||
|
|
||||||
def send(self, conn, buf, flags=0):
|
def send(self, conn, buf, flags=0):
|
||||||
self._register_with_iocp(conn)
|
self._register_with_iocp(conn)
|
||||||
|
@ -558,17 +529,7 @@ class IocpProactor:
|
||||||
else:
|
else:
|
||||||
ov.WriteFile(conn.fileno(), buf)
|
ov.WriteFile(conn.fileno(), buf)
|
||||||
|
|
||||||
def finish_send(trans, key, ov):
|
return self._register(ov, conn, self.finish_socket_func)
|
||||||
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)
|
|
||||||
|
|
||||||
def accept(self, listener):
|
def accept(self, listener):
|
||||||
self._register_with_iocp(listener)
|
self._register_with_iocp(listener)
|
||||||
|
@ -639,16 +600,7 @@ class IocpProactor:
|
||||||
offset_low, offset_high,
|
offset_low, offset_high,
|
||||||
count, 0, 0)
|
count, 0, 0)
|
||||||
|
|
||||||
def finish_sendfile(trans, key, ov):
|
return self._register(ov, sock, self.finish_socket_func)
|
||||||
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)
|
|
||||||
|
|
||||||
def accept_pipe(self, pipe):
|
def accept_pipe(self, pipe):
|
||||||
self._register_with_iocp(pipe)
|
self._register_with_iocp(pipe)
|
||||||
|
|
|
@ -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``.
|
Loading…
Add table
Add a link
Reference in a new issue