[gst-devel] Gst-python object cleanup

Edward Hervey bilboed at gmail.com
Thu Oct 29 10:54:05 CET 2009


Hi,

On Thu, 2009-10-29 at 02:08 -0700, Ron McOuat wrote:
> Hello Python gstreamer devs, users,
> 
> I have a long running application written in Python recording from a 
> live source which is an IP camera such as what Axis produces. The video 
> source is connected to a tee sink pad after processing and then from one 
> of the tee src pads I dynamically connect a queue, Arnout's resettime, 
> matroska mux and filesink to store the mjpeg stream. When I am done with 
> one file recording I remove the recording bin by disconnecting from the 
> tee and removing the bin from the pipeline. When I need to record again 
> I build a new recording bin and attach to the tee. The next file could 
> start recording on the next frame from the source so I use pad blocking 
> during the record bin swap.
> 
> This is all working properly for me at this point except for one thing. 
> As part of the stress testing phase I set the program to stop the 
> recording bin and create a new one once per minute. What I find is the 
> bin number and bus numbers in the recording bin detected by Python print 
> bus or print bin are increasing with each cycle and the program slowly 
> grows. After 12 hours of this the program has gone from 10 MBytes to 
> about 40 MBytes. This is enough of a memory leak to eventually cause me 
> problems. Most of the example programs I see are short lived and cleanup 
> by exiting.
> 
> When I destroy a record bin I remove it from the pipeline and set the 
> state to gst.STATE_NULL and have added code to unlink all the elements 
> inside the bin and then remove the elements from the bin. Finally I set 
> the Python variable holding the recording bin to None. Is there 
> something I missed in the cleanup process possibly equivalent to the C 
> unref on a Gobject? I am presuming the Python elements, bins and 
> pipeline etc are proxy objects that are wrappers to the C objects. I 
> have also considered that maybe I shouldn't be doing this in this manner 
> but I ran into lots of time issues trying to reuse the recording bin.
> 

  The description of how you get rid of your pipelines seems correct.

  There's only one other thing that *could* go wrong, is if you're using
a signal watch on the bus, you should remove it (i.e.
gst.Bus.remove_signal_watch()).

  If you've made sure that's correct, I'd then suggest to start tracing
the leaks at the python level. There's a couple of good articles/tools
to do that:
  http://www.lshift.net/blog/2008/11/14/tracing-python-memory-leaks
  http://mg.pov.lt/blog/hunting-python-memleaks
  And you can also have a look at how debugging memory leaks is done in
the gst-python testsuite (gst-python/tests/common.py)

    Edward

> Thanks for any suggestion.
> 
> Ron McOuat
> 
> 
> 
> ------------------------------------------------------------------------------
> Come build with us! The BlackBerry(R) Developer Conference in SF, CA
> is the only developer event you need to attend this year. Jumpstart your
> developing skills, take BlackBerry mobile applications to market and stay 
> ahead of the curve. Join us from November 9 - 12, 2009. Register now!
> http://p.sf.net/sfu/devconference
> _______________________________________________
> gstreamer-devel mailing list
> gstreamer-devel at lists.sourceforge.net
> https://lists.sourceforge.net/lists/listinfo/gstreamer-devel





More information about the gstreamer-devel mailing list