[clutter] group: Handle list modification while destroying children



commit ddc9eb5fa5326904852951a3fa00159bed75fde1
Author: Robert Bragg <robert linux intel com>
Date:   Fri Jun 17 16:23:35 2011 +0100

    group: Handle list modification while destroying children
    
    This makes the dispose code that destroys children resilient against
    priv->children being modified during child destruction.

 clutter/clutter-group.c |   12 +++++++-----
 1 files changed, 7 insertions(+), 5 deletions(-)
---
diff --git a/clutter/clutter-group.c b/clutter/clutter-group.c
index d6c9897..41cb7d0 100644
--- a/clutter/clutter-group.c
+++ b/clutter/clutter-group.c
@@ -350,12 +350,14 @@ clutter_group_dispose (GObject *object)
   ClutterGroup *self = CLUTTER_GROUP (object);
   ClutterGroupPrivate *priv = self->priv;
 
-  if (priv->children)
+  /* Note: we are careful to consider that destroying children could
+   * have the side-effect of destroying other children so
+   * priv->children may be modified during clutter_actor_destroy. */
+  while (priv->children)
     {
-      g_list_foreach (priv->children, (GFunc) clutter_actor_destroy, NULL);
-      g_list_free (priv->children);
-
-      priv->children = NULL;
+      ClutterActor *child = priv->children->data;
+      priv->children = g_list_delete_link (priv->children, priv->children);
+      clutter_actor_destroy (child);
     }
 
   if (priv->layout)



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