python/: use Py_RETURN_NONE, fixing a memory bug triggered after opening many sinks
authorPaul Brossier <piem@piem.org>
Fri, 8 Mar 2013 02:52:01 +0000 (21:52 -0500)
committerPaul Brossier <piem@piem.org>
Fri, 8 Mar 2013 02:52:01 +0000 (21:52 -0500)
python/ext/aubiomodule.c
python/ext/py-filter.c
python/ext/py-filterbank.c
python/gen_pyobject.py
python/tests/test_sink.py

index 3f3ee277dad9906af5f83c829ea81ee49dad2162..5afcee56eb324daad017411884b2e0b8fb1049d4 100644 (file)
@@ -164,7 +164,7 @@ Py_min_removal(PyObject * self, PyObject * args)
   fvec_min_removal (vec);
 
   // since this function does not return, we could return None
-  //return Py_None;
+  //Py_RETURN_NONE;
   // however it is convenient to return the modified vector
   return (PyObject *) PyAubio_CFvecToArray(vec);
   // or even without converting it back to an array
index 5b9fee6457326be0e075431f0852ae144e213b0d..416bba833861d0f81d8b02f4cd451ff6a68bd02f 100644 (file)
@@ -99,7 +99,7 @@ Py_filter_set_c_weighting (Py_filter * self, PyObject *args)
         "error when setting filter to C-weighting");
     return NULL;
   }
-  return Py_None;
+  Py_RETURN_NONE;
 }
 
 static PyObject * 
@@ -117,7 +117,7 @@ Py_filter_set_a_weighting (Py_filter * self, PyObject *args)
         "error when setting filter to A-weighting");
     return NULL;
   }
-  return Py_None;
+  Py_RETURN_NONE;
 }
 
 static PyObject *
@@ -135,7 +135,7 @@ Py_filter_set_biquad(Py_filter * self, PyObject *args)
         "error when setting filter with biquad coefficients");
     return NULL;
   }
-  return Py_None;
+  Py_RETURN_NONE;
 }
 
 static PyMemberDef Py_filter_members[] = {
index cc0da4811c778c9829b860ed840acfb9291e2184..60e5c5d29aeb2df37cb4a7e210d8fdd4f249a968 100644 (file)
@@ -109,7 +109,7 @@ Py_filterbank_set_triangle_bands (Py_filterbank * self, PyObject *args)
         "error when setting filter to A-weighting");
     return NULL;
   }
-  return Py_None;
+  Py_RETURN_NONE;
 }
 
 static PyObject *
@@ -128,7 +128,7 @@ Py_filterbank_set_mel_coeffs_slaney (Py_filterbank * self, PyObject *args)
         "error when setting filter to A-weighting");
     return NULL;
   }
-  return Py_None;
+  Py_RETURN_NONE;
 }
 
 static PyObject *
@@ -158,7 +158,7 @@ Py_filterbank_set_coeffs (Py_filterbank * self, PyObject *args)
         "error when setting filter coefficients");
     return NULL;
   }
-  return Py_None;
+  Py_RETURN_NONE;
 }
 
 static PyObject *
index 20f4534a14c1d79ae4b6b946df74c5c28d7f232e..91c427ac31bed15271d6e7c3e1d70d5b4eac6fd8 100644 (file)
@@ -342,7 +342,7 @@ def gen_do_output_params(outputparams, name):
     else:
       returnval += "  return (PyObject *)" + aubiovectopyobj[p['type']] + " (" + p['name'] + ")"
   else:
-    returnval = "  return Py_None;";
+    returnval += "  Py_RETURN_NONE"
   # end of output strings
   return outputvecs, outputcreate, returnval
 
@@ -473,7 +473,7 @@ Py%(funcname)s (Py_%(objname)s *self, PyObject *args)
         "error running %(funcname)s");
     return NULL;
   }
-  return Py_None;
+  Py_RETURN_NONE;
 }
 """ % {'funcname': method_name, 'objname': name, 
         'out_type': out_type, 'setter_args': setter_args, 'parse_args': parse_args }
index f0104d11ad5e28a0885c3a975225dbfbf12f45bb..033ba5468044df878698146eafd584044a5a0d60 100755 (executable)
@@ -13,6 +13,15 @@ class aubio_sink_test_case(TestCase):
     def setUp(self):
         if not len(list_of_sounds): self.skipTest('add some sound files in \'python/tests/sounds\'')
 
+    def test_many_sinks(self):
+        for i in range(100):
+            g = sink('/tmp/f.wav', 0)
+            write = 256
+            for n in range(200):
+                vec = fvec(write)
+                g(vec, write)
+            del g
+
     def test_read(self):
         for path in list_of_sounds:
             for samplerate, hop_size in zip([0, 44100, 8000, 32000], [512, 1024, 64, 256]):
@@ -30,8 +39,8 @@ class aubio_sink_test_case(TestCase):
                 print total_frames / f.hop_size, "blocks", "at", "%dHz" % f.samplerate, ")",
                 print "from", f.uri,
                 print "to", g.uri
+                #del f, g
 
 if __name__ == '__main__':
-  from unittest import main
-  main()
-
+    from unittest import main
+    main()