Skip to content

Commit 08df8fc

Browse files
committed
bpo-41246: IOCP Proactor same socket overlapped callbacks
Give the same callback function for when the overlapped operation is done for the functions recv, recv_into, recvfrom, sendto, send and sendfile inside IocpProactor.
1 parent b26a0db commit 08df8fc

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
@@ -437,6 +437,17 @@ def _result(self, value):
437437
fut.set_result(value)
438438
return fut
439439

440+
@staticmethod
441+
def finish_socket_func(trans, key, ov):
442+
try:
443+
return ov.getresult()
444+
except OSError as exc:
445+
if exc.winerror in (_overlapped.ERROR_NETNAME_DELETED,
446+
_overlapped.ERROR_OPERATION_ABORTED):
447+
raise ConnectionResetError(*exc.args)
448+
else:
449+
raise
450+
440451
def recv(self, conn, nbytes, flags=0):
441452
self._register_with_iocp(conn)
442453
ov = _overlapped.Overlapped(NULL)
@@ -448,17 +459,7 @@ def recv(self, conn, nbytes, flags=0):
448459
except BrokenPipeError:
449460
return self._result(b'')
450461

451-
def finish_recv(trans, key, ov):
452-
try:
453-
return ov.getresult()
454-
except OSError as exc:
455-
if exc.winerror in (_overlapped.ERROR_NETNAME_DELETED,
456-
_overlapped.ERROR_OPERATION_ABORTED):
457-
raise ConnectionResetError(*exc.args)
458-
else:
459-
raise
460-
461-
return self._register(ov, conn, finish_recv)
462+
return self._register(ov, conn, self.finish_socket_func)
462463

463464
def recv_into(self, conn, buf, flags=0):
464465
self._register_with_iocp(conn)
@@ -471,17 +472,7 @@ def recv_into(self, conn, buf, flags=0):
471472
except BrokenPipeError:
472473
return self._result(b'')
473474

474-
def finish_recv(trans, key, ov):
475-
try:
476-
return ov.getresult()
477-
except OSError as exc:
478-
if exc.winerror in (_overlapped.ERROR_NETNAME_DELETED,
479-
_overlapped.ERROR_OPERATION_ABORTED):
480-
raise ConnectionResetError(*exc.args)
481-
else:
482-
raise
483-
484-
return self._register(ov, conn, finish_recv)
475+
return self._register(ov, conn, self.finish_socket_func)
485476

486477
def recvfrom(self, conn, nbytes, flags=0):
487478
self._register_with_iocp(conn)
@@ -491,35 +482,15 @@ def recvfrom(self, conn, nbytes, flags=0):
491482
except BrokenPipeError:
492483
return self._result((b'', None))
493484

494-
def finish_recv(trans, key, ov):
495-
try:
496-
return ov.getresult()
497-
except OSError as exc:
498-
if exc.winerror in (_overlapped.ERROR_NETNAME_DELETED,
499-
_overlapped.ERROR_OPERATION_ABORTED):
500-
raise ConnectionResetError(*exc.args)
501-
else:
502-
raise
503-
504-
return self._register(ov, conn, finish_recv)
485+
return self._register(ov, conn, self.finish_socket_func)
505486

506487
def sendto(self, conn, buf, flags=0, addr=None):
507488
self._register_with_iocp(conn)
508489
ov = _overlapped.Overlapped(NULL)
509490

510491
ov.WSASendTo(conn.fileno(), buf, flags, addr)
511492

512-
def finish_send(trans, key, ov):
513-
try:
514-
return ov.getresult()
515-
except OSError as exc:
516-
if exc.winerror in (_overlapped.ERROR_NETNAME_DELETED,
517-
_overlapped.ERROR_OPERATION_ABORTED):
518-
raise ConnectionResetError(*exc.args)
519-
else:
520-
raise
521-
522-
return self._register(ov, conn, finish_send)
493+
return self._register(ov, conn, self.finish_socket_func)
523494

524495
def send(self, conn, buf, flags=0):
525496
self._register_with_iocp(conn)
@@ -529,17 +500,7 @@ def send(self, conn, buf, flags=0):
529500
else:
530501
ov.WriteFile(conn.fileno(), buf)
531502

532-
def finish_send(trans, key, ov):
533-
try:
534-
return ov.getresult()
535-
except OSError as exc:
536-
if exc.winerror in (_overlapped.ERROR_NETNAME_DELETED,
537-
_overlapped.ERROR_OPERATION_ABORTED):
538-
raise ConnectionResetError(*exc.args)
539-
else:
540-
raise
541-
542-
return self._register(ov, conn, finish_send)
503+
return self._register(ov, conn, self.finish_socket_func)
543504

544505
def accept(self, listener):
545506
self._register_with_iocp(listener)
@@ -610,16 +571,7 @@ def sendfile(self, sock, file, offset, count):
610571
offset_low, offset_high,
611572
count, 0, 0)
612573

613-
def finish_sendfile(trans, key, ov):
614-
try:
615-
return ov.getresult()
616-
except OSError as exc:
617-
if exc.winerror in (_overlapped.ERROR_NETNAME_DELETED,
618-
_overlapped.ERROR_OPERATION_ABORTED):
619-
raise ConnectionResetError(*exc.args)
620-
else:
621-
raise
622-
return self._register(ov, sock, finish_sendfile)
574+
return self._register(ov, sock, self.finish_socket_func)
623575

624576
def accept_pipe(self, pipe):
625577
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)