[pypy-svn] r77848 - in pypy/branch/fast-forward/pypy/module/_multiprocessing: . test

afa at codespeak.net afa at codespeak.net
Tue Oct 12 17:36:24 CEST 2010


Author: afa
Date: Tue Oct 12 17:36:23 2010
New Revision: 77848

Added:
   pypy/branch/fast-forward/pypy/module/_multiprocessing/interp_memory.py   (contents, props changed)
   pypy/branch/fast-forward/pypy/module/_multiprocessing/test/test_memory.py   (contents, props changed)
Modified:
   pypy/branch/fast-forward/pypy/module/_multiprocessing/__init__.py
Log:
Implement _multiprocessing.address_of_buffer(buf)
For mmap buffers only!


Modified: pypy/branch/fast-forward/pypy/module/_multiprocessing/__init__.py
==============================================================================
--- pypy/branch/fast-forward/pypy/module/_multiprocessing/__init__.py	(original)
+++ pypy/branch/fast-forward/pypy/module/_multiprocessing/__init__.py	Tue Oct 12 17:36:23 2010
@@ -7,6 +7,8 @@
         'Connection'      : 'interp_connection.W_FileConnection',
         'PipeConnection'  : 'interp_connection.W_PipeConnection',
         'SemLock'         : 'interp_semaphore.W_SemLock',
+
+        'address_of_buffer' : 'interp_memory.address_of_buffer',
     }
 
     appleveldefs = {

Added: pypy/branch/fast-forward/pypy/module/_multiprocessing/interp_memory.py
==============================================================================
--- (empty file)
+++ pypy/branch/fast-forward/pypy/module/_multiprocessing/interp_memory.py	Tue Oct 12 17:36:23 2010
@@ -0,0 +1,16 @@
+from pypy.interpreter.baseobjspace import ObjSpace, Wrappable, W_Root
+from pypy.interpreter.gateway import unwrap_spec
+from pypy.interpreter.error import OperationError
+from pypy.rpython.lltypesystem import rffi
+from pypy.module.mmap.interp_mmap import W_MMap
+
+ at unwrap_spec(ObjSpace, W_Root)
+def address_of_buffer(space, w_obj):
+    if space.config.objspace.usemodules.mmap:
+        mmap = space.interp_w(W_MMap, w_obj)
+        address = rffi.cast(rffi.SIZE_T, mmap.mmap.data)
+        return space.newtuple([space.wrap(address),
+                               space.wrap(mmap.mmap.size)])
+    else:
+        raise OperationError(space.w_TypeError, space.wrap(
+            "cannot get address of buffer"))

Added: pypy/branch/fast-forward/pypy/module/_multiprocessing/test/test_memory.py
==============================================================================
--- (empty file)
+++ pypy/branch/fast-forward/pypy/module/_multiprocessing/test/test_memory.py	Tue Oct 12 17:36:23 2010
@@ -0,0 +1,40 @@
+from pypy.conftest import gettestobjspace
+
+class AppTestMemory:
+    def setup_class(cls):
+        space = gettestobjspace(
+            usemodules=('_multiprocessing', 'mmap', '_rawffi'))
+        cls.space = space
+
+    def test_address_of(self):
+        import _multiprocessing
+        raises(TypeError, _multiprocessing.address_of_buffer, None)
+        raises(TypeError, _multiprocessing.address_of_buffer, "a")
+
+    def test_mmap_address(self):
+        import mmap
+        import _multiprocessing
+
+        # This is a bit faster than importing ctypes
+        import _ctypes
+        class c_double(_ctypes._SimpleCData):
+            _type_ = "d"
+        sizeof_double = _ctypes.sizeof(c_double)
+
+        buf = mmap.mmap(-1, 300)
+        buf[0:300] = '\0' * 300
+
+        # Get the address of shared memory
+        address, length = _multiprocessing.address_of_buffer(buf)
+        assert length == 300
+
+        # build a ctypes object from it
+        var = c_double.from_address(address)
+        assert buf[0:sizeof_double] == '\0' * sizeof_double
+        assert var.value == 0
+
+        # check that both objects share the same memory
+        var.value = 123.456
+        assert buf[0:sizeof_double] != '\0' * sizeof_double
+        buf[0:sizeof_double] = '\0' * sizeof_double
+        assert var.value == 0



More information about the Pypy-commit mailing list