]> granicus.if.org Git - python/commitdiff
Make multiprocessing's shared memory use memoryview instead of raw pointer
authorRichard Oudkerk <shibturn@gmail.com>
Sat, 26 May 2012 21:09:59 +0000 (22:09 +0100)
committerRichard Oudkerk <shibturn@gmail.com>
Sat, 26 May 2012 21:09:59 +0000 (22:09 +0100)
Lib/multiprocessing/heap.py
Lib/multiprocessing/sharedctypes.py
Modules/_multiprocessing/multiprocessing.c

index 311e402d35208215b3388d6185f047d2e54b59f4..4e93c12f81549099ccef5ee65fca1ddf83e2be88 100644 (file)
@@ -205,7 +205,7 @@ class Heap(object):
             self._lock.release()
 
 #
-# Class representing a chunk of an mmap -- can be inherited
+# Class representing a chunk of an mmap -- can be inherited by child process
 #
 
 class BufferWrapper(object):
@@ -218,11 +218,6 @@ class BufferWrapper(object):
         self._state = (block, size)
         Finalize(self, BufferWrapper._heap.free, args=(block,))
 
-    def get_address(self):
+    def create_memoryview(self):
         (arena, start, stop), size = self._state
-        address, length = _multiprocessing.address_of_buffer(arena.buffer)
-        assert size <= length
-        return address + start
-
-    def get_size(self):
-        return self._state[1]
+        return memoryview(arena.buffer)[start:start+size]
index e473749981c9dc839d2a71fd3ca6001926c17c89..6dc160bf753f0305c14fc4ede9e515e80644ee9b 100644 (file)
@@ -132,7 +132,8 @@ def rebuild_ctype(type_, wrapper, length):
     if length is not None:
         type_ = type_ * length
     ForkingPickler.register(type_, reduce_ctype)
-    obj = type_.from_address(wrapper.get_address())
+    buf = wrapper.create_memoryview()
+    obj = type_.from_buffer(buf)
     obj._wrapper = wrapper
     return obj
 
index d5593f0db8f5628bae33fdacba90e3f8aacc1a69..eb05c62b0d050684b5ea260e53ea943e069339f0 100644 (file)
@@ -51,20 +51,6 @@ mp_SetError(PyObject *Type, int num)
     return NULL;
 }
 
-
-static PyObject*
-multiprocessing_address_of_buffer(PyObject *self, PyObject *obj)
-{
-    void *buffer;
-    Py_ssize_t buffer_len;
-
-    if (PyObject_AsWriteBuffer(obj, &buffer, &buffer_len) < 0)
-        return NULL;
-
-    return Py_BuildValue("Nn",
-                         PyLong_FromVoidPtr(buffer), buffer_len);
-}
-
 #ifdef MS_WINDOWS
 static PyObject *
 multiprocessing_closesocket(PyObject *self, PyObject *args)
@@ -137,9 +123,6 @@ multiprocessing_send(PyObject *self, PyObject *args)
  */
 
 static PyMethodDef module_methods[] = {
-    {"address_of_buffer", multiprocessing_address_of_buffer, METH_O,
-     "address_of_buffer(obj) -> int\n"
-     "Return address of obj assuming obj supports buffer inteface"},
 #ifdef MS_WINDOWS
     {"closesocket", multiprocessing_closesocket, METH_VARARGS, ""},
     {"recv", multiprocessing_recv, METH_VARARGS, ""},