From d45420f992f3a277ef12d83281ac60981e4c75ac Mon Sep 17 00:00:00 2001 From: Emmanuele Bassi Date: Thu, 29 Mar 2012 15:52:51 +0100 Subject: [PATCH] actor: Make _clutter_actor_foreach_child() safe again We were using g_list_foreach() prior to the first Apocalypse, and that function is resilient against changes to the list while iterating it; since we are not using a GList any more, we need handle this case ourselves. --- clutter/clutter-actor.c | 18 ++++++++++++++---- 1 file changed, 14 insertions(+), 4 deletions(-) diff --git a/clutter/clutter-actor.c b/clutter/clutter-actor.c index 906f2c0ae..c7740be40 100644 --- a/clutter/clutter-actor.c +++ b/clutter/clutter-actor.c @@ -15801,15 +15801,25 @@ _clutter_actor_foreach_child (ClutterActor *self, ClutterForeachCallback callback, gpointer user_data) { - ClutterActorPrivate *priv = self->priv; ClutterActor *iter; gboolean cont; - for (cont = TRUE, iter = priv->first_child; - cont && iter != NULL; - iter = iter->priv->next_sibling) + if (self->priv->first_child == NULL) + return TRUE; + + cont = TRUE; + iter = self->priv->first_child; + + /* we use this form so that it's safe to change the children + * list while iterating it + */ + while (cont && iter != NULL) { + ClutterActor *next = iter->priv->next_sibling; + cont = callback (iter, user_data); + + iter = next; } return cont;