From: Masao M. <mu...@hi...> - 2003-12-21 08:21:42
|
むとうです。 On Sun, 21 Dec 2003 09:02:26 +0900 Kenichi Komiya <ko...@ma...> wrote: > 小宮です。 > > > むとうです。 > > > > 取り込んだ後になんですが(^^;)。 > > > > サンプルを試したところ、固まりました。 > > > > 手順はひたすら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 以外にも使い道が見付かっ > た時点でやるのが良いかもしれません。 なるほど。 小宮さんのオーナーシップの話に被るのですが、 1. GTK+側がメモリ管理しないので、 Ruby-GNOME2側が責任持ってメモリ管理する場合 2. GTK+側がメモリ管理するので、Ruby-GNOME2側はAPIを通して使うだけ の2通りがイマイチスッキリしない形で共存してるんですよね、GTK+って。 g_object_ref/unrefがあるのでGLib::Object系は良いんですけど、それ以外が。 まぁ、ミニマムに見ればそれぞれが必要な形に最適化されてるってことだとは 思うのですが。 あと、 3. GTK+側がメモリをアロケートするけど、freeはユーザ(Ruby-GNOME2)側 てのもあったような。 この辺は注意しないといけないんだろうけどよく忘れるところでもあるん ですよねぇ。もう少しどうにかならないモノかなぁ、GTK+側で。 > とりあえず楽そうな案4を実装してみました。手元では Gtk.main の前に > GC.start を入れてもフリーズしなくなりました。 いや、楽そうというのはあるのですが、このような対応は局所的で全く問題 無いと思っています。 このようなイリーガルな対応を全てRuby/GLib側で吸収するつもりは無いです。 というわけでそのままいただきました。どうもありがとうございます。 -- .:% Masao Mutoh<mu...@hi...> |