Author: andrewjlawrence
Branch: winoverlapped
Changeset: r96329:3e255039d4dc
Date: 2019-03-16 18:21 +0000
http://bitbucket.org/pypy/pypy/changeset/3e255039d4dc/

Log:    Set error on overlapped object and added wait for multiple objects.

diff --git a/lib_pypy/_overlapped.py b/lib_pypy/_overlapped.py
--- a/lib_pypy/_overlapped.py
+++ b/lib_pypy/_overlapped.py
@@ -62,11 +62,12 @@
     TYPE_TRANSMIT_FILE = 10
 
 class Overlapped(object):
-    def __init__(self, event):
+    def __init__(self, event=_ffi.NULL):
         self.overlapped = _ffi.new('OVERLAPPED[1]')
         self.handle = _ffi.NULL
         self.read_buffer = None
         self.write_buffer = None
+        self.error = 0
 
         self.type = OverlappedType.TYPE_NONE
         if event == _int2handle(INVALID_HANDLE_VALUE) or not event: 
@@ -93,6 +94,7 @@
             err = _winapi.ERROR_SUCCESS
             if not ret:
                 err = _kernel32.GetLastError()
+                self.error = err
             if err != _winapi.ERROR_SUCCESS and \
                err != _winapi.ERROR_NOT_FOUND and \
                err != _winapi.ERROR_OPERATION_ABORTED:
@@ -118,10 +120,11 @@
             err = _winapi.ERROR_SUCCESS
         else:
             err = _kernel32.GetLastError()
+            self.error = err
 
         if err != _winapi.ERROR_SUCCESS and err != _winapi.ERROR_MORE_DATA:
             if not (err == _winapi.ERROR_BROKEN_PIPE and (self.type == 
TYPE_READ or self.type == TYPE_READINTO)):
-                raise _winapi.WinError()
+                raise _winapi._WinError()
 
         if self.type == OverlappedType.TYPE_READ:
             return _ffi.unpack(self.read_buffer, transferred[0])
@@ -191,7 +194,8 @@
         if success:
             err = _winapi.ERROR_SUCCESS
         else:
-            err = _kernel32.GetLastError()       
+            err = _kernel32.GetLastError()    
+            self.error = err
         
         if err == _winapi.ERROR_IO_PENDING | _winapi.ERROR_SUCCESS:
             return False
@@ -214,6 +218,7 @@
              err = _winapi.ERROR_SUCCESS
         else:
              err = _kernel32.GetLastError()
+             self.error = err
            
         if err == _winapi.ERROR_BROKEN_PIPE:
             mark_as_completed(self.overlapped)
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
@@ -121,6 +121,7 @@
                            void *, BOOL, DWORD, wchar_t *,
                            wchar_t *, LPSTARTUPINFO, LPPROCESS_INFORMATION);
 DWORD WINAPI WaitForSingleObject(HANDLE, DWORD);
+DWORD WaitForMultipleObjects(DWORD, HANDLE*, BOOL, DWORD);
 BOOL WINAPI GetExitCodeProcess(HANDLE, LPDWORD);
 BOOL WINAPI TerminateProcess(HANDLE, UINT);
 HANDLE WINAPI GetStdHandle(DWORD);
@@ -138,6 +139,7 @@
 
 typedef VOID (WINAPI *WAITORTIMERCALLBACK) (PVOID, BOOL);  
 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);
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
@@ -3,8 +3,8 @@
 
 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\x
 
00\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\x1
 
4\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\x1FS
 
EM_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'),
+    _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\x01\x01\x03\x00\x00\x11\x11\x00\x00\x0A\x01\x00\x00\x13\x03\x00\x00\xF4\x03\x00\x00\x00\x0F\x00\x00\x01\x0D\x00\x00\x00\x0F\x00\x00\x01\x0D\x00\x00\xFB\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\xF9\x03\x00\x00\xF5\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\xF0\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\x
 
00\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\xFA\x03\x00\x00\x0A\x01\x00\x00\x14\x11\x00\x00\x14\x11\x00\x00\x15\x11\x00\x00\xEB\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\x01\x01\x03\x00\x00\x0A\x01\x00\x00\x1
 
4\x11\x00\x00\x15\x11\x00\x00\x02\x0F\x00\x00\x01\x0D\x00\x00\xA7\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\x0A\x01\x00\x00\x26\x11\x00\x00\x07\x01\x00\x00\x0A\x01\x00\x00\x00\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\xA2\x0D\x00\x00\x06\x01\x00\x00\x00\x0F\x00\x00\xA2\x0D\x00\x00\x00\x0F\x00\x00\xA2\x0D\x00\x00\x10\x01\x00\x00\x00\x0F\x00\x00\x11\x0D\x00\x00\xF8\x03\x00\x00\x07\x01\x00\x00\x07\x01\x00\x00\xFB\x03\x00\x00\x02\x0F\x00\x00\x11\x0D\x00\x00\xAA\x11\x00\x00\x07\x01\x00\x00\x07\x01\x00\x00\xA7\x03\x00\x00\x02\x0F\x00\x00\x11\x0D\x00\x00\xAD\x11\x00\x00\x0A\x01\x00\x00\x0A\x01\x00\x00\xAA\x11
 
\x00\x00\x0A\x01\x00\x00\x0A\x01\x00\x00\x11\x11\x00\x00\x02\x0F\x00\x00\x11\x0D\x00\x00\xAD\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\xAA\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\xAA\x11\x00\x00\x02\x0F\x00\x00\x11\x0D\x00\x00\xB3\x11\x00\x00\x0A\x01\x00\x00\x0A\x01\x00\x00\xAA\x11\x00\x00\x0A\x01\x00\x00\x0A\x01\x00\x00\x11\x11\x00\x00\x02\x0F\x00\x01\x01\x0D\x00\x00\x0A\x01\x00\x00\x0A\x01\x00\x00\x11\x11\x00\x00\x00\x0F\x00\x01\x01\x0D\x00\x00\x11\x11\x00\x00\x07\x01\x00\x00\x02\x0F\x00\x00\x04\x09\x00\x00\x02\x09\x00\x00\xF7\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\x01\x00\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\xA9\x23CreateEventA',0,b'\x00\x00\xAF\x23CreateEventW',0,b'\x00\x00\xB5\x23CreateFileA',0,b'\x00\x00\xE2\x23CreateFileW',0,b'\x00\x00\xD0\x23CreateIoCompletionPort',0,b'\x00\x00\xBE\x23CreateNamedPipeA',0,b'\x00\x00\xD8\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\xD6\x23GetCurrentProcess',0,b'\x00\x00\x53\x23GetExitCodeProcess',0,b'\x00\x00\x9F\x23GetLastError',0,b'\x00\x00\x9A\x23GetModuleFileNameW',0,b'\x00\x00\x3A\x23GetOverlappedResult',0,b'\x00\x00\x57\x23GetQueuedCompletionStatus',0,b'\x00\x00\xCD\x23GetStdHandle',0,b'\x00\x00\x9F\x23GetVersion',0,b'\x00\x00\x64\x23PostQueuedCompletionStatus',0,b'\x00\x00\x10\x23ReadFile',0,b'\x00\x00\x2B\x23RegisterWaitForSingleObject',0,b'\xFF\xFF\xFF\x1FS
 
EM_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\x23WaitForMultipleObjects',0,b'\x00\x00\x96\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\xA4\x23_getwch',0,b'\x00\x00\xA4\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\xA6\x23_putwch',0,b'\x00\x00\x03\x23_setmode',0,b'\x00\x00\x00\x23_ungetch',0,b'\x00\x00\xA1\x23_
 ungetwch',0,b'\x00\x00\xC8\x23socket',0),
+    _struct_unions = 
((b'\x00\x00\x00\xFE\x00\x00\x00\x03$1',b'\x00\x00\xFD\x11DUMMYSTRUCTNAME',b'\x00\x00\x11\x11Pointer'),(b'\x00\x00\x00\xFD\x00\x00\x00\x02$2',b'\x00\x00\x13\x11Offset',b'\x00\x00\x13\x11OffsetHigh'),(b'\x00\x00\x00\xF5\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\xF9\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\xA2\x11wShowWindow',b'\x00\x00\xA2\x11cbReserved2',b'\x00\x00\xFF\x11lpReserved2',b'\x00\x00\x11\x11hStdInput',b'\x00\x00\x11\x11hStdOutput',b'\x00\x00\x11\x11hStdError'),(b'\x00\x00\x00\xF4\x00\x00\x00\x02_
 
OVERLAPPED',b'\x00\x00\x13\x11Internal',b'\x00\x00\x13\x11InternalHigh',b'\x00\x00\xFE\x11DUMMYUNIONNAME',b'\x00\x00\x11\x11hEvent'),(b'\x00\x00\x00\xF7\x00\x00\x00\x02_PostCallbackData',b'\x00\x00\x11\x11hCompletionPort',b'\x00\x00\x15\x11Overlapped'),(b'\x00\x00\x00\xF8\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\xFA\x00\x00\x00\x02_WSABUF',b'\x00\x00\x13\x11len',b'\x00\x00\x1A\x11buf')),
+    _typenames = 
(b'\x00\x00\x00\xFCLPFN_DISCONNECTEX',b'\x00\x00\x00\x15LPOVERLAPPED',b'\x00\x00\x00\x4DLPOVERLAPPED_COMPLETION_ROUTINE',b'\x00\x00\x00\x23LPPROCESS_INFORMATION',b'\x00\x00\x00\xF6LPPostCallbackData',b'\x00\x00\x00\xAALPSECURITY_ATTRIBUTES',b'\x00\x00\x00\x22LPSTARTUPINFO',b'\x00\x00\x00\x48LPWSABUF',b'\x00\x00\x00\xF4OVERLAPPED',b'\x00\x00\x00\xF5PROCESS_INFORMATION',b'\x00\x00\x00\xAAPSECURITY_ATTRIBUTES',b'\x00\x00\x00\xF7PostCallbackData',b'\x00\x00\x00\xF8SECURITY_ATTRIBUTES',b'\x00\x00\x00\x11SOCKET',b'\x00\x00\x00\xF9STARTUPINFO',b'\x00\x00\x00\x2EWAITORTIMERCALLBACK',b'\x00\x00\x00\xFAWSABUF',b'\x00\x00\x00\xA2wint_t'),
 )
diff --git a/lib_pypy/_winapi.py b/lib_pypy/_winapi.py
--- a/lib_pypy/_winapi.py
+++ b/lib_pypy/_winapi.py
@@ -81,11 +81,10 @@
 
     def __del__(self):
         # do this somehow else
-        xxx
         err = _kernel32.GetLastError()
         bytes = _ffi.new('DWORD[1]')
-        o = overlapped[0]
-        if overlapped[0].pending:
+        o = self.overlapped[0]
+        if self.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
@@ -112,8 +111,8 @@
         else:
             self.pending = 0
             raise _WinError()
-        if self.completed and self.read_buffer:
-            if transferred != len(self.read_buffer):
+        if self.completed and self.readbuffer:
+            if transferred != len(self.readbuffer):
                 raise _WinError()
         return transferred[0], err
 
@@ -127,6 +126,7 @@
 
  
 def ConnectNamedPipe(handle, overlapped=False):
+    handle = _int2handle(handle)
     if overlapped:
         ov = Overlapped(handle)
     else:
@@ -219,6 +219,18 @@
 
     return res
 
+def WaitForMultipleObjects(handle_sequence, waitflag, milliseconds):
+    if len(handle_sequence) > MAXIMUM_WAIT_OBJECTS:
+        return None
+    
+    # CPython makes the wait interruptible by ctrl-c. We need to add this in 
at some point
+    res = _kernel32.WaitForMultipleObjects(len(handle_sequence), 
handle_sequence, waitflag, milliseconds)
+
+    if res == WAIT_FAILED:
+        raise _WinError()
+    return int(res)
+
+
 def GetExitCodeProcess(handle):
     # CPython: the first argument is expected to be an integer.
     code = _ffi.new("DWORD[1]")
@@ -262,6 +274,7 @@
         raise _WinError()
     return _ffi.string(buf)
 
+
 # #define macros from WinBase.h and elsewhere
 STD_INPUT_HANDLE = -10
 STD_OUTPUT_HANDLE = -11
@@ -274,6 +287,7 @@
 WAIT_OBJECT_0 = 0
 WAIT_ABANDONED_0 = 0x80
 WAIT_TIMEOUT = 0x102
+WAIT_FAILED = 0xFFFFFFFF
 CREATE_NEW_CONSOLE = 0x010
 CREATE_NEW_PROCESS_GROUP = 0x200
 CREATE_UNICODE_ENVIRONMENT = 0x400
@@ -332,3 +346,4 @@
 OPEN_ALWAYS       = 4
 TRUNCATE_EXISTING = 5
 
+MAXIMUM_WAIT_OBJECTS = 64
\ No newline at end of file
_______________________________________________
pypy-commit mailing list
[email protected]
https://mail.python.org/mailman/listinfo/pypy-commit

Reply via email to