proxysink: Fix GstProxySrc leak
authorSeungha Yang <seungha@centricular.com>
Wed, 6 Jul 2022 17:17:56 +0000 (02:17 +0900)
committerSeungha Yang <seungha@centricular.com>
Wed, 6 Jul 2022 20:54:54 +0000 (05:54 +0900)
Clear weak pointer to peer src when disposing.

Part-of: <https://gitlab.freedesktop.org/gstreamer/gstreamer/-/merge_requests/1552>

subprojects/gst-plugins-bad/gst/proxy/gstproxysink.c

index 9b5b80507a4ce1de4a12e84f386dab9b5b97c1cf..c5f47e42eb056a66ff256c4bd75d66c7817ed430 100644 (file)
@@ -57,6 +57,7 @@ G_DEFINE_TYPE (GstProxySink, gst_proxy_sink, GST_TYPE_ELEMENT);
 GST_ELEMENT_REGISTER_DEFINE (proxysink, "proxysink", GST_RANK_NONE,
     GST_TYPE_PROXY_SINK);
 
+static void gst_proxy_sink_dispose (GObject * object);
 static gboolean gst_proxy_sink_sink_query (GstPad * pad, GstObject * parent,
     GstQuery * query);
 static GstFlowReturn gst_proxy_sink_sink_chain (GstPad * pad,
@@ -76,10 +77,13 @@ static gboolean gst_proxy_sink_query (GstElement * element, GstQuery * query);
 static void
 gst_proxy_sink_class_init (GstProxySinkClass * klass)
 {
-  GstElementClass *gstelement_class = (GstElementClass *) klass;
+  GObjectClass *object_class = G_OBJECT_CLASS (klass);
+  GstElementClass *gstelement_class = GST_ELEMENT_CLASS (klass);
 
   GST_DEBUG_CATEGORY_INIT (gst_proxy_sink_debug, "proxysink", 0, "proxy sink");
 
+  object_class->dispose = gst_proxy_sink_dispose;
+
   gstelement_class->change_state = gst_proxy_sink_change_state;
   gstelement_class->send_event = gst_proxy_sink_send_event;
   gstelement_class->query = gst_proxy_sink_query;
@@ -109,6 +113,16 @@ gst_proxy_sink_init (GstProxySink * self)
   GST_OBJECT_FLAG_SET (self, GST_ELEMENT_FLAG_SINK);
 }
 
+static void
+gst_proxy_sink_dispose (GObject * object)
+{
+  GstProxySink *self = GST_PROXY_SINK (object);
+
+  g_weak_ref_clear (&self->proxysrc);
+
+  G_OBJECT_CLASS (parent_class)->dispose (object);
+}
+
 static GstStateChangeReturn
 gst_proxy_sink_change_state (GstElement * element, GstStateChange transition)
 {