Install an invalidation notifier for GClosure in g_source_set_closure()
authorGiovanni Campagna <gcampagna@src.gnome.org>
Thu, 3 Jan 2013 21:53:06 +0000 (22:53 +0100)
committerGiovanni Campagna <gcampagna@src.gnome.org>
Sun, 20 Jan 2013 15:23:32 +0000 (16:23 +0100)
The point of g_source_set_closure() is getting memory management right,
including handling closures disappearing from the outside (for example
because a runtime they refer to is being shutdown). This means that
sources with an associated closure should remove themselves from the
main loop and free memory when the closure is invalidated.

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

gobject/gsourceclosure.c

index 644a1e0285add93326e7ef7bcf5924bdb78cc59e..16f34ee6cac267328be7c292fa9d514f372093c8 100644 (file)
@@ -145,6 +145,13 @@ static GSourceCallbackFuncs closure_callback_funcs = {
   closure_callback_get
 };
 
+static void
+closure_invalidated (gpointer  user_data,
+                     GClosure *closure)
+{
+  g_source_destroy (user_data);
+}
+
 /**
  * g_source_set_closure:
  * @source: the source
@@ -176,6 +183,8 @@ g_source_set_closure (GSource  *source,
   g_closure_sink (closure);
   g_source_set_callback_indirect (source, closure, &closure_callback_funcs);
 
+  g_closure_add_invalidate_notifier (closure, source, closure_invalidated);
+
   if (G_CLOSURE_NEEDS_MARSHAL (closure))
     {
       GClosureMarshal marshal = (GClosureMarshal)source->source_funcs->closure_marshal;