Author: andrewjlawrence
Branch: winoverlapped
Changeset: r95908:4f3f9908aea9
Date: 2019-02-08 13:39 +0000
http://bitbucket.org/pypy/pypy/changeset/4f3f9908aea9/
Log: added overlapped type and implemented overlapped cancel method
diff --git a/lib_pypy/_overlapped.py b/lib_pypy/_overlapped.py
--- a/lib_pypy/_overlapped.py
+++ b/lib_pypy/_overlapped.py
@@ -20,6 +20,21 @@
from _winapi import INVALID_HANDLE_VALUE, _MAX_PATH , _Z
import _winapi
+from enum import Enum
+class OverlappedType(Enum):
+ TYPE_NONE = 0
+ TYPE_NOT_STARTED = 1
+ TYPE_READ = 2
+ TYPE_READINTO = 3
+ TYPE_WRITE = 4
+ TYPE_ACCEPT = 5
+ TYPE_CONNECT = 6
+ TYPE_DISCONNECT = 7
+ TYPE_CONNECT_NAMED_PIPE = 8
+ TYPE_WAIT_NAMED_PIPE_AND_CONNECT = 9
+ TYPE_TRANSMIT_FILE = 10
+
+
class Overlapped(object):
def __init__(self, handle):
self.overlapped = _ffi.new('OVERLAPPED[1]')
@@ -28,6 +43,7 @@
self.pending = 0
self.completed = 0
self.writebuffer = None
+ self.type = OverlappedType.TYPE_NONE
self.overlapped[0].hEvent = \
_kernel32.CreateEventW(NULL, True, False, NULL)
self.address = _ffi.addressof(self.overlapped)
@@ -48,7 +64,7 @@
@property
def event(self):
- return None
+ return self.overlapped[0].hEvent
def GetOverlappedResult(self, wait):
transferred = _ffi.new('DWORD[1]', [0])
@@ -75,8 +91,13 @@
return None
def cancel(self):
- xxx
- return None
+ result = true
+ if self.type == OverlappedType.TYPE_NOT_STARTED or
OverlappedType.TYPE_WAIT_NAMED_PIPE_AND_CONNECT:
+ return None
+ if not _kernel32.HasOverlappedIoCompleted(self.overlapped):
+ ### If we are to support xp we will need to dynamically load the
below method
+ _kernel32.CancelIoEx(self.handle, self.overlapped)
+ return result
def CreateEvent(eventattributes, manualreset, initialstate, name):
@@ -117,7 +138,7 @@
@_ffi.callback("void(void*, bool)")
def post_to_queue_callback(lpparameter, timerorwaitfired):
pdata = _ffi.cast("PostCallbackData *", lpparameter)
- _kernel32.PostQueuedCompletionStatus(pdata.hCompletionPort,
timeorwaitfired, 0, pdata.Overlapped)
+ _kernel32.PostQueuedCompletionStatus(pdata.hCompletionPort,
timerorwaitfired, 0, pdata.Overlapped)
def RegisterWaitWithQueue(object, completionport, ovaddress, miliseconds):
@@ -133,4 +154,4 @@
miliseconds,
_kernel32.WT_EXECUTEINWAITTHREAD | _kernel32.WT_EXECUTEONLYONCE)
- return None
+ return newwaitobject
diff --git a/lib_pypy/_pypy_winbase_build.py b/lib_pypy/_pypy_winbase_build.py
--- a/lib_pypy/_pypy_winbase_build.py
+++ b/lib_pypy/_pypy_winbase_build.py
@@ -106,6 +106,7 @@
HANDLE WINAPI CreateEventA(LPSECURITY_ATTRIBUTES, BOOL, BOOL, LPCSTR);
HANDLE WINAPI CreateEventW(LPSECURITY_ATTRIBUTES, BOOL, BOOL, LPCWSTR);
VOID WINAPI SetEvent(HANDLE);
+BOOL WINAPI CancelIo(HANDLE);
BOOL WINAPI CancelIoEx(HANDLE, LPOVERLAPPED);
BOOL WINAPI CloseHandle(HANDLE);
DWORD WINAPI GetLastError(VOID);
@@ -130,19 +131,18 @@
#define SEM_NOALIGNMENTFAULTEXCEPT 0x0004
#define SEM_NOOPENFILEERRORBOX 0x8000
-
typedef struct _PostCallbackData {
HANDLE hCompletionPort;
LPOVERLAPPED Overlapped;
} PostCallbackData, *LPPostCallbackData;
-
typedef VOID (WINAPI *WAITORTIMERCALLBACK) ( PVOID, BOOL);
BOOL WINAPI RegisterWaitForSingleObject(PHANDLE, HANDLE, WAITORTIMERCALLBACK,
PVOID, ULONG, ULONG);
BOOL WINAPI PostQueuedCompletionStatus(HANDLE, DWORD, ULONG_PTR,
LPOVERLAPPED);
#define WT_EXECUTEINWAITTHREAD 0x00000004
#define WT_EXECUTEONLYONCE 0x00000008
+
""")
# --------------------
diff --git a/lib_pypy/_pypy_winbase_cffi.py b/lib_pypy/_pypy_winbase_cffi.py
--- a/lib_pypy/_pypy_winbase_cffi.py
+++ b/lib_pypy/_pypy_winbase_cffi.py
@@ -4,7 +4,7 @@
ffi = _cffi_backend.FFI('_pypy_winbase_cffi',
_version = 0x2601,
_types =
b'\x00\x00\x01\x0D\x00\x00\x07\x01\x00\x00\x00\x0F\x00\x00\x01\x0D\x00\x00\x07\x01\x00\x00\x07\x01\x00\x00\x00\x0F\x00\x00\x01\x0D\x00\x00\x07\x01\x00\x00\x07\x01\x00\x00\x09\x01\x00\x00\x00\x0F\x00\x00\x01\x0D\x00\x00\x19\x01\x00\x00\x07\x01\x00\x00\x00\x0F\x00\x00\x01\x0D\x00\x00\x00\x0F\x00\x00\x01\x0D\x00\x00\xBF\x03\x00\x00\x13\x11\x00\x00\xC4\x03\x00\x00\x15\x11\x00\x00\x07\x01\x00\x00\x0A\x01\x00\x00\x13\x11\x00\x00\x13\x11\x00\x00\xBE\x03\x00\x00\xBA\x03\x00\x00\x02\x0F\x00\x00\x01\x0D\x00\x00\x15\x03\x00\x00\x1F\x11\x00\x00\x15\x11\x00\x00\x0A\x01\x00\x00\x02\x0F\x00\x00\x01\x0D\x00\x00\x1F\x11\x00\x00\x15\x11\x00\x00\xB5\x03\x00\x00\x15\x11\x00\x00\x0A\x01\x00\x00\x0A\x01\x00\x00\x02\x0F\x00\x00\x01\x0D\x00\x00\x15\x11\x00\x00\x02\x0F\x00\x00\x01\x0D\x00\x00\x15\x11\x00\x00\xB9\x03\x00\x00\x02\x0F\x00\x00\x01\x0D\x00\x00\x15\x11\x00\x00\x31\x11\x00\x00\x18\x03\x00\x00\x07\x01\x00\x00\x02\x0F\x00\x00\x01\x0D\x00\x00\x15\x11\x00\x00\x08\x01\x00\x00\x02\x0F\x00\x
00\x01\x0D\x00\x00\x15\x11\x00\x00\x36\x11\x00\x00\x02\x0F\x00\x00\x01\x0D\x00\x00\x15\x11\x00\x00\x36\x11\x00\x00\x36\x11\x00\x00\x36\x11\x00\x00\x02\x0F\x00\x00\x01\x0D\x00\x00\x15\x11\x00\x00\x0A\x01\x00\x00\x0A\x01\x00\x00\x31\x11\x00\x00\x02\x0F\x00\x00\x01\x0D\x00\x00\x15\x11\x00\x00\x15\x11\x00\x00\x15\x11\x00\x00\x1F\x11\x00\x00\x0A\x01\x00\x00\x07\x01\x00\x00\x0A\x01\x00\x00\x02\x0F\x00\x00\x01\x0D\x00\x00\x79\x03\x00\x00\x57\x11\x00\x00\x15\x11\x00\x00\x15\x11\x00\x00\x07\x01\x00\x00\x0A\x01\x00\x00\x57\x11\x00\x00\x57\x11\x00\x00\x1B\x11\x00\x00\x1C\x11\x00\x00\x02\x0F\x00\x00\x0D\x0D\x00\x00\x07\x01\x00\x00\x00\x0F\x00\x00\x3B\x0D\x00\x00\x08\x01\x00\x00\x02\x0F\x00\x00\x18\x0D\x00\x00\x15\x11\x00\x00\x0A\x01\x00\x00\x02\x0F\x00\x00\x18\x0D\x00\x00\x15\x11\x00\x00\x57\x11\x00\x00\x0A\x01\x00\x00\x02\x0F\x00\x00\x18\x0D\x00\x00\x02\x0F\x00\x00\x74\x0D\x00\x00\x06\x01\x00\x00\x00\x0F\x00\x00\x74\x0D\x00\x00\x00\x0F\x00\x00\x74\x0D\x00\x00\x10\x01\x00\x00\x00\x0F\x00\x00\x1
5\x0D\x00\x00\xBD\x03\x00\x00\x07\x01\x00\x00\x07\x01\x00\x00\xBF\x03\x00\x00\x02\x0F\x00\x00\x15\x0D\x00\x00\x7C\x11\x00\x00\x07\x01\x00\x00\x07\x01\x00\x00\x79\x03\x00\x00\x02\x0F\x00\x00\x15\x0D\x00\x00\x7F\x11\x00\x00\x0A\x01\x00\x00\x0A\x01\x00\x00\x7C\x11\x00\x00\x0A\x01\x00\x00\x0A\x01\x00\x00\x15\x11\x00\x00\x02\x0F\x00\x00\x15\x0D\x00\x00\x7F\x11\x00\x00\x0A\x01\x00\x00\x0A\x01\x00\x00\x0A\x01\x00\x00\x0A\x01\x00\x00\x0A\x01\x00\x00\x0A\x01\x00\x00\x7C\x11\x00\x00\x02\x0F\x00\x00\x15\x0D\x00\x00\x0A\x01\x00\x00\x02\x0F\x00\x00\x15\x0D\x00\x00\x02\x0F\x00\x00\x15\x0D\x00\x00\x57\x11\x00\x00\x0A\x01\x00\x00\x0A\x01\x00\x00\x0A\x01\x00\x00\x0A\x01\x00\x00\x0A\x01\x00\x00\x0A\x01\x00\x00\x7C\x11\x00\x00\x02\x0F\x00\x00\x15\x0D\x00\x00\x85\x11\x00\x00\x0A\x01\x00\x00\x0A\x01\x00\x00\x7C\x11\x00\x00\x0A\x01\x00\x00\x0A\x01\x00\x00\x15\x11\x00\x00\x02\x0F\x00\x00\xC4\x0D\x00\x00\x15\x11\x00\x00\x02\x0F\x00\x00\xC4\x0D\x00\x00\x15\x11\x00\x00\x07\x01\x00\x00\x02\x0F\x00\x00\x04\x09
\x00\x00\x02\x09\x00\x00\xBC\x03\x00\x00\x05\x09\x00\x00\x06\x09\x00\x00\x03\x09\x00\x00\x02\x01\x00\x00\x01\x09\x00\x00\x00\x09\x00\x00\xC3\x03\x00\x00\x04\x01\x00\x00\x00\x01',
- _globals =
(b'\x00\x00\x2F\x23CancelIoEx',0,b'\x00\x00\x2C\x23CloseHandle',0,b'\x00\x00\x2F\x23ConnectNamedPipe',0,b'\x00\x00\x7B\x23CreateEventA',0,b'\x00\x00\x81\x23CreateEventW',0,b'\x00\x00\x87\x23CreateFileA',0,b'\x00\x00\xA9\x23CreateFileW',0,b'\x00\x00\x90\x23CreateNamedPipeA',0,b'\x00\x00\x9F\x23CreateNamedPipeW',0,b'\x00\x00\x1E\x23CreatePipe',0,b'\x00\x00\x12\x23CreateProcessA',0,b'\x00\x00\x56\x23CreateProcessW',0,b'\x00\x00\x4D\x23DuplicateHandle',0,b'\x00\x00\x9D\x23GetCurrentProcess',0,b'\x00\x00\x3D\x23GetExitCodeProcess',0,b'\x00\x00\x71\x23GetLastError',0,b'\x00\x00\x6C\x23GetModuleFileNameW',0,b'\x00\x00\x33\x23GetOverlappedResult',0,b'\x00\x00\x9A\x23GetStdHandle',0,b'\x00\x00\x71\x23GetVersion',0,b'\x00\x00\x47\x23PostQueuedCompletionStatus',0,b'\x00\x00\x24\x23RegisterWaitForSingleObject',0,b'\xFF\xFF\xFF\x1FSEM_FAILCRITICALERRORS',1,b'\xFF\xFF\xFF\x1FSEM_NOALIGNMENTFAULTEXCEPT',4,b'\xFF\xFF\xFF\x1FSEM_NOGPFAULTERRORBOX',2,b'\xFF\xFF\xFF\x1FSEM_NOOPENFILEERR
ORBOX',32768,b'\x00\x00\x65\x23SetErrorMode',0,b'\x00\x00\xB2\x23SetEvent',0,b'\x00\x00\x41\x23SetNamedPipeHandleState',0,b'\x00\x00\x39\x23TerminateProcess',0,b'\xFF\xFF\xFF\x1FWT_EXECUTEINWAITTHREAD',4,b'\xFF\xFF\xFF\x1FWT_EXECUTEONLYONCE',8,b'\x00\x00\x68\x23WaitForSingleObject',0,b'\x00\x00\x62\x23_get_osfhandle',0,b'\x00\x00\x10\x23_getch',0,b'\x00\x00\x10\x23_getche',0,b'\x00\x00\x76\x23_getwch',0,b'\x00\x00\x76\x23_getwche',0,b'\x00\x00\x10\x23_kbhit',0,b'\x00\x00\x07\x23_locking',0,b'\x00\x00\x0C\x23_open_osfhandle',0,b'\x00\x00\x00\x23_putch',0,b'\x00\x00\x78\x23_putwch',0,b'\x00\x00\x03\x23_setmode',0,b'\x00\x00\x00\x23_ungetch',0,b'\x00\x00\x73\x23_ungetwch',0),
+ _globals =
(b'\x00\x00\x2C\x23CancelIo',0,b'\x00\x00\x2F\x23CancelIoEx',0,b'\x00\x00\x2C\x23CloseHandle',0,b'\x00\x00\x2F\x23ConnectNamedPipe',0,b'\x00\x00\x7B\x23CreateEventA',0,b'\x00\x00\x81\x23CreateEventW',0,b'\x00\x00\x87\x23CreateFileA',0,b'\x00\x00\xA9\x23CreateFileW',0,b'\x00\x00\x90\x23CreateNamedPipeA',0,b'\x00\x00\x9F\x23CreateNamedPipeW',0,b'\x00\x00\x1E\x23CreatePipe',0,b'\x00\x00\x12\x23CreateProcessA',0,b'\x00\x00\x56\x23CreateProcessW',0,b'\x00\x00\x4D\x23DuplicateHandle',0,b'\x00\x00\x9D\x23GetCurrentProcess',0,b'\x00\x00\x3D\x23GetExitCodeProcess',0,b'\x00\x00\x71\x23GetLastError',0,b'\x00\x00\x6C\x23GetModuleFileNameW',0,b'\x00\x00\x33\x23GetOverlappedResult',0,b'\x00\x00\x9A\x23GetStdHandle',0,b'\x00\x00\x71\x23GetVersion',0,b'\x00\x00\x47\x23PostQueuedCompletionStatus',0,b'\x00\x00\x24\x23RegisterWaitForSingleObject',0,b'\xFF\xFF\xFF\x1FSEM_FAILCRITICALERRORS',1,b'\xFF\xFF\xFF\x1FSEM_NOALIGNMENTFAULTEXCEPT',4,b'\xFF\xFF\xFF\x1FSEM_NOGPFAULTERRORBOX',2,b'\xF
F\xFF\xFF\x1FSEM_NOOPENFILEERRORBOX',32768,b'\x00\x00\x65\x23SetErrorMode',0,b'\x00\x00\xB2\x23SetEvent',0,b'\x00\x00\x41\x23SetNamedPipeHandleState',0,b'\x00\x00\x39\x23TerminateProcess',0,b'\xFF\xFF\xFF\x1FWT_EXECUTEINWAITTHREAD',4,b'\xFF\xFF\xFF\x1FWT_EXECUTEONLYONCE',8,b'\x00\x00\x68\x23WaitForSingleObject',0,b'\x00\x00\x62\x23_get_osfhandle',0,b'\x00\x00\x10\x23_getch',0,b'\x00\x00\x10\x23_getche',0,b'\x00\x00\x76\x23_getwch',0,b'\x00\x00\x76\x23_getwche',0,b'\x00\x00\x10\x23_kbhit',0,b'\x00\x00\x07\x23_locking',0,b'\x00\x00\x0C\x23_open_osfhandle',0,b'\x00\x00\x00\x23_putch',0,b'\x00\x00\x78\x23_putwch',0,b'\x00\x00\x03\x23_setmode',0,b'\x00\x00\x00\x23_ungetch',0,b'\x00\x00\x73\x23_ungetwch',0),
_struct_unions =
((b'\x00\x00\x00\xC1\x00\x00\x00\x03$1',b'\x00\x00\xC0\x11DUMMYSTRUCTNAME',b'\x00\x00\x15\x11Pointer'),(b'\x00\x00\x00\xC0\x00\x00\x00\x02$2',b'\x00\x00\x18\x11Offset',b'\x00\x00\x18\x11OffsetHigh'),(b'\x00\x00\x00\xBA\x00\x00\x00\x02$PROCESS_INFORMATION',b'\x00\x00\x15\x11hProcess',b'\x00\x00\x15\x11hThread',b'\x00\x00\x18\x11dwProcessId',b'\x00\x00\x18\x11dwThreadId'),(b'\x00\x00\x00\xBE\x00\x00\x00\x02$STARTUPINFO',b'\x00\x00\x18\x11cb',b'\x00\x00\x13\x11lpReserved',b'\x00\x00\x13\x11lpDesktop',b'\x00\x00\x13\x11lpTitle',b'\x00\x00\x18\x11dwX',b'\x00\x00\x18\x11dwY',b'\x00\x00\x18\x11dwXSize',b'\x00\x00\x18\x11dwYSize',b'\x00\x00\x18\x11dwXCountChars',b'\x00\x00\x18\x11dwYCountChars',b'\x00\x00\x18\x11dwFillAttribute',b'\x00\x00\x18\x11dwFlags',b'\x00\x00\x74\x11wShowWindow',b'\x00\x00\x74\x11cbReserved2',b'\x00\x00\xC2\x11lpReserved2',b'\x00\x00\x15\x11hStdInput',b'\x00\x00\x15\x11hStdOutput',b'\x00\x00\x15\x11hStdError'),(b'\x00\x00\x00\xB9\x00\x00\x00\x02_
OVERLAPPED',b'\x00\x00\x18\x11Internal',b'\x00\x00\x18\x11InternalHigh',b'\x00\x00\xC1\x11DUMMYUNIONNAME',b'\x00\x00\x15\x11hEvent'),(b'\x00\x00\x00\xBC\x00\x00\x00\x02_PostCallbackData',b'\x00\x00\x15\x11hCompletionPort',b'\x00\x00\x31\x11Overlapped'),(b'\x00\x00\x00\xBD\x00\x00\x00\x02_SECURITY_ATTRIBUTES',b'\x00\x00\x18\x11nLength',b'\x00\x00\x15\x11lpSecurityDescriptor',b'\x00\x00\x01\x11bInheritHandle')),
_typenames =
(b'\x00\x00\x00\x31LPOVERLAPPED',b'\x00\x00\x00\x1CLPPROCESS_INFORMATION',b'\x00\x00\x00\xBBLPPostCallbackData',b'\x00\x00\x00\x7CLPSECURITY_ATTRIBUTES',b'\x00\x00\x00\x1BLPSTARTUPINFO',b'\x00\x00\x00\xB9OVERLAPPED',b'\x00\x00\x00\xBAPROCESS_INFORMATION',b'\x00\x00\x00\x7CPSECURITY_ATTRIBUTES',b'\x00\x00\x00\xBCPostCallbackData',b'\x00\x00\x00\xBDSECURITY_ATTRIBUTES',b'\x00\x00\x00\xBESTARTUPINFO',b'\x00\x00\x00\x27WAITORTIMERCALLBACK',b'\x00\x00\x00\x74wint_t'),
)
_______________________________________________
pypy-commit mailing list
[email protected]
https://mail.python.org/mailman/listinfo/pypy-commit