Install an invalidation notifier for GClosure in g_source_set_closure()
[platform/upstream/glib.git] / gobject / gsourceclosure.c
index 644a1e0..16f34ee 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;