Make multiprocessing's shared memory use memoryview instead of raw pointer

This commit is contained in:
Richard Oudkerk 2012-05-26 22:09:59 +01:00
parent 1a0df94db3
commit 26cdf1fe5b
3 changed files with 5 additions and 26 deletions

View File

@ -205,7 +205,7 @@ class Heap(object):
self._lock.release() 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): class BufferWrapper(object):
@ -218,11 +218,6 @@ class BufferWrapper(object):
self._state = (block, size) self._state = (block, size)
Finalize(self, BufferWrapper._heap.free, args=(block,)) Finalize(self, BufferWrapper._heap.free, args=(block,))
def get_address(self): def create_memoryview(self):
(arena, start, stop), size = self._state (arena, start, stop), size = self._state
address, length = _multiprocessing.address_of_buffer(arena.buffer) return memoryview(arena.buffer)[start:start+size]
assert size <= length
return address + start
def get_size(self):
return self._state[1]

View File

@ -132,7 +132,8 @@ def rebuild_ctype(type_, wrapper, length):
if length is not None: if length is not None:
type_ = type_ * length type_ = type_ * length
ForkingPickler.register(type_, reduce_ctype) ForkingPickler.register(type_, reduce_ctype)
obj = type_.from_address(wrapper.get_address()) buf = wrapper.create_memoryview()
obj = type_.from_buffer(buf)
obj._wrapper = wrapper obj._wrapper = wrapper
return obj return obj

View File

@ -51,20 +51,6 @@ mp_SetError(PyObject *Type, int num)
return NULL; 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 #ifdef MS_WINDOWS
static PyObject * static PyObject *
multiprocessing_closesocket(PyObject *self, PyObject *args) multiprocessing_closesocket(PyObject *self, PyObject *args)
@ -137,9 +123,6 @@ multiprocessing_send(PyObject *self, PyObject *args)
*/ */
static PyMethodDef module_methods[] = { 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 #ifdef MS_WINDOWS
{"closesocket", multiprocessing_closesocket, METH_VARARGS, ""}, {"closesocket", multiprocessing_closesocket, METH_VARARGS, ""},
{"recv", multiprocessing_recv, METH_VARARGS, ""}, {"recv", multiprocessing_recv, METH_VARARGS, ""},