[pypy-commit] pypy winmultiprocessing: tidy up and attempt to fix some bugs.

andrewjlawrence pypy.commits at gmail.com
Sat Apr 20 08:54:42 EDT 2019


Author: andrewjlawrence
Branch: winmultiprocessing
Changeset: r96527:3f2da06e0f60
Date: 2019-04-20 13:52 +0100
http://bitbucket.org/pypy/pypy/changeset/3f2da06e0f60/

Log:	tidy up and attempt to fix some bugs.

diff --git a/lib_pypy/_winapi.py b/lib_pypy/_winapi.py
--- a/lib_pypy/_winapi.py
+++ b/lib_pypy/_winapi.py
@@ -94,7 +94,6 @@
                 _kernel32.CreateEventW(NULL, True, False, NULL)
 
     def __del__(self):
-        print("Deleting overlapped")
         # do this somehow else
         err = _kernel32.GetLastError()
         bytes = _ffi.new('DWORD[1]')
@@ -109,18 +108,16 @@
 
     @property
     def event(self):
-        print("Event")
         return _handle2int(self.overlapped[0].hEvent)
 
     def GetOverlappedResult(self, wait):
-        print("Get overlapped result")
         transferred = _ffi.new('DWORD[1]', [0])
-        res = _kernel32.GetOverlappedResult(_int2handle(self.handle), self.overlapped, transferred, wait != 0)
+        res = _kernel32.GetOverlappedResult(_int2handle(self.handle), self.overlapped, transferred, wait)
         if res:
             err = ERROR_SUCCESS
         else:
             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
@@ -128,22 +125,24 @@
             pass
         else:
             self.pending = 0
-            raise _WinError()
+            raise _WinError(IOError)
+
         if self.completed and self.readbuffer:
-            if transferred != len(self.readbuffer):
-                raise _WinError()
-        print("Leaving getoverlappedresult")
+            assert _ffi.typeof(self.readbuffer) is _ffi.typeof("CHAR[]")
+            if transferred[0] != len(self.readbuffer):
+                tempbuffer = _ffi.new("CHAR[]", transferred[0])
+                _ffi.memmove(tempbuffer, self.readbuffer, transferred[0])
+                self.readbuffer = tempbuffer
+                return None
         return transferred[0], err
 
     def getbuffer(self):
-        print("getbuffer")
         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")
         ret = True
         if self.pending:
             ret = _kernel32.CancelIoEx(_int2handle(self.handle), self.overlapped)
@@ -155,7 +154,6 @@
 
 
 def ReadFile(handle, size, overlapped):
-    print("ReadFile entered")
     nread = _ffi.new("DWORD*")
     err = _ffi.new("DWORD*")
     use_overlapped = overlapped
@@ -182,19 +180,16 @@
         err = 0
     else: 
         err = _kernel32.GetLastError()
-    print("Error {0}".format(err))
     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 _WinError(IOError)
         return overlapped, err
 
     if not ret and err != ERROR_MORE_DATA:
-        # In CPython SetExcFromWindowsErr was called here.
-        return SetFromWindowsErr(0)
+        return _WinError(IOError)
     return buf, err
 
 def WriteFile(handle, buffer, overlapped=False):
@@ -224,19 +219,22 @@
             if err == ERROR_IO_PENDING:
                 overlapped.pending = 1
             elif err != ERROR_MORE_DATA:
-                # In CPython SetExcFromWindowsErr was called here
-                return SetFromWindowsErr(0)
+                return _WinError(IOError)
+
+        assert written == len(overlapped.writebuffer)
         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 _WinError(IOError)
+     
+    # The whole of the buffer should have been written
+    # otherwise this function call has been be successful
+    assert written == len(buf)
+
     return written, err
 
  
 def ConnectNamedPipe(handle, overlapped=False):
-    print("Connecting named pipe")
     handle = _int2handle(handle)
     if overlapped:
         ov = Overlapped(handle)
@@ -263,7 +261,6 @@
 
 def DuplicateHandle(source_process, source, target_process, access, inherit, options=0):
     # CPython: the first three arguments are expected to be integers
-    print("DuplicateHandle")
     target = _ffi.new("HANDLE[1]")
 
     res = _kernel32.DuplicateHandle(
@@ -275,7 +272,6 @@
     if not res:
         raise _WinError()
     
-    print("Leaving DuplicateHandle")
     return _handle2int(target[0])
 
 def _Z(input):
@@ -325,7 +321,6 @@
             pi.dwThreadId)
 
 def OpenProcess(desired_access, inherit_handle, process_id):
-    print("OpenProcess")
     handle = _kernel32.OpenProcess(desired_access, inherit_handle, process_id)
     if handle == _ffi.NULL:
         SetFromWindowsErr(0)
@@ -334,7 +329,6 @@
     return _handle2int(handle)
 
 def PeekNamedPipe(handle, size=0):
-    print("Entering Peek Named Pipe")
     nread = _ffi.new("DWORD*")
     navail = _ffi.new("DWORD*")
     nleft = _ffi.new("DWORD*")
@@ -356,7 +350,6 @@
 
  #       if (_PyBytes_Resize(&buf, nread))
  #           return NULL;
-        print("Leaving print named pipe")
         return  buf, navail, nleft
     else:
         ret = _kernel32.PeekNamedPipe(_int2handle(handle), _ffi.NULL, 0, _ffi.NULL, navail, nleft)
@@ -364,29 +357,25 @@
             # In CPython SetExcFromWindowsErr is called here.
             # Not sure what that is doing currently.
             SetFromWindowsErr(0)
-        print("Leaving print named pipe")
         return  navail, nleft
 
 def WaitForSingleObject(handle, milliseconds):
-    print("Entering waitforsingle object")
     # CPython: the first argument is expected to be an integer.
     res = _kernel32.WaitForSingleObject(_int2handle(handle), milliseconds)
     if res < 0:
         raise _WinError()
-    print("leavng waitforsingle object")
     return res
 
 def WaitForMultipleObjects(handle_sequence, waitflag, milliseconds):
-    print("Entering waitformultipleobjects")
     if len(handle_sequence) > MAXIMUM_WAIT_OBJECTS:
         return None
-    
+    handle_sequence = list(map(_int2handle, handle_sequence))
+    handle_sequence = _ffi.new("HANDLE[]", handle_sequence)
     # 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()
-    print("leaving waitformultipleobjects")
     return int(res)
 
 
@@ -402,7 +391,6 @@
     return code[0]
 
 def TerminateProcess(handle, exitcode):
-    print("Terminating process")
     # CPython: the first argument is expected to be an integer.
     # The second argument is silently wrapped in a UINT.
     res = _kernel32.TerminateProcess(_int2handle(handle),
diff --git a/pypy/module/_multiprocessing/interp_semaphore.py b/pypy/module/_multiprocessing/interp_semaphore.py
--- a/pypy/module/_multiprocessing/interp_semaphore.py
+++ b/pypy/module/_multiprocessing/interp_semaphore.py
@@ -37,13 +37,6 @@
 
     def sem_unlink(name):
         return None
-
-    def semaphore_unlink(space, w_name):
-        name = space.text_w(w_name)
-        try:
-            sem_unlink(name)
-        except OSError as e:
-            raise wrap_oserror(space, e)
 else:
     from rpython.rlib import rposix
 
@@ -222,12 +215,13 @@
     def handle_w(space, w_handle):
         return rffi.cast(SEM_T, space.int_w(w_handle))
 
-    def semaphore_unlink(space, w_name):
-        name = space.text_w(w_name)
-        try:
-            sem_unlink(name)
-        except OSError as e:
-            raise wrap_oserror(space, e)
+# utilized by POSIX and win32
+def semaphore_unlink(space, w_name):
+    name = space.text_w(w_name)
+    try:
+        sem_unlink(name)
+    except OSError as e:
+        raise wrap_oserror(space, e)
 
 class CounterState:
     def __init__(self, space):


More information about the pypy-commit mailing list