[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