gstobject: Replace recursive gst_object_has_ancestor() with an iterative version
authorSebastian Dröge <sebastian.droege@collabora.co.uk>
Wed, 14 Oct 2009 06:30:07 +0000 (08:30 +0200)
committerSebastian Dröge <sebastian.droege@collabora.co.uk>
Wed, 14 Oct 2009 06:34:03 +0000 (08:34 +0200)
This is slightly more efficient because the compiler can't do tail
recursion here and has to keep all stack frames.

Not that efficiency is that important here but I already had
the iterative version somewhere else and both are easy to read.

gst/gstobject.c

index 1a679db..1448341 100644 (file)
@@ -883,21 +883,24 @@ gst_object_unparent (GstObject * object)
 gboolean
 gst_object_has_ancestor (GstObject * object, GstObject * ancestor)
 {
-  GstObject *parent;
-  gboolean result = FALSE;
+  GstObject *parent, *tmp;
 
-  if (object == NULL)
+  if (!ancestor || !object)
     return FALSE;
 
-  if (object == ancestor)
-    return TRUE;
+  parent = gst_object_ref (object);
+  do {
+    if (parent == ancestor) {
+      gst_object_unref (parent);
+      return TRUE;
+    }
 
-  parent = gst_object_get_parent (object);
-  result = gst_object_has_ancestor (parent, ancestor);
-  if (parent)
+    tmp = gst_object_get_parent (parent);
     gst_object_unref (parent);
+    parent = tmp;
+  } while (parent);
 
-  return result;
+  return FALSE;
 }
 
 /**