From: Masahiro S. ()
<sa...@to...> - 2003-08-05 16:03:41
|
さかいです。 From: Masao Mutoh <mu...@hi...> Subject: Re: [ruby-gnome2-devel-ja] segfault Date: Tue, 5 Aug 2003 02:25:02 +0900 > むとうです。 > > 質問&中間報告です。 > > さらに短い再現スクリプトができました。 > > require 'gtk2' > > Gtk.init > > model = Gtk::ListStore.new(Array) > iter = model.append > iter.set_value(0, Array.new) > > GC.start > > とりあえず、現時点でわかったこととして、 > > 上記コードで、boxed_ruby_value_ref()が2回呼ばれます。 > > これは1回だけ呼ばれるべきかと思うのですが、 > 2回呼ばれるのには理由があるのでしょうか。 > > ここで2回呼ばれるのでref counterが2になります。 > 逆にboxed_ruby_value_unref()は1回呼ばれるのですが、 > カウンタは1なのでmarkers.deleteが呼び出されず、 > (もう一度呼ぼうとする?)その直後にsegfaultします。 refの回数は多分2回で正しいはずです。 この場合、 (1) set_value内で (1.1) 一時的なGValueにまずセット。ここで1回目のref (1.2) gtk_list_store_set_value()の呼び出し。 内部でg_value_dup_boxed()が呼び出されて、2回目のref (1.3) 一時的なGValueのunset。ここで1回目のunref (2) Rubyの終了時にmodelがGCされて、持っているデータが解放される。 ここで2回目のunref という流れになっているはずなので。 P.S. 今週は丸の内で「ITスキル標準人材育成研修」とかいうのを受けているのですが、 それにしても東京は蒸し暑いですね。 歩いているだけで汗だくです。(^^; -- 酒井 政裕 / Masahiro Sakai |