static int NRT_adapt_ndarray_from_python(PyObject *obj, arystruct_t* arystruct) { PyArrayObject *ndary; int i, ndim; npy_intp *p; void *data; if (!PyArray_Check(obj)) { return -1; } ndary = (PyArrayObject*)obj; ndim = PyArray_NDIM(ndary); data = PyArray_DATA(ndary); arystruct->meminfo = meminfo_new_from_pyobject((void*)data, obj); arystruct->data = data; arystruct->nitems = PyArray_SIZE(ndary); arystruct->itemsize = PyArray_ITEMSIZE(ndary); arystruct->parent = obj; p = arystruct->shape_and_strides; for (i = 0; i < ndim; i++, p++) { *p = PyArray_DIM(ndary, i); } for (i = 0; i < ndim; i++, p++) { *p = PyArray_STRIDE(ndary, i); } NRT_Debug(nrt_debug_print("NRT_adapt_ndarray_from_python %p\n", arystruct->meminfo)); NRT_MemInfo_acquire(arystruct->meminfo); return 0; }
static void NRT_adapt_buffer_from_python(Py_buffer *buf, arystruct_t *arystruct) { int i; npy_intp *p; if (buf->obj) { /* Allocate new MemInfo only if the buffer has a parent */ arystruct->meminfo = meminfo_new_from_pyobject((void*)buf->buf, buf->obj); NRT_MemInfo_acquire(arystruct->meminfo); } arystruct->data = buf->buf; arystruct->itemsize = buf->itemsize; arystruct->parent = buf->obj; arystruct->nitems = 1; p = arystruct->shape_and_strides; for (i = 0; i < buf->ndim; i++, p++) { *p = buf->shape[i]; arystruct->nitems *= buf->shape[i]; } for (i = 0; i < buf->ndim; i++, p++) { *p = buf->strides[i]; } }
static int MemInfo_init(MemInfoObject *self, PyObject *args, PyObject *kwds) { static char *keywords[] = {"ptr", NULL}; PyObject *raw_ptr_obj; void *raw_ptr; if (!PyArg_ParseTupleAndKeywords(args, kwds, "O", keywords, &raw_ptr_obj)) { return -1; } raw_ptr = PyLong_AsVoidPtr(raw_ptr_obj); if(PyErr_Occurred()) return -1; self->meminfo = (MemInfo*)raw_ptr; self->defer = 0; NRT_MemInfo_acquire(self->meminfo); return 0; }
static PyObject* MemInfo_acquire(MemInfoObject *self) { NRT_MemInfo_acquire(self->meminfo); Py_RETURN_NONE; }
static void NRT_incref(MemInfo* mi) { if (mi) { NRT_MemInfo_acquire(mi); } }