v4l2bufferpool: implement dispose method
authorAurélien Zanelli <aurelien.zanelli@parrot.com>
Wed, 8 Oct 2014 08:31:21 +0000 (10:31 +0200)
committerNicolas Dufresne <nicolas.dufresne@collabora.com>
Wed, 29 Oct 2014 20:24:11 +0000 (16:24 -0400)
Unref objects in dispose method rather than in finalize in order to
prevent circular reference.

https://bugzilla.gnome.org/show_bug.cgi?id=738102

sys/v4l2/gstv4l2bufferpool.c

index 90215e0..dba69e7 100644 (file)
@@ -1319,7 +1319,7 @@ gst_v4l2_buffer_pool_release_buffer (GstBufferPool * bpool, GstBuffer * buffer)
 }
 
 static void
-gst_v4l2_buffer_pool_finalize (GObject * object)
+gst_v4l2_buffer_pool_dispose (GObject * object)
 {
   GstV4l2BufferPool *pool = GST_V4L2_BUFFER_POOL (object);
   gint i;
@@ -1329,21 +1329,35 @@ gst_v4l2_buffer_pool_finalize (GObject * object)
       gst_buffer_replace (&(pool->buffers[i]), NULL);
   }
 
-  if (pool->video_fd >= 0)
-    v4l2_close (pool->video_fd);
-
-  gst_poll_free (pool->poll);
-
   if (pool->vallocator)
     gst_object_unref (pool->vallocator);
+  pool->vallocator = NULL;
 
   if (pool->allocator)
     gst_object_unref (pool->allocator);
+  pool->allocator = NULL;
 
   if (pool->other_pool)
     gst_object_unref (pool->other_pool);
+  pool->other_pool = NULL;
+
+  G_OBJECT_CLASS (parent_class)->dispose (object);
+}
+
+static void
+gst_v4l2_buffer_pool_finalize (GObject * object)
+{
+  GstV4l2BufferPool *pool = GST_V4L2_BUFFER_POOL (object);
+
+  if (pool->video_fd >= 0)
+    v4l2_close (pool->video_fd);
+
+  gst_poll_free (pool->poll);
 
-  /* FIXME Is this required to keep around ? */
+  /* FIXME Is this required to keep around ?
+   * This can't be done in dispose method because we must not set pointer
+   * to NULL as it is part of the v4l2object and dispose could be called
+   * multiple times */
   gst_object_unref (pool->obj->element);
 
   g_cond_clear (&pool->empty_cond);
@@ -1368,6 +1382,7 @@ gst_v4l2_buffer_pool_class_init (GstV4l2BufferPoolClass * klass)
   GObjectClass *object_class = G_OBJECT_CLASS (klass);
   GstBufferPoolClass *bufferpool_class = GST_BUFFER_POOL_CLASS (klass);
 
+  object_class->dispose = gst_v4l2_buffer_pool_dispose;
   object_class->finalize = gst_v4l2_buffer_pool_finalize;
 
   bufferpool_class->start = gst_v4l2_buffer_pool_start;