Index: tests/test_subtype.py
===================================================================
--- tests/test_subtype.py	(revision 955)
+++ tests/test_subtype.py	(working copy)
@@ -3,7 +3,7 @@
 import gc
 
 import testmodule
-from common import gobject, testhelper
+from common import glib, gobject, gio, testhelper
 
 # FIXME: do not import gtk
 import gtk
@@ -270,3 +270,28 @@
         foo = Foo()
         d = foo.__dict__
 
+    def test_func_closure(self):
+        variables = []
+
+        def make_cancellable():
+            cancellable = gio.Cancellable()
+            def on_cancelled(*args):
+                variables.append (cancellable)
+            cancellable.connect('cancelled', on_cancelled)
+            return cancellable
+
+        # This is a dummy object only need to avoid Python reference
+        # to the callable (only reference will be hold by C GIO).
+        x = gio.FileInfo()
+        x.set_attribute_object('cancellable', make_cancellable())
+
+        gc.collect()
+
+        loop = glib.MainLoop()
+
+        glib.idle_add(lambda: x.get_attribute_object('cancellable').cancel())
+        glib.idle_add(lambda: loop.quit())
+
+        loop.run()
+
+        self.assert_(variables and isinstance(variables[0], gio.Cancellable))
Index: gobject/pygobject.c
===================================================================
--- gobject/pygobject.c	(revision 955)
+++ gobject/pygobject.c	(working copy)
@@ -1040,18 +1040,19 @@
     if (ret != 0) return ret;
 
     if (data) {
-
         for (tmp = data->closures; tmp != NULL; tmp = tmp->next) {
             PyGClosure *closure = tmp->data;
 
-            if (closure->callback) ret = visit(closure->callback, arg);
-            if (ret != 0) return ret;
-
-            if (closure->extra_args) ret = visit(closure->extra_args, arg);
-            if (ret != 0) return ret;
-
-            if (closure->swap_data) ret = visit(closure->swap_data, arg);
-            if (ret != 0) return ret;
+            if (self->obj->ref_count == 1) {
+                if (closure->callback) ret = visit(closure->callback, arg);
+                if (ret != 0) return ret;
+                
+                if (closure->extra_args) ret = visit(closure->extra_args, arg);
+                if (ret != 0) return ret;
+                
+                if (closure->swap_data) ret = visit(closure->swap_data, arg);
+                if (ret != 0) return ret;
+            }
         }
     }
     return ret;
