From: <kt...@us...> - 2010-02-06 14:23:58
|
Revision: 3741 http://ruby-gnome2.svn.sourceforge.net/ruby-gnome2/?rev=3741&view=rev Author: ktou Date: 2010-02-06 14:23:52 +0000 (Sat, 06 Feb 2010) Log Message: ----------- * src/rbgobj_closure.c, src/rbgobj_signal.c, src/rbgobject.h, srb/glib2.def: set tag to GRClosure for debugging. Modified Paths: -------------- ruby-gnome2/trunk/glib/ChangeLog ruby-gnome2/trunk/glib/src/glib2.def ruby-gnome2/trunk/glib/src/rbgobj_closure.c ruby-gnome2/trunk/glib/src/rbgobj_signal.c ruby-gnome2/trunk/glib/src/rbgobject.h Modified: ruby-gnome2/trunk/glib/ChangeLog =================================================================== --- ruby-gnome2/trunk/glib/ChangeLog 2010-02-02 14:17:16 UTC (rev 3740) +++ ruby-gnome2/trunk/glib/ChangeLog 2010-02-06 14:23:52 UTC (rev 3741) @@ -1,3 +1,8 @@ +2010-02-06 Kouhei Sutou <ko...@co...> + + * src/rbgobj_closure.c, src/rbgobj_signal.c, src/rbgobject.h, + srb/glib2.def: set tag to GRClosure for debugging. + 2009-10-11 Kouhei Sutou <ko...@co...> * src/rbgobj_object.c: fix type_register on Ruby 1.9. Modified: ruby-gnome2/trunk/glib/src/glib2.def =================================================================== --- ruby-gnome2/trunk/glib/src/glib2.def 2010-02-02 14:17:16 UTC (rev 3740) +++ ruby-gnome2/trunk/glib/src/glib2.def 2010-02-06 14:23:52 UTC (rev 3741) @@ -50,6 +50,7 @@ rbgobj_signal_wrap g_rclosure_new g_rclosure_attach + g_rclosure_set_tag rbgobj_ruby_value_get_type g_value_get_ruby_value g_value_set_ruby_value Modified: ruby-gnome2/trunk/glib/src/rbgobj_closure.c =================================================================== --- ruby-gnome2/trunk/glib/src/rbgobj_closure.c 2010-02-02 14:17:16 UTC (rev 3740) +++ ruby-gnome2/trunk/glib/src/rbgobj_closure.c 2010-02-06 14:23:52 UTC (rev 3741) @@ -16,6 +16,7 @@ static ID id_call, id_closures; static gboolean rclosure_initialized = FALSE; +#define TAG_SIZE 64 typedef struct _GRClosure GRClosure; struct _GRClosure { @@ -26,6 +27,7 @@ gint count; GList *objects; GValToRValSignalFunc g2r_func; + gchar tag[TAG_SIZE]; }; static VALUE @@ -97,7 +99,8 @@ ret = rb_apply(callback, id_call, args); } else { - rb_warn("GRClosure invoking callback: already destroyed"); + rb_warn("GRClosure invoking callback: already destroyed: %s", + rclosure->tag[0] ? rclosure->tag : "(anonymous)"); } if (return_value && G_VALUE_TYPE(return_value)) @@ -209,6 +212,7 @@ gr_closure_holder_mark, gr_closure_holder_free, closure); + closure->tag[0] = '\0'; g_closure_set_marshal((GClosure*)closure, &rclosure_marshal); g_closure_add_invalidate_notifier((GClosure*)closure, NULL, @@ -248,6 +252,19 @@ } } +void +g_rclosure_set_tag(GClosure *closure, const gchar *tag) +{ + GRClosure *rclosure = (GRClosure *)closure; + + if (tag) { + strncpy(rclosure->tag, tag, TAG_SIZE); + rclosure->tag[TAG_SIZE - 1] = '\0'; + } else { + rclosure->tag[0] = '\0'; + } +} + static void rclosure_end_proc(VALUE _) { Modified: ruby-gnome2/trunk/glib/src/rbgobj_signal.c =================================================================== --- ruby-gnome2/trunk/glib/src/rbgobj_signal.c 2010-02-02 14:17:16 UTC (rev 3740) +++ ruby-gnome2/trunk/glib/src/rbgobj_signal.c 2010-02-06 14:23:52 UTC (rev 3741) @@ -242,6 +242,8 @@ guint signal_id; GQuark detail; VALUE func; + GObject *g_object; + gchar *tag; rb_scan_args(argc, argv, "1*", &sig, &rest); @@ -259,7 +261,13 @@ rclosure = g_rclosure_new(func, rest, rbgobj_get_signal_func(signal_id)); g_rclosure_attach((GClosure *)rclosure, self); - i = g_signal_connect_closure_by_id(RVAL2GOBJ(self), signal_id, detail, rclosure, after); + g_object = RVAL2GOBJ(self); + tag = g_strdup_printf("%s::%s", + G_OBJECT_CLASS_NAME(G_OBJECT_GET_CLASS(g_object)), + sig_name); + g_rclosure_set_tag((GClosure *)rclosure, tag); + g_free(tag); + i = g_signal_connect_closure_by_id(g_object, signal_id, detail, rclosure, after); return INT2FIX(i); } Modified: ruby-gnome2/trunk/glib/src/rbgobject.h =================================================================== --- ruby-gnome2/trunk/glib/src/rbgobject.h 2010-02-02 14:17:16 UTC (rev 3740) +++ ruby-gnome2/trunk/glib/src/rbgobject.h 2010-02-06 14:23:52 UTC (rev 3741) @@ -181,6 +181,7 @@ extern GClosure* g_rclosure_new(VALUE callback_proc, VALUE extra_args, GValToRValSignalFunc func); extern void g_rclosure_attach(GClosure *closure, VALUE object); +extern void g_rclosure_set_tag(GClosure *closure, const gchar *tag); /* rbgobj_value.c */ extern VALUE rbgobj_gvalue_to_rvalue(const GValue* value); This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |