actor: Make _clutter_actor_foreach_child() safe again
authorEmmanuele Bassi <ebassi@linux.intel.com>
Thu, 29 Mar 2012 14:52:51 +0000 (15:52 +0100)
committerEmmanuele Bassi <ebassi@linux.intel.com>
Thu, 29 Mar 2012 14:52:51 +0000 (15:52 +0100)
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

index 906f2c0..c7740be 100644 (file)
@@ -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;