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)