[clutter] actor: Make _clutter_actor_foreach_child() safe again



commit d45420f992f3a277ef12d83281ac60981e4c75ac
Author: Emmanuele Bassi <ebassi linux intel com>
Date:   Thu Mar 29 15:52:51 2012 +0100

    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 files changed, 14 insertions(+), 4 deletions(-)
---
diff --git a/clutter/clutter-actor.c b/clutter/clutter-actor.c
index 906f2c0..c7740be 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;



[Date Prev][Date Next]   [Thread Prev][Thread Next]   [Thread Index] [Date Index] [Author Index]