From: Masao M. <mu...@hi...> - 2002-08-03 16:45:45
|
むとうです。 On Sun, 04 Aug 2002 00:19:31 +0900 KUBO Takehiro <ku...@ji...> wrote: > 久保@茅ヶ崎市です。 > > > という形にしたいですね。久保さんの方でlibart_gplの別ライブラリ化 > > ができますか? > > それは大丈夫です。 > 明日は用事があるので、月曜の夜にでも出します。 それは助かります。 > > >> * test-gnome に Art::Affine のサンプルを追加 > >> 新規: gnome/sample/test-gnome/canvas-affine.rb > >> 修正: gnome/sample/test-gnome/canvas.rb > > > > これも、libart_gplの方に持っていった方が良いでしょうね。 > > 例の内容も、gnomeを使った場合やgtkを使った場合が考えられる > > と思います。 > > 思いっきり、Gnome::Canvas に依存しているので、これはこのままで良いので > はないかと。 > Art::Affine しかない状況では、Gnome::Canvas を使用しない例は考えられま > せん。libart_lgpl の関数をすべて実装したらな、Gdk を使った例が作れるか > もしれませんが、私には Gdk の知識はないもんで......。 いや、久保さんにGdkのサンプルを書いて欲しいとか、そういうことを言ってる わけではありません。 libartを利用したサンプルは、Gnome::Canvasのサンプルと言うより、libartの 機能を勉強する例としてGnome::Canvasを使うというイメージになると思いますので、 それは、libart側のsampleにしましょうといことが私の主旨です。 もしかしたら私や別の人がlibartを使う上での例としてGtk, Gdkやあるいは Tkなど他のツールキットでのサンプルを作るかもしれません。 例えばGdkからlibartを使うサンプルを書いたとして、それをGtkのサンプルに入れる ことはないと思います。それと同じことだと考えています。 逆にGnome::Canvasに依存しているからそれをGnome側のsampleに入れるという ことをすると、今後、pango等のサブプロジェクトについても同様(sampleをGnome に入れる)のことが必要となり、やはり変な感じがします。 > >> ですが、ついでに > >> * Gnome::CanvasPoints のバグの修正 > >> 修正: gnome/src/rbgnome-canvas-util.c > >> > >> もはいっています。 > 元々は、Gnome;:CanvasPoints#free が二回呼ばれると、一回目の呼び出しで > points_free の gcp が NULL になるので、 > if (gcp->ref_count == 1) { > で落ちるのを防止するのが目的でした。 ひょっとして、私が言っているセグメンテーション違反のバグはこれが 原因ですか? #私が確認しているのはこのパッチをあてる前のものです。 > ついでにいろんなところで、 > Data_Get_Struct(self, GnomeCanvasPoints, gcp); > if (gcp == NULL) { > rb_raise(rb_eRuntimeError, "object is already freed."); > } > としているのを抽出して、 > get_gnome_canvas_points() > としてまとめました。 > > ただ、ひとつの考えとして、これらのことはすべて、 > Gnome;:CanvasPoints#free > があることに起因しているので、このメソッドは削除して GC にメモリ回収を > まかせるという手もあります。Cレベルで gnome_canvas_points_free() とい > う API があるのは、C では自前でメモリ管理をしないといけないからで、 > ruby の場合 GC にまかせるという選択肢もあるのではないかと。 > > # もちろん、Data_Wrap_Struct の free に gnome_canvas_points_free を入 > # れるという前提で。 > > これはどちらが良いでしょうか? > Gnome;:CanvasPoints#free > がないほうが実装はかなり単純になりそうです。 げげっ。 ここまでソースをおわなかったのですが.... おっしゃるとおり、free()はGCに任せるべきです。 というか、free()だけではなく、 ref/unrefに関してもはRuby/GNOMEのソース内で 吸収する必要があります。 #この仕組みはgtkモジュールで頻繁に使われていますのでそちらも参考に #していただく必要があるかと思います。 ref/unref, malloc/freeの仕組みをユーザが考えずに済むというのが は、Ruby-GNOMEの最大のウリの1つです。 それでは。 -- .:% Masao Mutoh<mu...@hi...> |