[gst-cvs] gnonlin: gnlcomposition: fail early in remove_object when removing an invalid object.

Alessandro Decina alessandro at kemper.freedesktop.org
Fri Aug 27 13:53:09 PDT 2010


Module: gnonlin
Branch: master
Commit: 00b4bfa48f23e671b40c36e428ebfc224f0e3c9c
URL:    http://cgit.freedesktop.org/gstreamer/gnonlin/commit/?id=00b4bfa48f23e671b40c36e428ebfc224f0e3c9c

Author: Alessandro Decina <alessandro.decina at collabora.co.uk>
Date:   Thu Aug 19 15:10:25 2010 +0200

gnlcomposition: fail early in remove_object when removing an invalid object.

Make gnl_composition_remove_object return immediately FALSE when removing an
object not contained in the composition.

---

 gnl/gnlcomposition.c             |   15 +++++++++------
 tests/check/gnl/gnlcomposition.c |   20 ++++++++++++++++++++
 2 files changed, 29 insertions(+), 6 deletions(-)

diff --git a/gnl/gnlcomposition.c b/gnl/gnlcomposition.c
index 1c4e62d..fe16f6d 100644
--- a/gnl/gnlcomposition.c
+++ b/gnl/gnlcomposition.c
@@ -2609,6 +2609,12 @@ gnl_composition_remove_object (GstBin * bin, GstElement * element)
 
   COMP_OBJECTS_LOCK (comp);
 
+  entry = COMP_ENTRY (comp, element);
+  if (entry == NULL) {
+    COMP_OBJECTS_UNLOCK (comp);
+    goto out;
+  }
+
   gst_object_ref (element);
 
   gst_element_set_locked_state (element, FALSE);
@@ -2629,8 +2635,7 @@ gnl_composition_remove_object (GstBin * bin, GstElement * element)
     GST_LOG_OBJECT (element, "Removed from the objects start/stop list");
   }
 
-  if (!(g_hash_table_remove (comp->priv->objects_hash, element)))
-    goto chiringuito;
+  g_hash_table_remove (comp->priv->objects_hash, element);
 
   update_required = OBJECT_IN_ACTIVE_SEGMENT (comp, element) ||
       (GNL_OBJECT_PRIORITY (element) == G_MAXUINT32) ||
@@ -2671,9 +2676,7 @@ beach:
   }
 
   gst_object_unref (element);
-  return ret;
 
-chiringuito:
-  COMP_OBJECTS_UNLOCK (comp);
-  goto beach;
+out:
+  return ret;
 }
diff --git a/tests/check/gnl/gnlcomposition.c b/tests/check/gnl/gnlcomposition.c
index dcb4f1a..9063a1c 100644
--- a/tests/check/gnl/gnlcomposition.c
+++ b/tests/check/gnl/gnlcomposition.c
@@ -214,6 +214,25 @@ GST_START_TEST (test_change_object_start_stop_in_current_stack)
 
 GST_END_TEST;
 
+GST_START_TEST (test_remove_invalid_object)
+{
+  GstBin *composition;
+  GstElement *source1, *source2;
+
+  composition = GST_BIN (gst_element_factory_make ("gnlcomposition",
+          "composition"));
+  source1 = gst_element_factory_make ("gnlsource", "source1");
+  source2 = gst_element_factory_make ("gnlsource", "source2");
+
+  gst_bin_add (composition, source1);
+  fail_if (gst_bin_remove (composition, source2));
+  fail_unless (gst_bin_remove (composition, source1));
+
+  gst_object_unref (composition);
+}
+
+GST_END_TEST;
+
 Suite *
 gnonlin_suite (void)
 {
@@ -223,6 +242,7 @@ gnonlin_suite (void)
   suite_add_tcase (s, tc_chain);
 
   tcase_add_test (tc_chain, test_change_object_start_stop_in_current_stack);
+  tcase_add_test (tc_chain, test_remove_invalid_object);
 
   return s;
 }





More information about the Gstreamer-commits mailing list