Skip to content

Commit 01958d9

Browse files
author
Joel Bernier
committed
memory leak fixes from continuum
1 parent 861752c commit 01958d9

File tree

1 file changed

+39
-26
lines changed

1 file changed

+39
-26
lines changed

hexrd/transforms/transforms_CAPI.c

Lines changed: 39 additions & 26 deletions
Original file line numberDiff line numberDiff line change
@@ -58,7 +58,7 @@ static PyObject * anglesToGVec(PyObject * self, PyObject * args)
5858

5959
double *angs_ptr, *bHat_l_ptr, *eHat_l_ptr, *rMat_c_ptr;
6060
double *gVec_c_ptr;
61-
61+
6262
/* Parse arguments */
6363
if ( !PyArg_ParseTuple(args,"OOOdO",
6464
&angs,
@@ -71,7 +71,7 @@ static PyObject * anglesToGVec(PyObject * self, PyObject * args)
7171
nbhat = PyArray_NDIM(bHat_l);
7272
nehat = PyArray_NDIM(eHat_l);
7373
nrmat = PyArray_NDIM(rMat_c);
74-
74+
7575
assert( nangs==2 && nbhat==1 && nehat==1 && nrmat==2 );
7676

7777
/* Verify dimensions of input arrays */
@@ -86,7 +86,7 @@ static PyObject * anglesToGVec(PyObject * self, PyObject * args)
8686
assert( da1 == 3 );
8787
assert( db1 == 3 && de1 == 3);
8888
assert( dr1 == 3 && dr2 == 3);
89-
89+
9090
/* Allocate C-style array for return data */
9191
rdims[0] = nvecs; rdims[1] = 3;
9292
gVec_c = (PyArrayObject*)PyArray_EMPTY(2,rdims,NPY_DOUBLE,0);
@@ -103,7 +103,7 @@ static PyObject * anglesToGVec(PyObject * self, PyObject * args)
103103
bHat_l_ptr, eHat_l_ptr,
104104
chi, rMat_c_ptr,
105105
gVec_c_ptr);
106-
106+
107107
/* Build and return the nested data structure */
108108
return((PyObject*)gVec_c);
109109
}
@@ -136,18 +136,18 @@ static PyObject * makeGVector(PyObject * self, PyObject * args)
136136
static PyObject * gvecToDetectorXY(PyObject * self, PyObject * args)
137137
{
138138
PyArrayObject *gVec_c,
139-
*rMat_d, *rMat_s, *rMat_c,
140-
*tVec_d, *tVec_s, *tVec_c,
141-
*beamVec;
139+
*rMat_d, *rMat_s, *rMat_c,
140+
*tVec_d, *tVec_s, *tVec_c,
141+
*beamVec;
142142
PyArrayObject *result;
143143

144144
int dgc, drd, drs, drc, dtd, dts, dtc, dbv;
145145
npy_intp npts, dims[2];
146146

147147
double *gVec_c_Ptr,
148-
*rMat_d_Ptr, *rMat_s_Ptr, *rMat_c_Ptr,
149-
*tVec_d_Ptr, *tVec_s_Ptr, *tVec_c_Ptr,
150-
*beamVec_Ptr;
148+
*rMat_d_Ptr, *rMat_s_Ptr, *rMat_c_Ptr,
149+
*tVec_d_Ptr, *tVec_s_Ptr, *tVec_c_Ptr,
150+
*beamVec_Ptr;
151151
double *result_Ptr;
152152

153153
/* Parse arguments */
@@ -256,18 +256,18 @@ static PyObject * gvecToDetectorXY(PyObject * self, PyObject * args)
256256
static PyObject * gvecToDetectorXYArray(PyObject * self, PyObject * args)
257257
{
258258
PyArrayObject *gVec_c,
259-
*rMat_d, *rMat_s, *rMat_c,
260-
*tVec_d, *tVec_s, *tVec_c,
261-
*beamVec;
259+
*rMat_d, *rMat_s, *rMat_c,
260+
*tVec_d, *tVec_s, *tVec_c,
261+
*beamVec;
262262
PyArrayObject *result;
263263

264264
int dgc, drd, drs, drc, dtd, dts, dtc, dbv;
265265
npy_intp npts, dims[2];
266266

267267
double *gVec_c_Ptr,
268-
*rMat_d_Ptr, *rMat_s_Ptr, *rMat_c_Ptr,
269-
*tVec_d_Ptr, *tVec_s_Ptr, *tVec_c_Ptr,
270-
*beamVec_Ptr;
268+
*rMat_d_Ptr, *rMat_s_Ptr, *rMat_c_Ptr,
269+
*tVec_d_Ptr, *tVec_s_Ptr, *tVec_c_Ptr,
270+
*beamVec_Ptr;
271271
double *result_Ptr;
272272

273273
/* Parse arguments */
@@ -300,7 +300,7 @@ static PyObject * gvecToDetectorXYArray(PyObject * self, PyObject * args)
300300

301301
if (npts != PyArray_DIM(rMat_s, 0)) {
302302
PyErr_Format(PyExc_ValueError, "gVec_c and rMat_s length mismatch %d vs %d",
303-
(int)PyArray_DIM(gVec_c, 0), (int)PyArray_DIM(rMat_s, 0));
303+
(int)PyArray_DIM(gVec_c, 0), (int)PyArray_DIM(rMat_s, 0));
304304
return NULL;
305305
}
306306
assert( PyArray_DIMS(gVec_c)[1] == 3 );
@@ -386,15 +386,16 @@ static PyObject * detectorXYToGvec(PyObject * self, PyObject * args)
386386
{
387387
PyArrayObject *xy_det, *rMat_d, *rMat_s,
388388
*tVec_d, *tVec_s, *tVec_c,
389-
*beamVec, *etaVec;
389+
*beamVec, *etaVec;
390390
PyArrayObject *tTh, *eta, *gVec_l;
391+
PyObject *inner_tuple, *outer_tuple;
391392

392393
int dxy, drd, drs, dtd, dts, dtc, dbv, dev;
393394
npy_intp npts, dims[2];
394395

395396
double *xy_Ptr, *rMat_d_Ptr, *rMat_s_Ptr,
396-
*tVec_d_Ptr, *tVec_s_Ptr, *tVec_c_Ptr,
397-
*beamVec_Ptr, *etaVec_Ptr;
397+
*tVec_d_Ptr, *tVec_s_Ptr, *tVec_c_Ptr,
398+
*beamVec_Ptr, *etaVec_Ptr;
398399
double *tTh_Ptr, *eta_Ptr, *gVec_l_Ptr;
399400

400401
/* Parse arguments */
@@ -464,22 +465,30 @@ static PyObject * detectorXYToGvec(PyObject * self, PyObject * args)
464465
tTh_Ptr, eta_Ptr, gVec_l_Ptr);
465466

466467
/* Build and return the nested data structure */
467-
return(Py_BuildValue("OO",Py_BuildValue("OO",tTh,eta),gVec_l));
468+
/* Note that Py_BuildValue with 'O' increases reference count */
469+
inner_tuple = Py_BuildValue("OO",tTh,eta);
470+
outer_tuple = Py_BuildValue("OO", inner_tuple, gVec_l);
471+
Py_DECREF(inner_tuple);
472+
Py_DECREF(tTh);
473+
Py_DECREF(eta);
474+
Py_DECREF(gVec_l);
475+
return outer_tuple;
468476
}
469477

470478
static PyObject * oscillAnglesOfHKLs(PyObject * self, PyObject * args)
471479
{
472480
PyArrayObject *hkls, *rMat_c, *bMat,
473-
*vInv_s, *beamVec, *etaVec;
481+
*vInv_s, *beamVec, *etaVec;
474482
PyFloatObject *chi, *wavelength;
475483
PyArrayObject *oangs0, *oangs1;
484+
PyObject *return_tuple;
476485

477486
int dhkls, drc, dbm, dvi, dbv, dev;
478487
npy_intp npts, dims[2];
479488

480489
double *hkls_Ptr, chi_d,
481-
*rMat_c_Ptr, *bMat_Ptr, wavelen_d,
482-
*vInv_s_Ptr, *beamVec_Ptr, *etaVec_Ptr;
490+
*rMat_c_Ptr, *bMat_Ptr, wavelen_d,
491+
*vInv_s_Ptr, *beamVec_Ptr, *etaVec_Ptr;
483492
double *oangs0_Ptr, *oangs1_Ptr;
484493

485494
/* Parse arguments */
@@ -542,10 +551,14 @@ static PyObject * oscillAnglesOfHKLs(PyObject * self, PyObject * args)
542551
// printf("chi = %g, wavelength = %g\n",PyFloat_AsDouble((PyObject*)chi),PyFloat_AsDouble((PyObject*)wavelength));
543552
/*
544553
np.ascontiguousarray(hkls),chi,rMat_c,bMat,wavelength,
545-
beamVec.flatten(),etaVec.flatten()
554+
beamVec.flatten(),etaVec.flatten()
546555
*/
547556
/* Build and return the list data structure */
548-
return(Py_BuildValue("OO",oangs0,oangs1));
557+
return_tuple = Py_BuildValue("OO",oangs0,oangs1);
558+
Py_DECREF(oangs1);
559+
Py_DECREF(oangs0);
560+
561+
return return_tuple;
549562
}
550563

551564
/******************************************************************************/

0 commit comments

Comments
 (0)