gmain: Unref child sources when finalising a GSource
authorPhilip Withnall <philip.withnall@collabora.co.uk>
Thu, 25 Sep 2014 08:51:25 +0000 (09:51 +0100)
committerPhilip Withnall <philip.withnall@collabora.co.uk>
Thu, 25 Sep 2014 12:59:25 +0000 (13:59 +0100)
If a GSource is created, *not* attached to a GMainContext, and then has
child sources added, dropping the last reference to the parent GSource
will leak its references to its child sources. Currently, child sources
are only unreffed when g_source_destroy() is called on the parent.

https://bugzilla.gnome.org/show_bug.cgi?id=737338

glib/gmain.c

index 71c816b..47e7749 100644 (file)
@@ -2026,6 +2026,17 @@ g_source_unref_internal (GSource      *source,
 
       g_slist_free_full (source->priv->fds, g_free);
 
+      while (source->priv->child_sources)
+        {
+          GSource *child_source = source->priv->child_sources->data;
+
+          source->priv->child_sources =
+            g_slist_remove (source->priv->child_sources, child_source);
+          child_source->priv->parent_source = NULL;
+
+          g_source_unref_internal (child_source, context, have_lock);
+        }
+
       g_slice_free (GSourcePrivate, source->priv);
       source->priv = NULL;