Author: andrewjlawrence
Branch: winmultiprocessing
Changeset: r96522:34061c010a7a
Date: 2019-04-19 21:02 +0100
http://bitbucket.org/pypy/pypy/changeset/34061c010a7a/

Log:    Work in progress

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
@@ -101,6 +101,7 @@
 HANDLE WINAPI CreateFileW(LPCWSTR, DWORD, DWORD, LPSECURITY_ATTRIBUTES,
                    DWORD, DWORD, HANDLE);
 BOOL ReadFile(HANDLE, LPVOID, DWORD, LPDWORD, LPOVERLAPPED);
+BOOL WINAPI WriteFile(HANDLE, LPCVOID, DWORD, LPDWORD, LPOVERLAPPED);
 BOOL WINAPI SetNamedPipeHandleState(HANDLE, LPDWORD, LPDWORD, LPDWORD);
 BOOL WINAPI ConnectNamedPipe(HANDLE, LPOVERLAPPED);
 BOOL WINAPI PeekNamedPipe(HANDLE, LPVOID, DWORD, LPDWORD, LPDWORD, LPDWORD);
@@ -149,7 +150,7 @@
 BOOL WINAPI GetQueuedCompletionStatus(HANDLE, LPDWORD, ULONG**, LPOVERLAPPED*, 
DWORD);
 HANDLE WINAPI CreateIoCompletionPort(HANDLE, HANDLE, ULONG_PTR, DWORD);
 
-BOOL WINAPI WriteFile(HANDLE, LPCVOID, DWORD, LPDWORD, LPOVERLAPPED);
+
 
 #define WT_EXECUTEINWAITTHREAD 0x00000004
 #define WT_EXECUTEONLYONCE 0x00000008
diff --git a/lib_pypy/_winapi.py b/lib_pypy/_winapi.py
--- a/lib_pypy/_winapi.py
+++ b/lib_pypy/_winapi.py
@@ -16,6 +16,7 @@
 GetVersion = _kernel32.GetVersion
 NULL = _ffi.NULL
 
+
 # Now the _subprocess module implementation
 def _WinError(type=WindowsError):
     code, message = _ffi.getwinerror()
@@ -109,8 +110,7 @@
     @property
     def event(self):
         print("Event")
-        xxx
-        return None
+        return _handle2int(self.overlapped[0].hEvent)
 
     def GetOverlappedResult(self, wait):
         print("Get overlapped result")
@@ -119,7 +119,8 @@
         if res:
             err = ERROR_SUCCESS
         else:
-            err = GetLastError()
+            err = _kernel32.GetLastError()
+        print("error {0}".format(err))
         if err in (ERROR_SUCCESS, ERROR_MORE_DATA, ERROR_OPERATION_ABORTED):
             self.completed = 1
             self.pending = 0
@@ -136,12 +137,20 @@
 
     def getbuffer(self):
         print("getbuffer")
-        xxx
-        return None
+        if not self.completed:
+            raise ValueError("can't get read buffer before 
GetOverlappedResult() "
+                        "signals the operation completed")
+        return self.readbuffer
 
     def cancel(self):
         print("cancel")
-        xxx
+        ret = True
+        if self.pending:
+            ret = _kernel32.CancelIoEx(_int2handle(self.handle), 
self.overlapped)
+        if not ret and _kernel32.GetLastError() != ERROR_NOT_FOUND:
+            # In CPython SetExcFromWindowsErr is called here.
+            SetFromWindowsErr(0)
+        self.pending = 0
         return None
 
 
@@ -160,7 +169,7 @@
         overlapped = Overlapped(handle)
         if not overlapped:
             return _ffi.NULL
-        overlapped.read_buffer = buf
+        overlapped.readbuffer = buf
     
     if overlapped:
         ret = _kernel32.ReadFile(_int2handle(handle), buf, size, nread,
@@ -185,12 +194,46 @@
 
     if not ret and err != ERROR_MORE_DATA:
         # In CPython SetExcFromWindowsErr was called here.
-        return PyErr_SetExcFromWindowsErr(0)
+        return SetFromWindowsErr(0)
     return buf, err
 
+def WriteFile(handle, buffer, overlapped=False):
+    written = _ffi.new("DWORD*")
+    err = _ffi.new("DWORD*")
+    use_overlapped = overlapped
+    overlapped = None
 
-def WriteFile():
-    xxx
+    if use_overlapped:
+        overlapped = Overlapped(handle)
+        if not overlapped:
+            return _ffi.NULL
+        overlapped.writebuffer = _ffi.new("CHAR[]", bytes(buffer))
+        buf = overlapped.writebuffer
+    else:
+        buf = _ffi.new("CHAR[]", bytes(buffer))
+    
+    ret = _kernel32.WriteFile(_int2handle(handle), buf , len(buf), written, 
overlapped.overlapped)
+
+    if ret:
+        err = 0
+    else: 
+        err = _kernel32.GetLastError()
+
+    if overlapped:
+        if not ret:
+            if err == ERROR_IO_PENDING:
+                overlapped.pending = 1
+            elif err != ERROR_MORE_DATA:
+                # In CPython SetExcFromWindowsErr was called here
+                return SetFromWindowsErr(0)
+        return overlapped, err
+
+    if not ret:
+        # In CPython SetExcFromWindowsErr was called here.
+        return PyErr_SetExcFromWindowsErr(0)
+    print("written {0}, len(buf) {1}".format(written, len(buf)))
+    return written, err
+
  
 def ConnectNamedPipe(handle, overlapped=False):
     print("Connecting named pipe")
_______________________________________________
pypy-commit mailing list
[email protected]
https://mail.python.org/mailman/listinfo/pypy-commit

Reply via email to