Make multiprocessing's shared memory use memoryview instead of raw pointer
This commit is contained in:
parent
1a0df94db3
commit
26cdf1fe5b
|
@ -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]
|
||||
|
|
|
@ -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
|
||||
|
||||
|
|
|
@ -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, ""},
|
||||
|
|
Loading…
Reference in New Issue