mirror of https://github.com/python/cpython
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()
|
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]
|
|
||||||
|
|
|
@ -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
|
||||||
|
|
||||||
|
|
|
@ -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, ""},
|
||||||
|
|
Loading…
Reference in New Issue