ext/glib2/rbgobj_closure.c in glib2-4.0.1 vs ext/glib2/rbgobj_closure.c in glib2-4.0.2

- old
+ new

@@ -232,10 +232,12 @@ rclosure->rb_holder = TypedData_Wrap_Struct(rb_cObject, &rbg_closure_holder_type, rclosure); rclosure->tag[0] = '\0'; + g_closure_ref(closure); + g_closure_sink(closure); g_closure_set_marshal(closure, &rclosure_marshal); g_closure_add_finalize_notifier(closure, NULL, rclosure_finalize); return closure; } @@ -269,11 +271,14 @@ void g_rclosure_attach(GClosure *closure, VALUE object) { GRClosure *rclosure = (GRClosure *)closure; - rbgobj_add_relative(object, rclosure->rb_holder); + rbgobj_add_relative_removable(object, + Qnil, + id_closures, + rclosure->rb_holder); } void g_rclosure_attach_gobject(GClosure *closure, VALUE object) { @@ -285,10 +290,28 @@ g_object_weak_ref(gobject, rclosure_weak_notify, rclosure); rclosure->objects = g_list_prepend(rclosure->objects, gobject); } void +g_rclosure_detach(GClosure *closure, VALUE object) +{ + GRClosure *rclosure = (GRClosure *)closure; + rbgobj_remove_relative(object, id_closures, rclosure->rb_holder); +} + +void +g_rclosure_detach_gobject(GClosure *closure, VALUE object) +{ + GRClosure *rclosure = (GRClosure *)closure; + g_rclosure_detach(closure, object); + + GObject *gobject = RVAL2GOBJ(object); + g_object_weak_unref(gobject, rclosure_weak_notify, rclosure); + rclosure_weak_notify(rclosure, gobject); +} + +void g_rclosure_set_tag(GClosure *closure, const gchar *tag) { GRClosure *rclosure = (GRClosure *)closure; if (tag) { @@ -319,11 +342,9 @@ static VALUE rg_initialize(VALUE self) { GClosure *closure = g_rclosure_new(rb_block_proc(), Qnil, NULL); G_INITIALIZE(self, closure); - g_closure_ref(closure); - g_closure_sink(closure); return self; } static VALUE rg_in_marshal_p(VALUE self)