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