Skip to content

Navigation Menu

Sign in
Appearance settings

Search code, repositories, users, issues, pull requests...

Provide feedback

We read every piece of feedback, and take your input very seriously.

Saved searches

Use saved searches to filter your results more quickly

Appearance settings

Commit b863b9c

Browse filesBrowse 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
Copy full SHA for b863b9c

File tree

Expand file treeCollapse file tree

2 files changed

+20
-65
lines changed
Filter options
Expand file treeCollapse file tree

2 files changed

+20
-65
lines changed

‎Lib/asyncio/windows_events.py

Copy file name to clipboardExpand all lines: Lib/asyncio/windows_events.py
+17-65Lines changed: 17 additions & 65 deletions
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)
+3Lines changed: 3 additions & 0 deletions
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 (0)
Morty Proxy This is a proxified and sanitized view of the page, visit original site.