From: Kenichi K. <ko...@ma...> - 2003-12-21 00:01:56
|
小宮です。 > むとうです。 > > 取り込んだ後になんですが(^^;)。 > > サンプルを試したところ、固まりました。 > > 手順はひたすらspaceとbackspaceを押して上へ行ったり > 下へ行ったりする事を繰り返したら出ました。 > GCされちゃってるのかなぁと思ってGtk.mainの直前に > GC.startをやるようにしたところやはり落ちました。 すいません、うっかりしていました。 rbgobj_boxed_initialize() が boxed_holder->own = TRUE してしまうので boxed_holder の中の GtkBindingSet のポインタが GC 時に free されてしま いますね。 案としては 案3 : rbgobj_boxed_not_copy_obj() した上で、new を再定義して rbgobj_make_boxed() でインスタンスを作る。サブクラス化に 問題がないように initialize も呼ぶ。 案4 : free 用の関数ポインタとして何もしない関数を渡す 案5 : Ruby 側にオーナーシップがまったく無い状態に対応する新しいフラ グを RGObjClassFlag に追加する。(セットすると copy も free もしなくなる) 個人的には案5がよさそうに思うのですが、他のフラグの意味もまだ十分把握 していなので私の手にはあまります。GtkBindingSet 以外にも使い道が見付かっ た時点でやるのが良いかもしれません。 とりあえず楽そうな案4を実装してみました。手元では Gtk.main の前に GC.start を入れてもフリーズしなくなりました。 小宮 diff -d -u -2 -p -r ruby-gnome2/gtk/src/rbgtkbindingset.c ../ruby-gnome2/gtk/src/rbgtkbindingset.c --- ruby-gnome2/gtk/src/rbgtkbindingset.c 2003-12-21 08:57:13.000000000 +0900 +++ ../ruby-gnome2/gtk/src/rbgtkbindingset.c 2003-12-21 08:27:48.000000000 +0900 @@ -31,4 +31,11 @@ gtk_bindingset_copy(const GtkBindingSet* } +/*****************************************/ +static void +gtk_bindingset_free(GtkBindingSet* bin) +{ + /* GtkBindingSet should not be freed */ +} + GType gtk_bindingset_get_type(void) @@ -38,5 +45,5 @@ gtk_bindingset_get_type(void) our_type = g_boxed_type_register_static ("GtkBindingSet", (GBoxedCopyFunc)gtk_bindingset_copy, - (GBoxedFreeFunc)g_free); + (GBoxedFreeFunc)gtk_bindingset_free); return our_type; } |