mirror of
https://gitlab.freedesktop.org/gstreamer/gstreamer.git
synced 2024-11-27 04:01:08 +00:00
Fix memleak in gst.Pad.set_blocked_async()
Original commit message from CVS: reviewed by: Edward Hervey <edward.hervey@collabora.co.uk> * gst/gstpad.override: * testsuite/test_pad.py: Fix memleak in gst.Pad.set_blocked_async() Fixes #514717
This commit is contained in:
parent
23379fcd1c
commit
c68b638588
3 changed files with 42 additions and 0 deletions
|
@ -1,3 +1,11 @@
|
||||||
|
2008-02-10 Alessandro Decina <alessandro@nnva.org>
|
||||||
|
|
||||||
|
reviewed by: Edward Hervey <edward.hervey@collabora.co.uk>
|
||||||
|
* gst/gstpad.override:
|
||||||
|
* testsuite/test_pad.py:
|
||||||
|
Fix memleak in gst.Pad.set_blocked_async()
|
||||||
|
Fixes #514717
|
||||||
|
|
||||||
2008-02-10 Edward Hervey <edward.hervey@collabora.co.uk>
|
2008-02-10 Edward Hervey <edward.hervey@collabora.co.uk>
|
||||||
|
|
||||||
* gst/gstpad.override:
|
* gst/gstpad.override:
|
||||||
|
|
|
@ -1343,6 +1343,7 @@ pad_block_callback_marshal(GstPad *pad, gboolean blocked, gpointer user_data)
|
||||||
|
|
||||||
ret = PyObject_CallObject(callback, args);
|
ret = PyObject_CallObject(callback, args);
|
||||||
Py_DECREF(args);
|
Py_DECREF(args);
|
||||||
|
Py_DECREF(py_user_data);
|
||||||
|
|
||||||
if (!ret)
|
if (!ret)
|
||||||
PyErr_Print();
|
PyErr_Print();
|
||||||
|
|
|
@ -516,5 +516,38 @@ class PadRefCountTest(TestCase):
|
||||||
self.assertEquals(self.gccollect(), 1) # collected the pad
|
self.assertEquals(self.gccollect(), 1) # collected the pad
|
||||||
gst.debug('going into teardown')
|
gst.debug('going into teardown')
|
||||||
|
|
||||||
|
class PadBlockRefcountTest(TestCase):
|
||||||
|
def testCallbackRefcount(self):
|
||||||
|
def blocked_cb(pad, blocked):
|
||||||
|
self.assertTrue(pad.set_blocked_async(False, unblocked_cb))
|
||||||
|
|
||||||
|
def unblocked_cb(pad, blocked):
|
||||||
|
pass
|
||||||
|
|
||||||
|
cb_refcount = sys.getrefcount(blocked_cb)
|
||||||
|
# sys.getrefcount() returns refcount + 1
|
||||||
|
self.assertEquals(cb_refcount, 2)
|
||||||
|
|
||||||
|
fakesrc = gst.element_factory_make('fakesrc')
|
||||||
|
fakesrc.props.num_buffers = 2
|
||||||
|
fakesink = gst.element_factory_make('fakesink')
|
||||||
|
|
||||||
|
pipeline = gst.Pipeline()
|
||||||
|
pipeline.add(fakesrc, fakesink)
|
||||||
|
|
||||||
|
fakesrc.link(fakesink)
|
||||||
|
|
||||||
|
pad = fakesrc.get_pad('src')
|
||||||
|
pad.set_blocked_async(True, blocked_cb)
|
||||||
|
|
||||||
|
pipeline.set_state(gst.STATE_PLAYING)
|
||||||
|
pipeline.get_bus().poll(gst.MESSAGE_EOS, -1)
|
||||||
|
pipeline.set_state(gst.STATE_NULL)
|
||||||
|
|
||||||
|
# check that we don't leak a ref to the callback
|
||||||
|
cb_refcount_after = sys.getrefcount(blocked_cb)
|
||||||
|
self.assertEquals(cb_refcount_after, cb_refcount)
|
||||||
|
|
||||||
|
|
||||||
if __name__ == "__main__":
|
if __name__ == "__main__":
|
||||||
unittest.main()
|
unittest.main()
|
||||||
|
|
Loading…
Reference in a new issue