diff options
author | Andrew Svetlov <andrew.svetlov@gmail.com> | 2018-02-25 19:32:14 +0300 |
---|---|---|
committer | GitHub <noreply@github.com> | 2018-02-25 19:32:14 +0300 |
commit | a19fb3c6aaa7632410d1d9dcb395d7101d124da4 (patch) | |
tree | 476902dc75526cc8bb22c41cf213416384c36805 /Lib/asyncio/windows_events.py | |
parent | 5fb632e83136399bad9427ee23ec8b771695290a (diff) | |
download | cpython-a19fb3c6aaa7632410d1d9dcb395d7101d124da4.tar.gz cpython-a19fb3c6aaa7632410d1d9dcb395d7101d124da4.zip |
bpo-32622: Native sendfile on windows (#5565)
* Support sendfile on Windows Proactor event loop naively.
Diffstat (limited to 'Lib/asyncio/windows_events.py')
-rw-r--r-- | Lib/asyncio/windows_events.py | 22 |
1 files changed, 22 insertions, 0 deletions
diff --git a/Lib/asyncio/windows_events.py b/Lib/asyncio/windows_events.py index f91fcddb2aa..d22edec51ef 100644 --- a/Lib/asyncio/windows_events.py +++ b/Lib/asyncio/windows_events.py @@ -4,6 +4,7 @@ import _overlapped import _winapi import errno import math +import msvcrt import socket import struct import weakref @@ -527,6 +528,27 @@ class IocpProactor: return self._register(ov, conn, finish_connect) + def sendfile(self, sock, file, offset, count): + self._register_with_iocp(sock) + ov = _overlapped.Overlapped(NULL) + offset_low = offset & 0xffff_ffff + offset_high = (offset >> 32) & 0xffff_ffff + ov.TransmitFile(sock.fileno(), + msvcrt.get_osfhandle(file.fileno()), + 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) + def accept_pipe(self, pipe): self._register_with_iocp(pipe) ov = _overlapped.Overlapped(NULL) |