<div dir="ltr">Additional note on gstreamer version: I am using gstreamer version 1.8.1.<br></div><div class="gmail_extra"><br><div class="gmail_quote">On Thu, Sep 8, 2016 at 1:03 PM, Sanjay Gupta <span dir="ltr"><<a href="mailto:sanjayg417@gmail.com" target="_blank">sanjayg417@gmail.com</a>></span> wrote:<br><blockquote class="gmail_quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex"><div dir="ltr"><div>Hi,<br>Valgrind is showing memory leak in my gstreamer element for which code snippet is given below.<br></div><div><br></div><div></div><div><b>Code snippet:</b><br></div><div><br>1 #define gst_ssm_playback_parent_class parent_class<br>2 G_DEFINE_TYPE (GstSsmPlayback, gst_ssm_playback, GST_TYPE_ELEMENT);<br>3<br>4 static GstStaticPadTemplate src_factory = GST_STATIC_PAD_TEMPLATE ("src",<br>5    GST_PAD_SRC, GST_PAD_ALWAYS,<br>6    GST_STATIC_CAPS (<some valid caps string>)<br>7    );<br>8<br>9  static void gst_ssm_playback_class_init (GstSsmPlaybackClass * klass)<br>10 {<br>11    GObjectClass*    gobject_class = (GObjectClass *) klass;<br>12    GstElementClass* ssm_ply_element_class = (GstElementClass *) klass;<br>13    [...]<br>14    gst_element_class_add_pad_<wbr>template (ssm_ply_element_class, <b>gst_static_pad_template_get (&src_factory));</b><br>15    [...]<br>16    gobject_class->finalize = gst_ssm_playback_finalize;<br>17    gobject_class->dispose  = gst_ssm_playback_dispose;<br>18    [...]<br>19 }<br>20 static void gst_ssm_playback_init (GstSsmPlayback *ssmPlyElem)<br>21 {<br>22    [...]<br>23    <b>ssmPlyElem->srcPad = gst_pad_new_from_static_<wbr>template (&src_factory, "src");</b><br>24    <b>ret = gst_element_add_pad (GST_ELEMENT (ssmPlyElem), ssmPlyElem->srcPad);</b><br>25 }<br>26<br><br>27 static void gst_ssm_playback_dispose(<wbr>GObject * object)<br>28 {<br>29      [...]<br>30    if (ssmPlyElem->srcPad)<br>31       <b> gst_element_remove_pad(GST_<wbr>ELEMENT (ssmPlyElem), ssmPlyElem->srcPad);</b><br>32<br>33     G_OBJECT_CLASS(parent_class)-><wbr>dispose (object);<br>34 }<br><br>35 static void gst_ssm_playback_finalize(<wbr>GObject * object)<br>36 {<br>37     [...]<br>38    G_OBJECT_CLASS(parent_class)-><wbr>finalize (object);<br>39 }<br></div><div><br>I have the following queries and can you please provide your input on this please?<br></div><div><b>Q1</b>. As shown in Line#14 in code snippet above, should I <b>unref</b> pad template object passed in <i>gst_element_class_add_pad_<wbr>template()</i> API? <br>       As per my understanding, it will initially have floating reference and once we pass this object to API <i>gst_element_class_add_pad_<wbr>template()</i>, this API will own pad template object and no need to unref it in the element. Not sure why valgrind is showing this as leak even though dispose/finalize API of this object is called. See below for call stack.<br><div><br><div style="margin-left:40px">==424== 4 bytes in 1 blocks are still reachable in loss record 126 of 7,797<br>==424==    at 0x482F654: malloc (vg_replace_malloc.c:296)<br>==424==    by 0x4C55EA0: g_malloc (gmem.c:97)<br>==424==    by 0x4C6EA54: g_memdup (gstrfuncs.c:384)<br>==424==    by 0x4FBACDC: g_signal_newv (gsignal.c:1661)<br>==424==    by 0x4FBB2D8: g_signal_new_valist (gsignal.c:1831)<br>==424==    by 0x4FBB3CC: g_signal_new (gsignal.c:1373)<br>==424==    by 0x4B25C70: gst_pad_template_class_init (gstpadtemplate.c:146)<br>==424==    by 0x4B25C70: gst_pad_template_class_intern_<wbr>init (gstpadtemplate.c:127)<br>==424==    by 0x4FC2E98: type_class_init_Wm (gtype.c:2236)<br>==424==    by 0x4FC2E98: g_type_class_ref (gtype.c:2951)<br>==424==    by 0x4FAD0D0: g_object_new_valist (gobject.c:1959)<br>==424==    by 0x4FAD5AC: g_object_new (gobject.c:1617)<br>==424==    by 0x4B26438: <b>gst_static_pad_template_get</b> (gstpadtemplate.c:281)<br>==424==    by 0x8083814: gst_otv_ssm_playback_class_<wbr>init (gstssmplayback.c:3895)<br></div></div><div><br></div><div><b>Q2</b>.  We are creating a source pad in line#23 and adding to the element in Ln#24 in code snippet above. As per my understanding, API <b>gst_element_add_pad </b>takes the ownership of the pad object.<br></div><div>Even though dispose/finalize APIs are called and also we are removing this pad from element using gst_element_remove_pad() in dispose function but valgrind is still showing it as leak. We are also chaining the parent's dispose & finalize functions. can you please provide your input on this?<br></div><div><br></div><div style="margin-left:40px">==441== 4,377 (36 direct, 4,341 indirect) bytes in 3 blocks are definitely lost in loss record 8,528 of 8,612<br>==441== at 0x482F654: malloc (vg_replace_malloc.c:296)<br>==441== by 0x4C5AE90: g_malloc (gmem.c:97)<br>==441== by 0x4C71AE8: g_slice_alloc (gslice.c:1009)<br>==441== by 0x4C4F49C: g_list_append (glist.c:261)<br><b>==441== by 0x4B00150: gst_element_add_pad (gstelement.c:698)</b><br><b>==441== by 0x13E09CD0: gst_ssm_playback_init (gstotvssmplayback.c:4165)</b><br><br><br>==441== 18,967 (4,004 direct, 14,963 indirect) bytes in 13 blocks are definitely lost in loss record 8,569 of 8,612<br>==441== at 0x4FC9B0C: g_type_create_instance (gtype.c:1848)<br>==441== by 0x4FAFF7C: g_object_new_internal (gobject.c:1774)<br>==441== by 0x4FB2230: g_object_new_valist (gobject.c:2033)<br>==441== by 0x4FB258C: g_object_new (gobject.c:1617)<br><b>==441== by 0x4B20C34: gst_pad_new_from_template (gstpad.c:857)</b><br><b>==441== by 0x4B20C8C: gst_pad_new_from_static_<wbr>template (gstpad.c:882)</b><br>==441== by 0x13E09C04: gst_ssm_playback_init (gstotvssmplayback.c:4155)<br></div><br>Thanks a lot in advance for your input/suggestion.<br></div><div><br>Thanks & Regards,<br></div>Sanjay<br></div>
</blockquote></div><br></div>