From: Masao M. <mut...@gm...> - 2006-05-25 13:38:18
|
むとうです。 On Thu, 25 May 2006 10:57:20 +0900 (JST) Masahiro Sakai (酒井政裕) <sa...@to...> wrote: > 酒井です。 > > From: Masao Mutoh <mu...@hi...> > Date: Sat, 20 May 2006 13:13:39 +0900 > > > むとうです。 > > > > > 手元で試しましたが、少なくともCVS版では落ちません。 > > > > 理論上落ちるという話でしょうか。偶然なのかな。 > > > > なんか対応したっけ・・・・忘れてますが(苦笑)。 > > > > > > 私の手元の環境では > > > (eval):11: warning: GRClosure invoking callback: already destroyed > > > が出ました。環境は > > > * 昨日のCVSのRuby-GNOME2 > > > * ruby 1.9.0 (2006-01-19) [i386-cygwin] > > > * Cygwin標準パッケージのgtk+ 2.6.10, glib 2.6.6 > > > です。 > > > > うーん。なんでだろう。rubyが1.8.4だからなのかな・・・。 > > GC周りはよくわからないですね。 > > > > RubyのGCのmark phaseでrb_gc_mark()するという話です。 > > > > > > # ついでに、オブジェクトのプロパティを同様にmarkするのも良さそう。 > > > # parentもプロパティなので須藤さんの案を包摂しますし。 > > > > Gtk::TextViewとGtk::TextBufferはコンテナとその子供、という関係では > > 無いので、この例では、gtk_container_forallの対応をしてもNGではないでしょうか。 > > この場合Gtk::TextBufferはGtk::TextViewのbufferプロパティになっているので、 > プロパティをmarkするようにすればこの例についてはOKです。 なるほど・・・。 親玉をmarkする際に、そのときに存在するすべてのプロパティ値を 拾ってmarkするようにしてしまう、という感じですね。こちらは コンテナ、GObjectならなんでも実施するという感じですね。 ところで、久しぶりに実装をお願いできませんか? どうも私が実装するととんちんかんなことをしてしまいそうな気がして・・・。 その点、さかいさんなら安心です(^^;)。 それでは。 -- .:% Masao Mutoh<mu...@hi...> |
From: Masahiro S. ()
<sa...@to...> - 2006-05-26 10:42:48
|
酒井です。 From: "Masao Mutoh" <mut...@gm...> Date: Thu, 25 May 2006 22:38:03 +0900 > むとうです。 > > > > RubyのGCのmark phaseでrb_gc_mark()するという話です。 > > > > > > > > # ついでに、オブジェクトのプロパティを同様にmarkするのも良さそう。 > > > > # parentもプロパティなので須藤さんの案を包摂しますし。 > > > > > > Gtk::TextViewとGtk::TextBufferはコンテナとその子供、という関係では > > > 無いので、この例では、gtk_container_forallの対応をしてもNGではないでしょうか。 > > > > この場合Gtk::TextBufferはGtk::TextViewのbufferプロパティになっているので、 > > プロパティをmarkするようにすればこの例についてはOKです。 > > なるほど・・・。 > 親玉をmarkする際に、そのときに存在するすべてのプロパティ値を > 拾ってmarkするようにしてしまう、という感じですね。こちらは > コンテナ、GObjectならなんでも実施するという感じですね。 ちょっと考えてたのですが、「子やプロパティ値について、対応するRubyのオ ブジェクトが存在する場合に、それをmarkする」というのは難しくはないです が、それ以上のことをするのはtrivialとは言えなさそうです。 # これだけだと、そこまで嬉しくなさそうだなぁ... > ところで、久しぶりに実装をお願いできませんか? > どうも私が実装するととんちんかんなことをしてしまいそうな気がして・・・。 > その点、さかいさんなら安心です(^^;)。 了解しました。 上で書いたとこまでなら、暇なときにでも実装しておきます。 -- 酒井 政裕 / Masahiro Sakai |
From: Masao M. <mu...@hi...> - 2006-05-26 16:04:29
|
むとうです。 On Fri, 26 May 2006 19:42:12 +0900 (JST) Masahiro Sakai (酒井政裕) <sa...@to...> wrote: > 酒井です。 > > なるほど・・・。 > > 親玉をmarkする際に、そのときに存在するすべてのプロパティ値を > > 拾ってmarkするようにしてしまう、という感じですね。こちらは > > コンテナ、GObjectならなんでも実施するという感じですね。 > > ちょっと考えてたのですが、「子やプロパティ値について、対応するRubyのオ > ブジェクトが存在する場合に、それをmarkする」というのは難しくはないです > が、それ以上のことをするのはtrivialとは言えなさそうです。 > # これだけだと、そこまで嬉しくなさそうだなぁ... GOBJ2RVALのタイミングでもmarkされるとこまではやるってことですかね。 ちょっと理解できてません(^^;)。 > > ところで、久しぶりに実装をお願いできませんか? > > どうも私が実装するととんちんかんなことをしてしまいそうな気がして・・・。 > > その点、さかいさんなら安心です(^^;)。 > > 了解しました。 > 上で書いたとこまでなら、暇なときにでも実装しておきます。 助かります。久しぶりに復活ですねー。 ではでは。 -- .:% Masao Mutoh<mu...@hi...> |
From: Masao M. <mu...@hi...> - 2006-05-27 06:06:26
|
むとうです。 On Sat, 27 May 2006 12:50:21 +0900 (JST) Masahiro Sakai (酒井政裕) <sa...@to...> wrote: > 酒井です。 > > From: Masao Mutoh <mu...@hi...> > Date: Sat, 27 May 2006 01:04:06 +0900 > > > むとうです。 > > > > On Fri, 26 May 2006 19:42:12 +0900 (JST) > > Masahiro Sakai (酒井政裕) <sa...@to...> wrote: > > > > > 酒井です。 > > > > > > なるほど・・・。 > > > > 親玉をmarkする際に、そのときに存在するすべてのプロパティ値を > > > > 拾ってmarkするようにしてしまう、という感じですね。こちらは > > > > コンテナ、GObjectならなんでも実施するという感じですね。 > > > > > > ちょっと考えてたのですが、「子やプロパティ値について、対応するRubyのオ > > > ブジェクトが存在する場合に、それをmarkする」というのは難しくはないです > > > が、それ以上のことをするのはtrivialとは言えなさそうです。 > > > # これだけだと、そこまで嬉しくなさそうだなぁ... > > > > GOBJ2RVALのタイミングでもmarkされるとこまではやるってことですかね。 > > ちょっと理解できてません(^^;)。 > > やるのは、GOBJ2RVALのタイミングでなく、RubyのGCのmark phaseでです。 > > 「そこまで嬉しくない」と書いたのは、あるglib側オブジェクトAから直接参照して > るBにはRuby側オブジェクトが存在せず、Bから参照されているCにはRuby側オブジェ > クトが存在するという場合に、AからCをmarkするのが現状では難しいから。 > (Rubyを拡張してGC終了時にフックをかけられるようにすれば出来るけど) なるほど。 > > > 上で書いたとこまでなら、暇なときにでも実装しておきます。 > > とりあえず基本的な部分を実装してコミットしました。 > コードの整理はこれからですが、とりあえず問題はないと思います。 > > > 助かります。久しぶりに復活ですねー。 > > 復活というか、やり残したことを片付けたくなったんですよ。 あぁ、そうでしたか。残念。 ところで質問なのですが、今回の対応をすることで、G_CHILD_ADD/REMOVEって 基本的に不要になる、という考えで良いんですかね。 少なくともContainer周りは不要になりますよね。 -- .:% Masao Mutoh<mu...@hi...> |
From: Masao M. <mu...@hi...> - 2006-05-27 12:31:17
|
むとうです。 On Sat, 27 May 2006 16:13:31 +0900 (JST) Masahiro Sakai (酒井政裕) <sa...@to...> wrote: > 酒井です。 > > From: Masao Mutoh <mu...@hi...> > Date: Sat, 27 May 2006 15:06:18 +0900 > > > むとうです。 > > > > > 助かります。久しぶりに復活ですねー。 > > > > > > 復活というか、やり残したことを片付けたくなったんですよ。 > > > > あぁ、そうでしたか。残念。 > > すみません。 あー、いえいえ。お気になさらぬよう。 > > ところで質問なのですが、今回の対応をすることで、G_CHILD_ADD/REMOVEって > > 基本的に不要になる、という考えで良いんですかね。 > > 少なくともContainer周りは不要になりますよね。 > > そうですね。 > Containerの直接の子Widgetに関しては不要になります。 > 間接的な子孫に関してはまだダメですが。 rbgtkcontainer.cでmark時にgtk_container_forall呼んで マークするというのはようやく理解したのですが、 ↓これって、サブクラスにも有効なんでしたっけ。 VALUE gContainer = G_DEF_CLASS2(GTK_TYPE_CONTAINER, "Container", mGtk, cont_mark, NULL); というのは、例えば、GtkWindowの場合は、cont_markをつけていない訳なんですが、 これって、それで大丈夫ですかね。 G_DEF_CLASS_GTK_CONTAINERみたいなのが必要なのかなぁ、と一瞬思ったのですが...。 -- .:% Masao Mutoh<mu...@hi...> |
From: Masao M. <mu...@hi...> - 2006-05-27 14:32:47
|
むとうです。 On Sat, 27 May 2006 21:58:03 +0900 (JST) Masahiro Sakai (酒井政裕) <sa...@to...> wrote: > 酒井です。 > > From: Masao Mutoh <mu...@hi...> > Date: Sat, 27 May 2006 21:31:06 +0900 > > > むとうです。 > > > > > On Sat, 27 May 2006 16:13:31 +0900 (JST) > > Masahiro Sakai (酒井政裕) <sa...@to...> wrote: > > > > そうですね。 > > > Containerの直接の子Widgetに関しては不要になります。 > > > 間接的な子孫に関してはまだダメですが。 > > > > rbgtkcontainer.cでmark時にgtk_container_forall呼んで > > マークするというのはようやく理解したのですが、 > > ↓これって、サブクラスにも有効なんでしたっけ。 > > VALUE gContainer = G_DEF_CLASS2(GTK_TYPE_CONTAINER, > > "Container", mGtk, cont_mark, NULL); > > サブクラスにも有効になるようRuby/GLib2側を変更してあります。 なるほど。 ちなみにこれに関して、どのファイルのどの辺りを見れば良いか教えて いただけませんか?ちょっとわからなくて・・・。 それから、rbgtkcontainer.cの中のcont_mark, cont_mark_callbackに それぞれデバッグ文を入れて、以下を実行したところ、デバック文が表示されなか ったのですがそういうもの(このタイミングではcont_markは呼ばれない)なのでしょうか。 Gtk::Window.newを呼んだときは、rbgtkcontainer.cのcont_mark が動く、という理解でいいですか?ってここを誤解してるのかな。 GC.startが呼ばれたタイミング? require 'gtk2' Gtk.init def test Gtk::Window.new end loop { test GC.start } -- .:% Masao Mutoh<mu...@hi...> |
From: Masao M. <mu...@hi...> - 2006-05-28 13:52:20
|
さかいさん むとうです。 On Sun, 28 May 2006 00:12:06 +0900 (JST) Masahiro Sakai (酒井政裕) <sa...@to...> wrote: > 酒井です。 > > From: Masao Mutoh <mu...@hi...> > Date: Sat, 27 May 2006 23:32:37 +0900 > > > むとうです。 > > > > サブクラスにも有効になるようRuby/GLib2側を変更してあります。 > > > > なるほど。 > > ちなみにこれに関して、どのファイルのどの辺りを見れば良いか教えて > > いただけませんか?ちょっとわからなくて・・・。 > > rbbogj_typeinstance.cのrbgobj_instance_call_cinfo_mark()で > 各cinfoのmarkを呼んでいます。 > この辺りはもっと整理したいと思っています。 > > > それから、rbgtkcontainer.cの中のcont_mark, cont_mark_callbackに > > それぞれデバッグ文を入れて、以下を実行したところ、デバック文が表示されなか > > ったのですがそういうもの(このタイミングではcont_markは呼ばれない)なのでしょうか。 > > すみません。バグってました。 > 先ほど修正しましたので、今度こそ大丈夫だと思います。 > > > Gtk::Window.newを呼んだときは、rbgtkcontainer.cのcont_mark > > が動く、という理解でいいですか?ってここを誤解してるのかな。 > > GC.startが呼ばれたタイミング? > > GC.startが呼ばれたタイミングです。 > > > require 'gtk2' > > > > Gtk.init > > def test > > Gtk::Window.new > > end > > loop { > > test > > GC.start > > } > > Windowに何かWidgetを追加しておけば、cont_mark_callbackが呼ばれるのも > 観察出来るはずです。 遅くなりました。 CVS版の最新版で試したところ、無事に観察できました。 ところで、以下のスクリプトを試したところ、Gtk::Windowが増える一方です。 イメージ的にはafterが常に1になるような気がします。 これだとメモリリークしているような気がするのですがこういうものなんでしょうか。 require 'gtk2' Gtk.init def test Gtk::Window.new.add(Gtk::Button.new("CLICK")) end loop { test p [:before, ObjectSpace.each_object(Gtk::Window) {}] GC.start p [:after, ObjectSpace.each_object(Gtk::Window) {}] } -- .:% Masao Mutoh<mu...@hi...> |
From: Masahiro S. ()
<sa...@to...> - 2006-05-28 15:11:46
|
酒井です。 From: Masao Mutoh <mu...@hi...> Date: Sun, 28 May 2006 22:52:07 +0900 > さかいさん > > むとうです。 > ところで、以下のスクリプトを試したところ、Gtk::Windowが増える一方です。 > イメージ的にはafterが常に1になるような気がします。 > これだとメモリリークしているような気がするのですがこういうものなんでしょうか。 もとよりGtkWindowは明示的にdestroyしない限りは生き残っているものなので、 対応するRuby側のオブジェクトも同様に生き残っているのが自然だと思い、 このようにしてみました。 -- 酒井 政裕 / Masahiro Sakai |
From: Masao M. <mu...@hi...> - 2006-05-28 16:01:28
|
むとうです。 On Mon, 29 May 2006 00:11:11 +0900 (JST) Masahiro Sakai (酒井政裕) <sa...@to...> wrote: > 酒井です。 > > From: Masao Mutoh <mu...@hi...> > Date: Sun, 28 May 2006 22:52:07 +0900 > > > さかいさん > > > > むとうです。 > > > ところで、以下のスクリプトを試したところ、Gtk::Windowが増える一方です。 > > イメージ的にはafterが常に1になるような気がします。 > > これだとメモリリークしているような気がするのですがこういうものなんでしょうか。 > > もとよりGtkWindowは明示的にdestroyしない限りは生き残っているものなので、 > 対応するRuby側のオブジェクトも同様に生き残っているのが自然だと思い、 > このようにしてみました。 ごめんなさい! そうでしたそうでした。すっかり勘違いです。ごめんなさい。 -- .:% Masao Mutoh<mu...@hi...> |
From: Masahiro S. ()
<sa...@to...> - 2006-05-27 15:12:18
|
酒井です。 From: Masao Mutoh <mu...@hi...> Date: Sat, 27 May 2006 23:32:37 +0900 > むとうです。 > > サブクラスにも有効になるようRuby/GLib2側を変更してあります。 > > なるほど。 > ちなみにこれに関して、どのファイルのどの辺りを見れば良いか教えて > いただけませんか?ちょっとわからなくて・・・。 rbbogj_typeinstance.cのrbgobj_instance_call_cinfo_mark()で 各cinfoのmarkを呼んでいます。 この辺りはもっと整理したいと思っています。 > それから、rbgtkcontainer.cの中のcont_mark, cont_mark_callbackに > それぞれデバッグ文を入れて、以下を実行したところ、デバック文が表示されなか > ったのですがそういうもの(このタイミングではcont_markは呼ばれない)なのでしょうか。 すみません。バグってました。 先ほど修正しましたので、今度こそ大丈夫だと思います。 > Gtk::Window.newを呼んだときは、rbgtkcontainer.cのcont_mark > が動く、という理解でいいですか?ってここを誤解してるのかな。 > GC.startが呼ばれたタイミング? GC.startが呼ばれたタイミングです。 > require 'gtk2' > > Gtk.init > def test > Gtk::Window.new > end > loop { > test > GC.start > } Windowに何かWidgetを追加しておけば、cont_mark_callbackが呼ばれるのも 観察出来るはずです。 -- 酒井 政裕 / Masahiro Sakai |
From: Masahiro S. ()
<sa...@to...> - 2006-05-27 12:58:20
|
酒井です。 From: Masao Mutoh <mu...@hi...> Date: Sat, 27 May 2006 21:31:06 +0900 > むとうです。 > > On Sat, 27 May 2006 16:13:31 +0900 (JST) > Masahiro Sakai (酒井政裕) <sa...@to...> wrote: > > そうですね。 > > Containerの直接の子Widgetに関しては不要になります。 > > 間接的な子孫に関してはまだダメですが。 > > rbgtkcontainer.cでmark時にgtk_container_forall呼んで > マークするというのはようやく理解したのですが、 > ↓これって、サブクラスにも有効なんでしたっけ。 > VALUE gContainer = G_DEF_CLASS2(GTK_TYPE_CONTAINER, > "Container", mGtk, cont_mark, NULL); サブクラスにも有効になるようRuby/GLib2側を変更してあります。 -- 酒井 政裕 / Masahiro Sakai |
From: Masahiro S. ()
<sa...@to...> - 2006-05-27 07:13:41
|
酒井です。 From: Masao Mutoh <mu...@hi...> Date: Sat, 27 May 2006 15:06:18 +0900 > むとうです。 > > > 助かります。久しぶりに復活ですねー。 > > > > 復活というか、やり残したことを片付けたくなったんですよ。 > > あぁ、そうでしたか。残念。 すみません。 > ところで質問なのですが、今回の対応をすることで、G_CHILD_ADD/REMOVEって > 基本的に不要になる、という考えで良いんですかね。 > 少なくともContainer周りは不要になりますよね。 そうですね。 Containerの直接の子Widgetに関しては不要になります。 間接的な子孫に関してはまだダメですが。 -- 酒井 政裕 / Masahiro Sakai |
From: Masao M. <mu...@hi...> - 2006-05-27 12:30:26
|
むとうです。 On Sat, 27 May 2006 16:13:31 +0900 (JST) Masahiro Sakai (酒井政裕) <sa...@to...> wrote: > 酒井です。 > > From: Masao Mutoh <mu...@hi...> > Date: Sat, 27 May 2006 15:06:18 +0900 > > > むとうです。 > > > > > 助かります。久しぶりに復活ですねー。 > > > > > > 復活というか、やり残したことを片付けたくなったんですよ。 > > > > あぁ、そうでしたか。残念。 > > すみません。 あー、いえいえ。お気になさらぬよう。 > > ところで質問なのですが、今回の対応をすることで、G_CHILD_ADD/REMOVEって > > 基本的に不要になる、という考えで良いんですかね。 > > 少なくともContainer周りは不要になりますよね。 > > そうですね。 > Containerの直接の子Widgetに関しては不要になります。 > 間接的な子孫に関してはまだダメですが。 rbgtkcontainer.cでmark時にgtk_container_forall呼んで マークするというのはようやく理解したのですが、 ↓これって、サブクラスにも有効なんでしたっけ。 VALUE gContainer = G_DEF_CLASS2(GTK_TYPE_CONTAINER, "Container", mGtk, cont_mark, NULL); というのは、例えば、GtkWindowの場合は、cont_markをつけていない訳なんですが、 これって、それで大丈夫ですかね。 G_DEF_CLASS_GTK_CONTAINERみたいなのが必要なのかなぁ、と一瞬思ったのですが...。 -- .:% Masao Mutoh<mu...@hi...> |
From: Masahiro S. ()
<sa...@to...> - 2006-05-27 03:50:52
|
酒井です。 From: Masao Mutoh <mu...@hi...> Date: Sat, 27 May 2006 01:04:06 +0900 > むとうです。 > > On Fri, 26 May 2006 19:42:12 +0900 (JST) > Masahiro Sakai (酒井政裕) <sa...@to...> wrote: > > > 酒井です。 > > > > なるほど・・・。 > > > 親玉をmarkする際に、そのときに存在するすべてのプロパティ値を > > > 拾ってmarkするようにしてしまう、という感じですね。こちらは > > > コンテナ、GObjectならなんでも実施するという感じですね。 > > > > ちょっと考えてたのですが、「子やプロパティ値について、対応するRubyのオ > > ブジェクトが存在する場合に、それをmarkする」というのは難しくはないです > > が、それ以上のことをするのはtrivialとは言えなさそうです。 > > # これだけだと、そこまで嬉しくなさそうだなぁ... > > GOBJ2RVALのタイミングでもmarkされるとこまではやるってことですかね。 > ちょっと理解できてません(^^;)。 やるのは、GOBJ2RVALのタイミングでなく、RubyのGCのmark phaseでです。 「そこまで嬉しくない」と書いたのは、あるglib側オブジェクトAから直接参照して るBにはRuby側オブジェクトが存在せず、Bから参照されているCにはRuby側オブジェ クトが存在するという場合に、AからCをmarkするのが現状では難しいから。 (Rubyを拡張してGC終了時にフックをかけられるようにすれば出来るけど) > > 上で書いたとこまでなら、暇なときにでも実装しておきます。 とりあえず基本的な部分を実装してコミットしました。 コードの整理はこれからですが、とりあえず問題はないと思います。 > 助かります。久しぶりに復活ですねー。 復活というか、やり残したことを片付けたくなったんですよ。 -- 酒井 政裕 / Masahiro Sakai |