[pypy-commit] pypy winoverlapped: Fixed remaining tests in test_windows_events.py.

andrewjlawrence pypy.commits at gmail.com
Sat Mar 16 13:16:42 EDT 2019


Author: andrewjlawrence
Branch: winoverlapped
Changeset: r96328:c0aff3718043
Date: 2019-03-16 17:14 +0000
http://bitbucket.org/pypy/pypy/changeset/c0aff3718043/

Log:	Fixed remaining tests in test_windows_events.py. Added the
	overlapped class back into _winapi which was wrongly removed from
	there. For some reason cpython has two copies of the overlapped
	class.

diff --git a/lib_pypy/_overlapped.py b/lib_pypy/_overlapped.py
--- a/lib_pypy/_overlapped.py
+++ b/lib_pypy/_overlapped.py
@@ -24,6 +24,7 @@
 #
 # Error Codes
 #
+ERROR_IO_PENDING = 997
 ERROR_PIPE_BUSY = 231
 ERROR_NETNAME_DELETED = 64
 #
@@ -68,13 +69,15 @@
         self.write_buffer = None
 
         self.type = OverlappedType.TYPE_NONE
-        if event == INVALID_HANDLE_VALUE or not event: 
+        if event == _int2handle(INVALID_HANDLE_VALUE) or not event: 
             event = _kernel32.CreateEventW(NULL, True, False, NULL)
             if event == _winapi.NULL:
                 raise _winapi._WinError()
         
         if event:
             self.overlapped[0].hEvent = event
+        else:
+            raise _winapi._WinError()
                 
         if self.overlapped[0].hEvent == _ffi.NULL: 
              raise _winapi._WinError()
@@ -254,7 +257,7 @@
     
     @property
     def address(self):
-        return _ffi.addressof(self.overlapped[0])
+        return self.overlapped
 
 
 def SetEvent(handle):
@@ -292,7 +295,7 @@
 
 def GetQueuedCompletionStatus(completionport, milliseconds):
     numberofbytes = _ffi.new('DWORD[1]', [0])
-    completionkey  = _ffi.new('ULONG**', _ffi.NULL)
+    completionkey  = _ffi.new('ULONG**')
 
     if completionport is None:
         raise _winapi._WinError()
@@ -313,27 +316,32 @@
             return None
         return SetFromWindowsErr(err)
 
-    return (err, numberofbytes, completionkey[0], _ffi.addressof(overlapped[0][0]))
+    return (err, numberofbytes, _handle2int(completionkey[0]), _ffi.addressof(overlapped[0][0]))
 
- at _ffi.callback("void(void*, bool)")
+ at _ffi.callback("void(void*, int)")
 def post_to_queue_callback(lpparameter, timerorwaitfired):
     pdata = _ffi.cast("PostCallbackData *", lpparameter)
-    _kernel32.PostQueuedCompletionStatus(pdata.hCompletionPort, timerorwaitfired, _ffi.cast("ULONG_PTR",0), pdata.Overlapped)
+    ret = _kernel32.PostQueuedCompletionStatus(pdata.hCompletionPort, timerorwaitfired, _ffi.cast("ULONG_PTR",0), pdata.Overlapped)
+    result = False
+#    if not ret:
+#         err = _winapi._WinError()
 
 
 def RegisterWaitWithQueue(object, completionport, ovaddress, miliseconds):
-    data = _ffi.new('PostCallbackData[1]')
-    newwaitobject = _ffi.new("HANDLE[1]")
+    data = _ffi.new('PostCallbackData*')
+    newwaitobject = _ffi.new("HANDLE*")
     data[0].hCompletionPort = completionport
-    data[0].Overlapped = _ffi.new("OVERLAPPED *",ovaddress[0])
-    success = _kernel32.RegisterWaitForSingleObject(newwaitobject,
-                                                    object,
-                                                    _ffi.cast("WAITORTIMERCALLBACK",post_to_queue_callback),
-                                                    data,
-                                                    miliseconds, 
-                                                    _kernel32.WT_EXECUTEINWAITTHREAD | _kernel32.WT_EXECUTEONLYONCE)
+    data[0].Overlapped = ovaddress
+    ret = _kernel32.RegisterWaitForSingleObject(newwaitobject,
+                                                object,
+                                                _ffi.cast("WAITORTIMERCALLBACK",post_to_queue_callback),
+                                                data,
+                                                miliseconds, 
+                                                _kernel32.WT_EXECUTEINWAITTHREAD | _kernel32.WT_EXECUTEONLYONCE)
+    if not ret:
+        raise _winapi._WinError()
     
-    return newwaitobject
+    return _handle2int(newwaitobject[0])
 
 def ConnectPipe(address):
     err = _winapi.ERROR_PIPE_BUSY
@@ -352,14 +360,22 @@
         
     return _handle2int(handle)
 
-#def UnregisterWaitEx(handle, event):
-#    waithandle = _int2handle(handle)
-#    waitevent = _int2handle(event)
-#   
-#    ret = _kernel32.UnregisterWaitEx(handle, event)
-#    
-#    if not ret:
-#        raise _winapi.WinError()
+def UnregisterWaitEx(handle, event):
+    waithandle = _int2handle(handle)
+    waitevent = _int2handle(event)
+    
+    ret = _kernel32.UnregisterWaitEx(waithandle, waitevent)
+    
+    if not ret:
+        raise _winapi._WinError()
+
+def UnregisterWait(handle):
+    handle = _int2handle(handle)
+    
+    ret = _kernel32.UnregisterWait(handle)
+    
+    if not ret:
+        raise _winapi._WinError()
 
 # In CPython this function converts a windows error into a python object
 # Not sure what we should do here.
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
@@ -140,6 +140,7 @@
 BOOL WINAPI RegisterWaitForSingleObject(PHANDLE, HANDLE, WAITORTIMERCALLBACK, PVOID, ULONG, ULONG);
 BOOL WINAPI PostQueuedCompletionStatus(HANDLE,  DWORD, ULONG_PTR, LPOVERLAPPED);
 BOOL WINAPI UnregisterWaitEx(HANDLE, HANDLE);
+BOOL WINAPI UnregisterWait(HANDLE);
 
 BOOL WINAPI GetQueuedCompletionStatus(HANDLE, LPDWORD, ULONG**, LPOVERLAPPED*, DWORD);
 HANDLE WINAPI CreateIoCompletionPort(HANDLE, HANDLE, ULONG_PTR, DWORD);
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\xFB\x03\x00\x00\x11\x11\x00\x00\x0A\x01\x00\x00\x13\x03\x00\x00\xEE\x03\x00\x00\x00\x0F\x00\x00\x01\x0D\x00\x00\x00\x0F\x00\x00\x01\x0D\x00\x00\xF5\x03\x00\x00\x1A\x11\x00\x00\x11\x11\x00\x00\x11\x11\x00\x00\x07\x01\x00\x00\x0A\x01\x00\x00\x1A\x11\x00\x00\x1A\x11\x00\x00\xF3\x03\x00\x00\xEF\x03\x00\x00\x02\x0F\x00\x00\x01\x0D\x00\x00\x11\x03\x00\x00\x26\x11\x00\x00\x11\x11\x00\x00\x0A\x01\x00\x00\x02\x0F\x00\x00\x01\x0D\x00\x00\x26\x11\x00\x00\x11\x11\x00\x00\xEA\x03\x00\x00\x11\x11\x00\x00\x0A\x01\x00\x00\x0A\x01\x00\x00\x02\x0F\x00\x00\x01\x0D\x00\x00\x11\x11\x00\x00\x02\x0F\x00\x00\x01\x0D\x00\x00\x11\x11\x00\x00\x15\x11\x00\x00\x02\x0F\x00\x00\x01\x0D\x00\x00\x11\x11\x00\x00\x15\x11\x00\x00\x14\x11\x00\x00\x07\x01\x00\x00\x02\x0F\x00\x00\x01\x0D\x00\x00\x11\x11\x00\x00\x15\x11\x00\x00\x0A\x01\x00\x00\x0A\x01\x00\x00\x02\x0F\x00\x00\x01\x0D\x00\x00\x11\x11\x00\x00\xF4\x03\x00\x00\x0A\x01\x00\x00\x14\x11\x00\x00\x14\x11\x00\x00\x15\x11\x00\x00\xE5\x03\x00\x00\x02\x0F\x00\x00\x01\x0D\x00\x00\x11\x11\x00\x00\x08\x01\x00\x00\x02\x0F\x00\x00\x01\x0D\x00\x00\x11\x11\x00\x00\x14\x11\x00\x00\x02\x0F\x00\x00\x01\x0D\x00\x00\x11\x11\x00\x00\x14\x11\x00\x00\x14\x03\x00\x00\x15\x03\x00\x00\x0A\x01\x00\x00\x02\x0F\x00\x00\x01\x0D\x00\x00\x11\x11\x00\x00\x14\x11\x00\x00\x14\x11\x00\x00\x14\x11\x00\x00\x02\x0F\x00\x00\x01\x0D\x00\x00\x11\x11\x00\x00\x0A\x01\x00\x00\x0A\x01\x00\x00\x15\x11\x00\x00\x02\x0F\x00\x00\x01\x0D\x00\x00\x11\x11\x00\x00\x11\x11\x00\x00\x02\x0F\x00\x00\x01\x0D\x00\x00\x11\x11\x00\x00\x11\x11\x00\x00\x11\x11\x00\x00\x26\x11\x00\x00\x0A\x01\x00\x00\x07\x01\x00\x00\x0A\x01\x00\x00\x02\x0F\x00\x00\x01\x0D\x00\x00\x11\x11\x00\x00\xFB\x03\x00\x00\x0A\x01\x00\x00\x14\x11\x00\x00\x15\x11\x00\x00\x02\x0F\x00\x00\x01\x0D\x00\x00\xA1\x03\x00\x00\x7F\x11\x00\x00\x11\x11\x00\x00\x11\x11\x00\x00\x07\x01\x00\x00\x0A\x01\x00\x00\x7F\x11\x00\x00\x7F\x11\x00\x00\x22\x11\x00\x00\x23\x11\x00\x00\x02\x0F\x00\x00\x0D\x0D\x00\x00\x07\x01\x00\x00\x00\x0F\x00\x00\x51\x0D\x00\x00\x08\x01\x00\x00\x02\x0F\x00\x00\x13\x0D\x00\x00\x11\x11\x00\x00\x0A\x01\x00\x00\x02\x0F\x00\x00\x13\x0D\x00\x00\x11\x11\x00\x00\x7F\x11\x00\x00\x0A\x01\x00\x00\x02\x0F\x00\x00\x13\x0D\x00\x00\x02\x0F\x00\x00\x9C\x0D\x00\x00\x06\x01\x00\x00\x00\x0F\x00\x00\x9C\x0D\x00\x00\x00\x0F\x00\x00\x9C\x0D\x00\x00\x10\x01\x00\x00\x00\x0F\x00\x00\x11\x0D\x00\x00\xF2\x03\x00\x00\x07\x01\x00\x00\x07\x01\x00\x00\xF5\x03\x00\x00\x02\x0F\x00\x00\x11\x0D\x00\x00\xA4\x11\x00\x00\x07\x01\x00\x00\x07\x01\x00\x00\xA1\x03\x00\x00\x02\x0F\x00\x00\x11\x0D\x00\x00\xA7\x11\x00\x00\x0A\x01\x00\x00\x0A\x01\x00\x00\xA4\x11\x00\x00\x0A\x01\x00\x00\x0A\x01\x00\x00\x11\x11\x00\x00\x02\x0F\x00\x00\x11\x0D\x00\x00\xA7\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\xA4\x11\x00\x00\x02\x0F\x00\x00\x11\x0D\x00\x00\x07\x01\x00\x00\x07\x01\x00\x00\x07\x01\x00\x00\x02\x0F\x00\x00\x11\x0D\x00\x00\x0A\x01\x00\x00\x02\x0F\x00\x00\x11\x0D\x00\x00\x11\x11\x00\x00\x11\x11\x00\x00\x0A\x01\x00\x00\x0A\x01\x00\x00\x02\x0F\x00\x00\x11\x0D\x00\x00\x02\x0F\x00\x00\x11\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\xA4\x11\x00\x00\x02\x0F\x00\x00\x11\x0D\x00\x00\xAD\x11\x00\x00\x0A\x01\x00\x00\x0A\x01\x00\x00\xA4\x11\x00\x00\x0A\x01\x00\x00\x0A\x01\x00\x00\x11\x11\x00\x00\x02\x0F\x00\x00\xFB\x0D\x00\x00\x0A\x01\x00\x00\x0A\x01\x00\x00\x11\x11\x00\x00\x00\x0F\x00\x00\xFB\x0D\x00\x00\x11\x11\x00\x00\x07\x01\x00\x00\x02\x0F\x00\x00\x04\x09\x00\x00\x02\x09\x00\x00\xF1\x03\x00\x00\x05\x09\x00\x00\x06\x09\x00\x00\x03\x09\x00\x00\x07\x09\x00\x00\x02\x01\x00\x00\x40\x03\x00\x00\x01\x09\x00\x00\x00\x09\x00\x00\xFA\x03\x00\x00\x04\x01\x00\x00\x00\x01',
-    _globals = (b'\x00\x00\x33\x23CancelIo',0,b'\x00\x00\x36\x23CancelIoEx',0,b'\x00\x00\x33\x23CloseHandle',0,b'\x00\x00\x36\x23ConnectNamedPipe',0,b'\x00\x00\xA3\x23CreateEventA',0,b'\x00\x00\xA9\x23CreateEventW',0,b'\x00\x00\xAF\x23CreateFileA',0,b'\x00\x00\xDC\x23CreateFileW',0,b'\x00\x00\xCA\x23CreateIoCompletionPort',0,b'\x00\x00\xB8\x23CreateNamedPipeA',0,b'\x00\x00\xD2\x23CreateNamedPipeW',0,b'\x00\x00\x25\x23CreatePipe',0,b'\x00\x00\x19\x23CreateProcessA',0,b'\x00\x00\x7E\x23CreateProcessW',0,b'\x00\x00\x6E\x23DuplicateHandle',0,b'\x00\x00\xD0\x23GetCurrentProcess',0,b'\x00\x00\x53\x23GetExitCodeProcess',0,b'\x00\x00\x99\x23GetLastError',0,b'\x00\x00\x94\x23GetModuleFileNameW',0,b'\x00\x00\x3A\x23GetOverlappedResult',0,b'\x00\x00\x57\x23GetQueuedCompletionStatus',0,b'\x00\x00\xC7\x23GetStdHandle',0,b'\x00\x00\x99\x23GetVersion',0,b'\x00\x00\x64\x23PostQueuedCompletionStatus',0,b'\x00\x00\x10\x23ReadFile',0,b'\x00\x00\x2B\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_NOOPENFILEERRORBOX',32768,b'\x00\x00\x8D\x23SetErrorMode',0,b'\x00\x00\x33\x23SetEvent',0,b'\x00\x00\x5E\x23SetNamedPipeHandleState',0,b'\x00\x00\x4F\x23TerminateProcess',0,b'\x00\x00\x6A\x23UnregisterWaitEx',0,b'\x00\x00\x46\x23WSARecv',0,b'\xFF\xFF\xFF\x1FWT_EXECUTEINWAITTHREAD',4,b'\xFF\xFF\xFF\x1FWT_EXECUTEONLYONCE',8,b'\x00\x00\x90\x23WaitForSingleObject',0,b'\x00\x00\x77\x23WriteFile',0,b'\x00\x00\x8A\x23_get_osfhandle',0,b'\x00\x00\x17\x23_getch',0,b'\x00\x00\x17\x23_getche',0,b'\x00\x00\x9E\x23_getwch',0,b'\x00\x00\x9E\x23_getwche',0,b'\x00\x00\x17\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\xA0\x23_putwch',0,b'\x00\x00\x03\x23_setmode',0,b'\x00\x00\x00\x23_ungetch',0,b'\x00\x00\x9B\x23_ungetwch',0,b'\x00\x00\xC2\x23socket',0),
+    _globals = (b'\x00\x00\x33\x23CancelIo',0,b'\x00\x00\x36\x23CancelIoEx',0,b'\x00\x00\x33\x23CloseHandle',0,b'\x00\x00\x36\x23ConnectNamedPipe',0,b'\x00\x00\xA3\x23CreateEventA',0,b'\x00\x00\xA9\x23CreateEventW',0,b'\x00\x00\xAF\x23CreateFileA',0,b'\x00\x00\xDC\x23CreateFileW',0,b'\x00\x00\xCA\x23CreateIoCompletionPort',0,b'\x00\x00\xB8\x23CreateNamedPipeA',0,b'\x00\x00\xD2\x23CreateNamedPipeW',0,b'\x00\x00\x25\x23CreatePipe',0,b'\x00\x00\x19\x23CreateProcessA',0,b'\x00\x00\x7E\x23CreateProcessW',0,b'\x00\x00\x6E\x23DuplicateHandle',0,b'\x00\x00\xD0\x23GetCurrentProcess',0,b'\x00\x00\x53\x23GetExitCodeProcess',0,b'\x00\x00\x99\x23GetLastError',0,b'\x00\x00\x94\x23GetModuleFileNameW',0,b'\x00\x00\x3A\x23GetOverlappedResult',0,b'\x00\x00\x57\x23GetQueuedCompletionStatus',0,b'\x00\x00\xC7\x23GetStdHandle',0,b'\x00\x00\x99\x23GetVersion',0,b'\x00\x00\x64\x23PostQueuedCompletionStatus',0,b'\x00\x00\x10\x23ReadFile',0,b'\x00\x00\x2B\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_NOOPENFILEERRORBOX',32768,b'\x00\x00\x8D\x23SetErrorMode',0,b'\x00\x00\x33\x23SetEvent',0,b'\x00\x00\x5E\x23SetNamedPipeHandleState',0,b'\x00\x00\x4F\x23TerminateProcess',0,b'\x00\x00\x33\x23UnregisterWait',0,b'\x00\x00\x6A\x23UnregisterWaitEx',0,b'\x00\x00\x46\x23WSARecv',0,b'\xFF\xFF\xFF\x1FWT_EXECUTEINWAITTHREAD',4,b'\xFF\xFF\xFF\x1FWT_EXECUTEONLYONCE',8,b'\x00\x00\x90\x23WaitForSingleObject',0,b'\x00\x00\x77\x23WriteFile',0,b'\x00\x00\x8A\x23_get_osfhandle',0,b'\x00\x00\x17\x23_getch',0,b'\x00\x00\x17\x23_getche',0,b'\x00\x00\x9E\x23_getwch',0,b'\x00\x00\x9E\x23_getwche',0,b'\x00\x00\x17\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\xA0\x23_putwch',0,b'\x00\x00\x03\x23_setmode',0,b'\x00\x00\x00\x23_ungetch',0,b'\x00\x00\x9B\x23_ungetwch',0,b'\x00\x00\xC2\x23socket',0),
     _struct_unions = ((b'\x00\x00\x00\xF8\x00\x00\x00\x03$1',b'\x00\x00\xF7\x11DUMMYSTRUCTNAME',b'\x00\x00\x11\x11Pointer'),(b'\x00\x00\x00\xF7\x00\x00\x00\x02$2',b'\x00\x00\x13\x11Offset',b'\x00\x00\x13\x11OffsetHigh'),(b'\x00\x00\x00\xEF\x00\x00\x00\x02$PROCESS_INFORMATION',b'\x00\x00\x11\x11hProcess',b'\x00\x00\x11\x11hThread',b'\x00\x00\x13\x11dwProcessId',b'\x00\x00\x13\x11dwThreadId'),(b'\x00\x00\x00\xF3\x00\x00\x00\x02$STARTUPINFO',b'\x00\x00\x13\x11cb',b'\x00\x00\x1A\x11lpReserved',b'\x00\x00\x1A\x11lpDesktop',b'\x00\x00\x1A\x11lpTitle',b'\x00\x00\x13\x11dwX',b'\x00\x00\x13\x11dwY',b'\x00\x00\x13\x11dwXSize',b'\x00\x00\x13\x11dwYSize',b'\x00\x00\x13\x11dwXCountChars',b'\x00\x00\x13\x11dwYCountChars',b'\x00\x00\x13\x11dwFillAttribute',b'\x00\x00\x13\x11dwFlags',b'\x00\x00\x9C\x11wShowWindow',b'\x00\x00\x9C\x11cbReserved2',b'\x00\x00\xF9\x11lpReserved2',b'\x00\x00\x11\x11hStdInput',b'\x00\x00\x11\x11hStdOutput',b'\x00\x00\x11\x11hStdError'),(b'\x00\x00\x00\xEE\x00\x00\x00\x02_OVERLAPPED',b'\x00\x00\x13\x11Internal',b'\x00\x00\x13\x11InternalHigh',b'\x00\x00\xF8\x11DUMMYUNIONNAME',b'\x00\x00\x11\x11hEvent'),(b'\x00\x00\x00\xF1\x00\x00\x00\x02_PostCallbackData',b'\x00\x00\x11\x11hCompletionPort',b'\x00\x00\x15\x11Overlapped'),(b'\x00\x00\x00\xF2\x00\x00\x00\x02_SECURITY_ATTRIBUTES',b'\x00\x00\x13\x11nLength',b'\x00\x00\x11\x11lpSecurityDescriptor',b'\x00\x00\x01\x11bInheritHandle'),(b'\x00\x00\x00\xF4\x00\x00\x00\x02_WSABUF',b'\x00\x00\x13\x11len',b'\x00\x00\x1A\x11buf')),
     _typenames = (b'\x00\x00\x00\xF6LPFN_DISCONNECTEX',b'\x00\x00\x00\x15LPOVERLAPPED',b'\x00\x00\x00\x4DLPOVERLAPPED_COMPLETION_ROUTINE',b'\x00\x00\x00\x23LPPROCESS_INFORMATION',b'\x00\x00\x00\xF0LPPostCallbackData',b'\x00\x00\x00\xA4LPSECURITY_ATTRIBUTES',b'\x00\x00\x00\x22LPSTARTUPINFO',b'\x00\x00\x00\x48LPWSABUF',b'\x00\x00\x00\xEEOVERLAPPED',b'\x00\x00\x00\xEFPROCESS_INFORMATION',b'\x00\x00\x00\xA4PSECURITY_ATTRIBUTES',b'\x00\x00\x00\xF1PostCallbackData',b'\x00\x00\x00\xF2SECURITY_ATTRIBUTES',b'\x00\x00\x00\x11SOCKET',b'\x00\x00\x00\xF3STARTUPINFO',b'\x00\x00\x00\x2EWAITORTIMERCALLBACK',b'\x00\x00\x00\xF4WSABUF',b'\x00\x00\x00\x9Cwint_t'),
 )
diff --git a/lib_pypy/_winapi.py b/lib_pypy/_winapi.py
--- a/lib_pypy/_winapi.py
+++ b/lib_pypy/_winapi.py
@@ -68,6 +68,84 @@
     if not ret:
         raise _WinError()
 
+class Overlapped(object):
+    def __init__(self, handle):
+        self.overlapped = _ffi.new('OVERLAPPED[1]')
+        self.handle = handle
+        self.readbuffer = None
+        self.pending = 0
+        self.completed = 0
+        self.writebuffer = None
+        self.overlapped[0].hEvent = \
+                _kernel32.CreateEventW(NULL, True, False, NULL)
+
+    def __del__(self):
+        # do this somehow else
+        xxx
+        err = _kernel32.GetLastError()
+        bytes = _ffi.new('DWORD[1]')
+        o = overlapped[0]
+        if overlapped[0].pending:
+            if _kernel32.CancelIoEx(o.handle, o.overlapped) & \
+                self.GetOverlappedResult(o.handle, o.overlapped, _ffi.addressof(bytes), True):
+                # The operation is no longer pending, nothing to do
+                pass
+            else:
+                raise RuntimeError('deleting an overlapped struct with a pending operation not supported')
+
+    @property
+    def event(self):
+        return None
+
+    def GetOverlappedResult(self, wait):
+        transferred = _ffi.new('DWORD[1]', [0])
+        res = _kernel32.GetOverlappedResult(self.handle, self.overlapped, transferred, wait != 0)
+        if res:
+            err = ERROR_SUCCESS
+        else:
+            err = GetLastError()
+        if err in (ERROR_SUCCESS, ERROR_MORE_DATA, ERROR_OPERATION_ABORTED):
+            self.completed = 1
+            self.pending = 0
+        elif res == ERROR_IO_INCOMPLETE:
+            pass
+        else:
+            self.pending = 0
+            raise _WinError()
+        if self.completed and self.read_buffer:
+            if transferred != len(self.read_buffer):
+                raise _WinError()
+        return transferred[0], err
+
+    def getbuffer(self):
+        xxx
+        return None
+
+    def cancel(self):
+        xxx
+        return None
+
+ 
+def ConnectNamedPipe(handle, overlapped=False):
+    if overlapped:
+        ov = Overlapped(handle)
+    else:
+        ov = Overlapped(None)
+    success = _kernel32.ConnectNamedPipe(handle, ov.overlapped)
+    if overlapped:
+        # Overlapped ConnectNamedPipe never returns a success code
+        assert success == 0
+        err = _kernel32.GetLastError()
+        if err == ERROR_IO_PENDING:
+            ov.pending = 1
+        elif err == ERROR_PIPE_CONNECTED:
+            _kernel32.SetEvent(ov.overlapped[0].hEvent)
+        else:
+            del ov
+            raise _WinError()
+        return ov
+    elif not success:
+        raise _WinError()
 
 def GetCurrentProcess():
     return _handle2int(_kernel32.GetCurrentProcess())


More information about the pypy-commit mailing list