From b8454d623d4d92949a0548b8d1d6bc061e18b11b Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Sebastian=20Dr=C3=B6ge?= Date: Wed, 14 Oct 2009 08:30:07 +0200 Subject: [PATCH] gstobject: Replace recursive gst_object_has_ancestor() with an iterative version 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 | 21 ++++++++++++--------- 1 file changed, 12 insertions(+), 9 deletions(-) diff --git a/gst/gstobject.c b/gst/gstobject.c index 1a679dba00..144834112c 100644 --- a/gst/gstobject.c +++ b/gst/gstobject.c @@ -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; } /**