Skip to content

Commit b863b9c

Browse files
authored
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.
1 parent c9ed032 commit b863b9c

File tree

2 files changed

+20
-65
lines changed

2 files changed

+20
-65
lines changed

Lib/asyncio/windows_events.py

+17-65
Original file line numberDiff line numberDiff line change
@@ -446,6 +446,17 @@ def _result(self, value):
446446
fut.set_result(value)
447447
return fut
448448

449+
@staticmethod
450+
def finish_socket_func(trans, key, ov):
451+
try:
452+
return ov.getresult()
453+
except OSError as exc:
454+
if exc.winerror in (_overlapped.ERROR_NETNAME_DELETED,
455+
_overlapped.ERROR_OPERATION_ABORTED):
456+
raise ConnectionResetError(*exc.args)
457+
else:
458+
raise
459+
449460
def recv(self, conn, nbytes, flags=0):
450461
self._register_with_iocp(conn)
451462
ov = _overlapped.Overlapped(NULL)
@@ -457,17 +468,7 @@ def recv(self, conn, nbytes, flags=0):
457468
except BrokenPipeError:
458469
return self._result(b'')
459470

460-
def finish_recv(trans, key, ov):
461-
try:
462-
return ov.getresult()
463-
except OSError as exc:
464-
if exc.winerror in (_overlapped.ERROR_NETNAME_DELETED,
465-
_overlapped.ERROR_OPERATION_ABORTED):
466-
raise ConnectionResetError(*exc.args)
467-
else:
468-
raise
469-
470-
return self._register(ov, conn, finish_recv)
471+
return self._register(ov, conn, self.finish_socket_func)
471472

472473
def recv_into(self, conn, buf, flags=0):
473474
self._register_with_iocp(conn)
@@ -480,17 +481,7 @@ def recv_into(self, conn, buf, flags=0):
480481
except BrokenPipeError:
481482
return self._result(0)
482483

483-
def finish_recv(trans, key, ov):
484-
try:
485-
return ov.getresult()
486-
except OSError as exc:
487-
if exc.winerror in (_overlapped.ERROR_NETNAME_DELETED,
488-
_overlapped.ERROR_OPERATION_ABORTED):
489-
raise ConnectionResetError(*exc.args)
490-
else:
491-
raise
492-
493-
return self._register(ov, conn, finish_recv)
484+
return self._register(ov, conn, self.finish_socket_func)
494485

495486
def recvfrom(self, conn, nbytes, flags=0):
496487
self._register_with_iocp(conn)
@@ -500,17 +491,7 @@ def recvfrom(self, conn, nbytes, flags=0):
500491
except BrokenPipeError:
501492
return self._result((b'', None))
502493

503-
def finish_recv(trans, key, ov):
504-
try:
505-
return ov.getresult()
506-
except OSError as exc:
507-
if exc.winerror in (_overlapped.ERROR_NETNAME_DELETED,
508-
_overlapped.ERROR_OPERATION_ABORTED):
509-
raise ConnectionResetError(*exc.args)
510-
else:
511-
raise
512-
513-
return self._register(ov, conn, finish_recv)
494+
return self._register(ov, conn, self.finish_socket_func)
514495

515496
def recvfrom_into(self, conn, buf, flags=0):
516497
self._register_with_iocp(conn)
@@ -538,17 +519,7 @@ def sendto(self, conn, buf, flags=0, addr=None):
538519

539520
ov.WSASendTo(conn.fileno(), buf, flags, addr)
540521

541-
def finish_send(trans, key, ov):
542-
try:
543-
return ov.getresult()
544-
except OSError as exc:
545-
if exc.winerror in (_overlapped.ERROR_NETNAME_DELETED,
546-
_overlapped.ERROR_OPERATION_ABORTED):
547-
raise ConnectionResetError(*exc.args)
548-
else:
549-
raise
550-
551-
return self._register(ov, conn, finish_send)
522+
return self._register(ov, conn, self.finish_socket_func)
552523

553524
def send(self, conn, buf, flags=0):
554525
self._register_with_iocp(conn)
@@ -558,17 +529,7 @@ def send(self, conn, buf, flags=0):
558529
else:
559530
ov.WriteFile(conn.fileno(), buf)
560531

561-
def finish_send(trans, key, ov):
562-
try:
563-
return ov.getresult()
564-
except OSError as exc:
565-
if exc.winerror in (_overlapped.ERROR_NETNAME_DELETED,
566-
_overlapped.ERROR_OPERATION_ABORTED):
567-
raise ConnectionResetError(*exc.args)
568-
else:
569-
raise
570-
571-
return self._register(ov, conn, finish_send)
532+
return self._register(ov, conn, self.finish_socket_func)
572533

573534
def accept(self, listener):
574535
self._register_with_iocp(listener)
@@ -639,16 +600,7 @@ def sendfile(self, sock, file, offset, count):
639600
offset_low, offset_high,
640601
count, 0, 0)
641602

642-
def finish_sendfile(trans, key, ov):
643-
try:
644-
return ov.getresult()
645-
except OSError as exc:
646-
if exc.winerror in (_overlapped.ERROR_NETNAME_DELETED,
647-
_overlapped.ERROR_OPERATION_ABORTED):
648-
raise ConnectionResetError(*exc.args)
649-
else:
650-
raise
651-
return self._register(ov, sock, finish_sendfile)
603+
return self._register(ov, sock, self.finish_socket_func)
652604

653605
def accept_pipe(self, pipe):
654606
self._register_with_iocp(pipe)
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,3 @@
1+
Give the same callback function for when the overlapped operation is done to
2+
the functions ``recv``, ``recv_into``, ``recvfrom``, ``sendto``, ``send``
3+
and ``sendfile`` inside ``IocpProactor``.

0 commit comments

Comments
 (0)