CMSIS-DSP: Correcting issue #1412

Python wrapper memory leak.
pull/19/head
Christophe Favergeon 4 years ago
parent 76a13319bb
commit 0adc9f21e3

@ -178,54 +178,78 @@ Method_##NAME##_##FIELD(ml_##NAME##Object *self, PyObject *ignored)\
PyModule_AddObject(module, #name, (PyObject *)&ml_##name##Type); PyModule_AddObject(module, #name, (PyObject *)&ml_##name##Type);
#endif #endif
#define FLOATARRAY2(OBJ,NB1,NB2,DATA) \ void capsule_cleanup(PyObject *capsule) {
npy_intp dims[2]; \ void *memory = PyCapsule_GetPointer(capsule, "cmsisdsp capsule");
dims[0]=NB1; \ // I'm going to assume your memory needs to be freed with free().
dims[1]=NB2; \ // If it needs different cleanup, perform whatever that cleanup is
const int ND=2; \ // instead of calling free().
PyObject *OBJ=PyArray_SimpleNewFromData(ND, dims, NPY_FLOAT, DATA); PyMem_Free(memory);
}
#define FLOATARRAY1(OBJ,NB1,DATA) \
npy_intp dims##OBJ[1]; \ #define FLOATARRAY2(OBJ,NB1,NB2,DATA) \
dims##OBJ[0]=NB1; \ npy_intp dims[2]; \
const int ND##OBJ=1; \ dims[0]=NB1; \
PyObject *OBJ=PyArray_SimpleNewFromData(ND##OBJ, dims##OBJ, NPY_FLOAT, DATA); dims[1]=NB2; \
const int ND=2; \
#define FLOAT64ARRAY1(OBJ,NB1,DATA) \ PyArrayObject *OBJ=(PyArrayObject*)PyArray_SimpleNewFromData(ND, dims, NPY_FLOAT, DATA);\
npy_intp dims[1]; \ PyObject *capsule = PyCapsule_New(DATA, "cmsisdsp capsule",capsule_cleanup); \
dims[0]=NB1; \ PyArray_SetBaseObject(OBJ, capsule);
const int ND=1; \
PyObject *OBJ=PyArray_SimpleNewFromData(ND, dims, NPY_DOUBLE, DATA); #define FLOATARRAY1(OBJ,NB1,DATA) \
npy_intp dims##OBJ[1]; \
#define UINT32ARRAY1(OBJ,NB1,DATA) \ dims##OBJ[0]=NB1; \
npy_intp dims[1]; \ const int ND##OBJ=1; \
dims[0]=NB1; \ PyArrayObject *OBJ=(PyArrayObject*)PyArray_SimpleNewFromData(ND##OBJ, dims##OBJ, NPY_FLOAT, DATA);\
const int ND=1; \ PyObject *capsule = PyCapsule_New(DATA, "cmsisdsp capsule",capsule_cleanup); \
PyObject *OBJ=PyArray_SimpleNewFromData(ND, dims, NPY_UINT32, DATA); PyArray_SetBaseObject(OBJ, capsule);
#define INT32ARRAY1(OBJ,NB1,DATA) \ #define FLOAT64ARRAY1(OBJ,NB1,DATA) \
npy_intp dims[1]; \ npy_intp dims[1]; \
dims[0]=NB1; \ dims[0]=NB1; \
const int ND=1; \ const int ND=1; \
PyObject *OBJ=PyArray_SimpleNewFromData(ND, dims, NPY_INT32, DATA); PyArrayObject *OBJ=(PyArrayObject*)PyArray_SimpleNewFromData(ND, dims, NPY_DOUBLE, DATA);\
PyObject *capsule = PyCapsule_New(DATA, "cmsisdsp capsule",capsule_cleanup); \
#define INT16ARRAY1(OBJ,NB1,DATA) \ PyArray_SetBaseObject(OBJ, capsule);
npy_intp dims[1]; \
dims[0]=NB1; \ #define UINT32ARRAY1(OBJ,NB1,DATA) \
const int ND=1; \ npy_intp dims[1]; \
PyObject *OBJ=PyArray_SimpleNewFromData(ND, dims, NPY_INT16, DATA); dims[0]=NB1; \
const int ND=1; \
#define INT8ARRAY1(OBJ,NB1,DATA) \ PyArrayObject *OBJ=(PyArrayObject*)PyArray_SimpleNewFromData(ND, dims, NPY_UINT32, DATA);\
npy_intp dims[1]; \ PyObject *capsule = PyCapsule_New(DATA, "cmsisdsp capsule",capsule_cleanup); \
dims[0]=NB1; \ PyArray_SetBaseObject(OBJ, capsule);
const int ND=1; \
PyObject *OBJ=PyArray_SimpleNewFromData(ND, dims, NPY_BYTE, DATA); #define INT32ARRAY1(OBJ,NB1,DATA) \
npy_intp dims[1]; \
#define TYP_ARRAY1(OBJ,NB1,DATA,NPYTYPE) \ dims[0]=NB1; \
npy_intp dims[1]; \ const int ND=1; \
dims[0]=NB1; \ PyArrayObject *OBJ=(PyArrayObject*)PyArray_SimpleNewFromData(ND, dims, NPY_INT32, DATA);\
const int ND=1; \ PyObject *capsule = PyCapsule_New(DATA, "cmsisdsp capsule",capsule_cleanup); \
PyObject *OBJ=PyArray_SimpleNewFromData(ND, dims, NPYTYPE, DATA); PyArray_SetBaseObject(OBJ, capsule);
#define INT16ARRAY1(OBJ,NB1,DATA) \
npy_intp dims[1]; \
dims[0]=NB1; \
const int ND=1; \
PyArrayObject *OBJ=(PyArrayObject*)PyArray_SimpleNewFromData(ND, dims, NPY_INT16, DATA);\
PyObject *capsule = PyCapsule_New(DATA, "cmsisdsp capsule",capsule_cleanup); \
PyArray_SetBaseObject(OBJ, capsule);
#define INT8ARRAY1(OBJ,NB1,DATA) \
npy_intp dims[1]; \
dims[0]=NB1; \
const int ND=1; \
PyArrayObject *OBJ=(PyArrayObject*)PyArray_SimpleNewFromData(ND, dims, NPY_BYTE, DATA);\
PyObject *capsule = PyCapsule_New(DATA, "cmsisdsp capsule",capsule_cleanup); \
PyArray_SetBaseObject(OBJ, capsule);
#define TYP_ARRAY1(OBJ,NB1,DATA,NPYTYPE) \
npy_intp dims[1]; \
dims[0]=NB1; \
const int ND=1; \
PyArrayObject *OBJ=(PyArrayObject*)PyArray_SimpleNewFromData(ND, dims, NPYTYPE, DATA);\
PyObject *capsule = PyCapsule_New(DATA, "cmsisdsp capsule",capsule_cleanup); \
PyArray_SetBaseObject(OBJ, capsule);
#define MATRIXFROMNUMPY(EXT,TYP,SRCTYPE,NUMPYTYPE) \ #define MATRIXFROMNUMPY(EXT,TYP,SRCTYPE,NUMPYTYPE) \
arm_matrix_instance_##EXT *EXT##MatrixFromNumpy(PyObject *o) \ arm_matrix_instance_##EXT *EXT##MatrixFromNumpy(PyObject *o) \
@ -282,35 +306,39 @@ CREATEMATRIX(q31,q31_t);
CREATEMATRIX(q15,q15_t); CREATEMATRIX(q15,q15_t);
CREATEMATRIX(q7,q7_t); CREATEMATRIX(q7,q7_t);
#define NUMPYVECTORFROMBUFFER(EXT,CTYPE,NUMPYTYPE_FROMC) \ #define NUMPYVECTORFROMBUFFER(EXT,CTYPE,NUMPYTYPE_FROMC) \
PyObject *NumpyVectorFrom##EXT##Buffer(CTYPE *ptr,int nb) \ PyObject *NumpyVectorFrom##EXT##Buffer(CTYPE *ptr,int nb) \
{ \ { \
npy_intp dims[1]; \ npy_intp dims[1]; \
const int ND=1; \ const int ND=1; \
dims[0]=nb; \ dims[0]=nb; \
\ \
void *pDst=PyMem_Malloc(sizeof(CTYPE) *nb); \ void *pDst=PyMem_Malloc(sizeof(CTYPE) *nb); \
memcpy((void*)pDst,(void*)ptr,sizeof(CTYPE)*nb); \ memcpy((void*)pDst,(void*)ptr,sizeof(CTYPE)*nb); \
\ \
PyObject *OBJ=PyArray_SimpleNewFromData(ND, dims, NUMPYTYPE_FROMC, pDst);\ PyArrayObject *OBJ=(PyArrayObject*)PyArray_SimpleNewFromData(ND, dims, NUMPYTYPE_FROMC, pDst);\
PyObject *pythonResult = Py_BuildValue("O",OBJ); \ PyObject *capsule = PyCapsule_New(pDst, "cmsisdsp capsule",capsule_cleanup); \
Py_DECREF(OBJ); \ PyArray_SetBaseObject(OBJ, capsule); \
return(pythonResult); \ PyObject *pythonResult = Py_BuildValue("O",OBJ); \
Py_DECREF(OBJ); \
return(pythonResult); \
} }
NUMPYVECTORFROMBUFFER(f32,float32_t,NPY_FLOAT); NUMPYVECTORFROMBUFFER(f32,float32_t,NPY_FLOAT);
#define NUMPYARRAYFROMMATRIX(EXT,NUMPYTYPE_FROMC) \ #define NUMPYARRAYFROMMATRIX(EXT,NUMPYTYPE_FROMC) \
PyObject *NumpyArrayFrom##EXT##Matrix(arm_matrix_instance_##EXT *mat) \ PyObject *NumpyArrayFrom##EXT##Matrix(arm_matrix_instance_##EXT *mat) \
{ \ { \
npy_intp dims[2]; \ npy_intp dims[2]; \
dims[0]=mat->numRows; \ dims[0]=mat->numRows; \
dims[1]=mat->numCols; \ dims[1]=mat->numCols; \
const int ND=2; \ const int ND=2; \
PyObject *OBJ=PyArray_SimpleNewFromData(ND, dims, NUMPYTYPE_FROMC, mat->pData);\ PyArrayObject *OBJ=(PyArrayObject*)PyArray_SimpleNewFromData(ND, dims, NUMPYTYPE_FROMC, mat->pData);\
return(OBJ); \ PyObject *capsule = PyCapsule_New(mat->pData, "cmsisdsp capsule",capsule_cleanup); \
PyArray_SetBaseObject(OBJ, capsule); \
return(OBJ); \
} }
NUMPYARRAYFROMMATRIX(f32,NPY_FLOAT); NUMPYARRAYFROMMATRIX(f32,NPY_FLOAT);

@ -191,11 +191,11 @@ module1 = Extension(config.extensionName,
) )
setup (name = config.setupName, setup (name = config.setupName,
version = '1.0.0', version = '1.0.1',
packages=['cmsisdsp'], packages=['cmsisdsp'],
description = config.setupDescription, description = config.setupDescription,
ext_modules = [module1], ext_modules = [module1],
author = 'Copyright (C) 2010-2021 ARM Limited or its affiliates. All rights reserved.', author = 'Copyright (C) 2010-2022 ARM Limited or its affiliates. All rights reserved.',
url="https://github.com/ARM-software/CMSIS_5", url="https://github.com/ARM-software/CMSIS_5",
classifiers=[ classifiers=[
"Programming Language :: Python", "Programming Language :: Python",

Loading…
Cancel
Save