diff options
author | Richard Oudkerk <shibturn@gmail.com> | 2012-05-26 21:09:59 (GMT) |
---|---|---|
committer | Richard Oudkerk <shibturn@gmail.com> | 2012-05-26 21:09:59 (GMT) |
commit | 26cdf1fe5b4c42336a244ad8921bc660ff6819b4 (patch) | |
tree | debf14a29b386e8c1100856c1beb0891b75abc93 | |
parent | 1a0df94db3786aac7624e9bcb6922b87d4498692 (diff) | |
download | cpython-26cdf1fe5b4c42336a244ad8921bc660ff6819b4.zip cpython-26cdf1fe5b4c42336a244ad8921bc660ff6819b4.tar.gz cpython-26cdf1fe5b4c42336a244ad8921bc660ff6819b4.tar.bz2 |
Make multiprocessing's shared memory use memoryview instead of raw pointer
-rw-r--r-- | Lib/multiprocessing/heap.py | 11 | ||||
-rw-r--r-- | Lib/multiprocessing/sharedctypes.py | 3 | ||||
-rw-r--r-- | Modules/_multiprocessing/multiprocessing.c | 17 |
3 files changed, 5 insertions, 26 deletions
diff --git a/Lib/multiprocessing/heap.py b/Lib/multiprocessing/heap.py index 311e402..4e93c12 100644 --- a/Lib/multiprocessing/heap.py +++ b/Lib/multiprocessing/heap.py @@ -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] diff --git a/Lib/multiprocessing/sharedctypes.py b/Lib/multiprocessing/sharedctypes.py index e473749..6dc160b 100644 --- a/Lib/multiprocessing/sharedctypes.py +++ b/Lib/multiprocessing/sharedctypes.py @@ -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 diff --git a/Modules/_multiprocessing/multiprocessing.c b/Modules/_multiprocessing/multiprocessing.c index d5593f0..eb05c62 100644 --- a/Modules/_multiprocessing/multiprocessing.c +++ b/Modules/_multiprocessing/multiprocessing.c @@ -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, ""}, |