From f288f7043f5e5f28c1a1b5e29aab9e8d6aaa90fc Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Sebastian=20Dr=C3=B6ge?= Date: Mon, 7 Feb 2022 09:46:46 +0200 Subject: [PATCH] bufferpool: Deactivate pool and get rid of references to other objects from dispose instead of finalize During dispose the pool will still have a reference count of 1 and all API on it can still be safely called. Subclasses will have already freed their own data before finalize is called but would nonetheless be called into again via the pool deactivation. Part-of: --- subprojects/gstreamer/gst/gstbufferpool.c | 22 +++++++++++++++++++--- 1 file changed, 19 insertions(+), 3 deletions(-) diff --git a/subprojects/gstreamer/gst/gstbufferpool.c b/subprojects/gstreamer/gst/gstbufferpool.c index 4d0bdf4565..96192cf649 100644 --- a/subprojects/gstreamer/gst/gstbufferpool.c +++ b/subprojects/gstreamer/gst/gstbufferpool.c @@ -112,6 +112,7 @@ struct _GstBufferPoolPrivate GstAllocationParams params; }; +static void gst_buffer_pool_dispose (GObject * object); static void gst_buffer_pool_finalize (GObject * object); G_DEFINE_TYPE_WITH_PRIVATE (GstBufferPool, gst_buffer_pool, GST_TYPE_OBJECT); @@ -133,6 +134,7 @@ gst_buffer_pool_class_init (GstBufferPoolClass * klass) { GObjectClass *gobject_class = (GObjectClass *) klass; + gobject_class->dispose = gst_buffer_pool_dispose; gobject_class->finalize = gst_buffer_pool_finalize; klass->start = default_start; @@ -177,6 +179,23 @@ gst_buffer_pool_init (GstBufferPool * pool) GST_DEBUG_OBJECT (pool, "created"); } +static void +gst_buffer_pool_dispose (GObject * object) +{ + GstBufferPool *pool; + GstBufferPoolPrivate *priv; + + pool = GST_BUFFER_POOL_CAST (object); + priv = pool->priv; + + GST_DEBUG_OBJECT (pool, "%p dispose", pool); + + gst_buffer_pool_set_active (pool, FALSE); + gst_clear_object (&priv->allocator); + + G_OBJECT_CLASS (gst_buffer_pool_parent_class)->dispose (object); +} + static void gst_buffer_pool_finalize (GObject * object) { @@ -188,13 +207,10 @@ gst_buffer_pool_finalize (GObject * object) GST_DEBUG_OBJECT (pool, "%p finalize", pool); - gst_buffer_pool_set_active (pool, FALSE); gst_atomic_queue_unref (priv->queue); gst_poll_free (priv->poll); gst_structure_free (priv->config); g_rec_mutex_clear (&priv->rec_lock); - if (priv->allocator) - gst_object_unref (priv->allocator); G_OBJECT_CLASS (gst_buffer_pool_parent_class)->finalize (object); }