ext/py-filter.c: continue fixing memory leak (#49)
authorPaul Brossier <piem@piem.org>
Mon, 18 Apr 2016 19:14:41 +0000 (21:14 +0200)
committerPaul Brossier <piem@piem.org>
Mon, 18 Apr 2016 19:14:41 +0000 (21:14 +0200)
python/ext/py-filter.c

index 416bba8..ab1ee76 100644 (file)
@@ -5,6 +5,7 @@ typedef struct
   PyObject_HEAD
   aubio_filter_t * o;
   uint_t order;
+  fvec_t *out;
 } Py_filter;
 
 static char Py_filter_doc[] = "filter object";
@@ -47,13 +48,14 @@ Py_filter_init (Py_filter * self, PyObject * args, PyObject * kwds)
   if (self->o == NULL) {
     return -1;
   }
-
+  self->out = new_fvec(Py_default_vector_length);
   return 0;
 }
 
 static void
 Py_filter_del (Py_filter * self)
 {
+  del_fvec(self->out);
   del_aubio_filter (self->o);
   self->ob_type->tp_free ((PyObject *) self);
 }
@@ -78,10 +80,14 @@ Py_filter_do(Py_filter * self, PyObject * args)
     return NULL;
   }
 
+  // reallocate the output if needed
+  if (vec->length != self->out->length) {
+    del_fvec(self->out);
+    self->out = new_fvec(vec->length);
+  }
   // compute the function
-  fvec_t * out = new_fvec(vec->length);
-  aubio_filter_do_outplace (self->o, vec, out);
-  return PyAubio_CFvecToArray(out);
+  aubio_filter_do_outplace (self->o, vec, self->out);
+  return PyAubio_CFvecToArray(self->out);
 }
 
 static PyObject *