|
From: Masao M. <mu...@hi...> - 2002-06-19 16:56:05
|
むとうです。 On Wed, 19 Jun 2002 15:20:18 +0900 Masahiro Sakai <s01...@sf...> wrote: > さかいです。 > > > XXXと書いたのは、cinfo->freeを呼ばなくしてしまった事についてでした。 > > > 何故そうしたかというと、先のメールでは書き忘れてしまいましたが > > > GObjectのリファレンスカウンタを実験的に使おうとしていたからです。 > > > > > > ちゃんと呼ぶようにも出来るのですが、cinfo->freeは現在使われていないので、 > > > 後回しでいっかと思って。(^^;; > > > > えっと、まぁそうなんですが、使わないなら、gobj_mark()もいらなくなりますし > > この際、削除した方がスッキリすると思います。 > > - mark用の関数をtype markerとして使うのは無理があるので、gobj_markは消す。 > - cinfo->freeが本当に要らないのかどうかは確信が持てないので保留。 > - rbgobj_lookup_*のAPIを練り直すことで、cinfoがNULLにならないようにする。 > > って感じでどうでしょうか。 良いですね。特に3つ目で、cinfoがNULLになる場合を想定するというのが変な 感じがしてました。 > > ふと思ったのですが、g_object_ref/unref前後(じゃなくても良いけど)のGObject > > ってmalloc/freeって必要ないんですかね....。 > > えっと、ちょっと想像できないのですが、どういうことでしょう? ごめんなさい。ちょっと寝ぼけてた(る)かも...。 忘れてください。 > > あ、ちょっと説明が悪かったですね。実は、Init_gobject_gobj()内の > > > > rbgobj_register_r2g_func(rbgobj_cGObject, &_gobject_from_ruby); > > rbgobj_register_g2r_func(G_TYPE_OBJECT, &_gobject_to_ruby); > > > > の意図がちょっとわからなかったんです。 > > これって何を意図してるんでしょうか。 > > rbgobj_cGObjectの派生クラス用のVALUE->GValueの変換関数として、 > _gobject_from_ruby() を登録し、 > G_TYPE_OBJECTの派生タイプ用のGValue->VALUEの変換関数として > _gobject_to_ruby() を登録しています。 あ、なんかわかってきたような。 rbgobj_object.cでこれを登録しているって言うことは、 ひょっとして、全てのGValue(当然GObjectも含む)<->VALUEの変換を rbgobj_gvalue_to_rvalue(),rbgobj_rvalue_to_gvalue()でやって しまうというのが意図ですか? ・・・(1) > # そういえば、この辺りはGClosureを使うようにしたときに > # だいぶヘボいコードにしてしまったので、rbgobj_closure.cの方とあわせて、 > # どなたか改良して貰えると助かります。 じゃ、おいおいやっていきましょう。 > > > リファレンスカウンタについては僕もだいぶ混乱しているのですが、 > > > 現状だと、各クラスのinitializeの実装はunrefしないので、 > > > ここでrefしてしまうのはまずそうな気がします。 > > > # もちろん、unrefするようにinitializeの方を変更すれば良いのですが…… > > > > initializeの方でunrefって、unrefしたオブジェクトを使い回すということに > > なるので、ちょっと気持ち悪い気がします。 > > initializeからリターンする前に最初のリファレンスをunrefしても、 > set_gobject()でのrefによってRubyのオブジェクト自身が > 新しいリファレンスを保持している事になるので、 > 僕はあんまし気持悪いとは感じてません。 > > > > 1. initializeメソッド内で、hogehoge_new()を呼び出して、 > > > 新しく作成されたオブジェクトのリファレンスを得る。 > > > この時点で、リファレンスカウンタは1 > > > > これって、例えば、rbgtkbutton.cのbutton_initialize()とかのことを言ってますか? > > どこでリファレンスカウンタが1になるのでしたっけ。ちょっとわからないんですが...。 > > その例でしたら、gtk_button_new()からリターンした時点で > 既にリファレンスカウンタは1になっていると思います。 > ちなみに、具体的に1をセットしているのはg_object_init() あぁ、そうか。それならrefの方は不要ですね。 > # と思ったら、gtk+側では floating object なんて概念もあるのか。 > # ややこしい…… > > > > 5. glib側のオブジェクトは解放されない。 > > > > えっと、これって今のRuby/GTKの実装がってことでいいでしょうか? > > 「他を変更せずにset_objectでrefするようにすると」です。 > > > さかいさん的には、2.でrefしなくても良いんじゃないかって解釈で良いでしょうか? > > 2.でrefしなくても実質的にはうまく行くんじゃないかとは思ってますが、 > これは気持悪いし、あまり自信がないです。 > 一方、2.でrefする事にすると、initialize側でunrefする必要があるはずで、 > 面倒臭そう…… initialize側で毎回unrefするというのは実装上、バグが多発しそうな気がします。 と考えると2.でrefしないというのも手ですよね。 > > と思っていたのですが、 > floating object の事とか見落としていたので、 > リファレンスカウンタについては、ちゃんと考え直そうと思います。 うぅぅ。ついていけませんでした(-_-;)。 #私もついていけるように勉強します。 > > さらに、INT2FIXみたいなマクロを用意するとスッキリするかも。 > > > > GOBJ2GVAL() > > RVAL2GVAL() > > GOBJ2RVAL() > > RVAL2GOBJ() もし、(1)の部分が正しいのであれば、上記は > > RVAL2GVAL() > > GVAL2RVAL() の2つですみます? それだと、 G2VALUE, VALUE2Gでも良いかも(短すぎ?)。 > この名前短くて良いですね。 > # そういえば、rvalueやRVALって「右辺値」を連想してしまいそう。(^^;; ははは。GVALはGlobal Valueを連想してしまったりして。 まぁ、たくさん使われる名前だから覚えてもらえるでしょう。 -- .:% Masao Mutoh<mu...@hi...> |