From: Kouhei S. <ko...@co...> - 2006-05-23 02:56:55
Attachments:
rbgtkmain-callback.diff
|
須藤です. 以下のようなスクリプトを実行すると,Gtk.idle_addに設定したコールバック が(もう呼ばれないのに)GCされずに残ってしまいます.このため,コールバッ クのクロージャが参照しているオブジェクトもGCされなくなってしまいます. --- require "gtk2" Gtk.init class A; end def idle_start i = 100 as = [] Gtk.idle_add do as << A.new i -= 1 if i.zero? Gtk.main_quit false else true end end end idle_start Gtk.main p [:before, ObjectSpace.each_object(A) {}] GC.start p [:after, ObjectSpace.each_object(A) {}] --- 実行結果: [:before, 100] [:after, 100] 添付のパッチを当てると,手元ではこんな実行結果になりました: [:before, 100] [:after, 2] # パッチ中で,id_relative_callbacksじゃなくてid__idle_callbacks__とかを # 使っているのはidleとかtimeoutでidが重複したら嫌だなぁと思ったからです. |
From: Masao M. <mu...@hi...> - 2006-05-23 15:46:21
|
むとうです。 On Tue, 23 May 2006 11:56:52 +0900 "Kouhei Sutou" <ko...@co...> wrote: > 須藤です. > > 以下のようなスクリプトを実行すると,Gtk.idle_addに設定したコールバック > が(もう呼ばれないのに)GCされずに残ってしまいます.このため,コールバッ > クのクロージャが参照しているオブジェクトもGCされなくなってしまいます. <snip> > 実行結果: > [:before, 100] > [:after, 100] > > > 添付のパッチを当てると,手元ではこんな実行結果になりました: > [:before, 100] > [:after, 2] > > > # パッチ中で,id_relative_callbacksじゃなくてid__idle_callbacks__とかを > # 使っているのはidleとかtimeoutでidが重複したら嫌だなぁと思ったからです. むむむ。パッチ試してみたのですが、私の環境だと [:before, 100] [:after, 100] になっちゃいます...。なんでだろう。 $ ruby -v ruby 1.9.0 (2006-05-23) [i686-linux] --enable-thread版、Sjoredパッチ付きのRuby/GLib2使用。 です。 -- .:% Masao Mutoh<mu...@hi...> |
From: Masao M. <mu...@hi...> - 2006-05-24 12:58:43
|
むとうです。 On Wed, 24 May 2006 12:41:32 +0900 "Kouhei Sutou" <ko...@co...> wrote: > 須藤です. > > 06/05/24 に Masao Mutoh<mu...@hi...> さんは書きました: > > > むむむ。パッチ試してみたのですが、私の環境だと > > > > [:before, 100] > > [:after, 100] > > > > になっちゃいます...。なんでだろう。 > > > > $ ruby -v > > ruby 1.9.0 (2006-05-23) [i686-linux] > > --enable-thread版、Sjoredパッチ付きのRuby/GLib2使用。 > > CVS版のrubyを使ったら私もそうなりました. > が,以下のスクリプトならパッチの効果がわかりました. 確かに効果がありました。 [:before, 201] [:after, 101] 101個は残るんですね・・・。そういうものなんでしょうか? ぱっと見た限りでは0になるのかなぁ、と思っていたのですが・・・。 -- .:% Masao Mutoh<mu...@hi...> |
From: Masao M. <mu...@hi...> - 2006-05-24 14:06:27
|
むとうです。 On Wed, 24 May 2006 22:04:03 +0900 (JST) Kouhei Sutou <ko...@co...> wrote: > 須藤です. > > In <200...@hi...> > "Re: [ruby-gnome2-devel-ja] GC related callback for Gtk.idle_add and Gtk.timeout_add." on Wed, 24 May 2006 21:57:40 +0900, > Masao Mutoh <mu...@hi...> wrote: > > > 確かに効果がありました。 > > > > [:before, 201] > > [:after, 101] > > > > 101個は残るんですね・・・。そういうものなんでしょうか? > > ぱっと見た限りでは0になるのかなぁ、と思っていたのですが・・・。 > > 繰り返しの間になにか処理を挟んでからまたGC.startすると消える > かもしれませんが... > > とりあえずコミットしてもよいですか? あ、はい、そうですね。お願いします。 できれば、glibの方もお願いしちゃってよろしいでしょうか? #rbglib_maincontext.cあたりかな。 -- .:% Masao Mutoh<mu...@hi...> |
From: Kouhei S. <ko...@co...> - 2006-05-24 15:18:23
|
須藤です. In <200...@hi...> "Re: [ruby-gnome2-devel-ja] GC related callback for Gtk.idle_add and Gtk.timeout_add." on Wed, 24 May 2006 23:06:04 +0900, Masao Mutoh <mu...@hi...> wrote: > > とりあえずコミットしてもよいですか? > > あ、はい、そうですね。お願いします。 コミットしました. > できれば、glibの方もお願いしちゃってよろしいでしょうか? > #rbglib_maincontext.cあたりかな。 わかりました. 明日やっておきます. |
From: Masao M. <mu...@hi...> - 2006-05-25 13:34:56
|
むとうです。 On Thu, 25 May 2006 11:14:08 +0900 "Kouhei Sutou" <ko...@co...> wrote: > 須藤です. > > > 06/05/25 に Kouhei Sutou<ko...@co...> さんは書きました: > > > > できれば、glibの方もお願いしちゃってよろしいでしょうか? > > > #rbglib_maincontext.cあたりかな。 > > > > わかりました. > > 明日やっておきます. > > ざくっとやってみましたが,いくつか問題点が見えてきました. > > * funcをそのままdataとしてg_idle_addしているわけではないので, > idle_removeが動かなくなる. なるほど。正直、削除できなくてもいいやぁ、くらいで実装してしまった記憶が(^^;)。 idle_addの方で、 g_idle_addの戻り値をキーにしてfuncオブジェクトを保持して、 g_idle_removeの方は、g_idle_addの戻り値を引数として受け取って、そのfuncオブジェクト を検索し、dataとして渡す、と言う感じでどうでしょうか? > * GLib::Source.removeでG_REMOVE_RELATIVEしていないのでリーク > する.G_REMOVE_RELATIVEできるようにするには...GLib::Source > にG_RELATIVE2しておくとよいのかなぁ... なるほど・・・。確かにそのような対応が必要そうですね。 > * GLib::Idle.addでpriorityも設定出来るようにした方がよさげだ > けど,現在はfuncをblockとしてではなくoptionalとして取得でき > るようになっているので,priorityを入れるための引数の順番が > 悩ましい. g_idle_add()からg_idle_add_full()にしたい、ってことですよね。 これ、API変えちゃいましょう。互換性を持たせておけばいいです。 GLib::Idle.add(&func) GLib::Idle.add(priority, &func) APIリファレンスからは前者をObsolete扱いで抜かしちゃえばいいでしょう。 idle_add(argc, argv, self) { VALUE arg1, arg2; rb_scan_args(argc, argv, "02", &arg1, &arg2); if arg1 がProc else arg1がpriority -- .:% Masao Mutoh<mu...@hi...> |
From: Masao M. <mu...@hi...> - 2006-05-25 15:47:27
|
むとうです。 On Fri, 26 May 2006 00:10:47 +0900 (JST) Kouhei Sutou <ko...@co...> wrote: > 須藤です. > > In <200...@hi...> > "Re: [ruby-gnome2-devel-ja] GC related callback for Gtk.idle_add and Gtk.timeout_add." on Thu, 25 May 2006 22:34:33 +0900, > Masao Mutoh <mu...@hi...> wrote: > > > > ざくっとやってみましたが,いくつか問題点が見えてきました. > > > > > > * funcをそのままdataとしてg_idle_addしているわけではないので, > > > idle_removeが動かなくなる. > > > > なるほど。正直、削除できなくてもいいやぁ、くらいで実装してしまった記憶が(^^;)。 > > idle_addの方で、 > > g_idle_addの戻り値をキーにしてfuncオブジェクトを保持して、 > > g_idle_removeの方は、g_idle_addの戻り値を引数として受け取って、そのfuncオブジェクト > > を検索し、dataとして渡す、と言う感じでどうでしょうか? > > それは面倒臭そうなのでやりたくなかったのですが,やりました. 口ばかりですみませんです。 (ざっくり略) > ということで,添付のパッチでどうでしょう? > > 手元のテストスクリプトはこんな感じです. はい。大丈夫なようです。CVSへお願いします。 -- .:% Masao Mutoh<mu...@hi...> |
From: Kouhei S. <ko...@co...> - 2006-05-27 01:46:04
|
須藤です. In <200...@hi...> "Re: [ruby-gnome2-devel-ja] GC related callback for Gtk.idle_add and Gtk.timeout_add." on Fri, 26 May 2006 00:47:14 +0900, Masao Mutoh <mu...@hi...> wrote: > > それは面倒臭そうなのでやりたくなかったのですが,やりました. > > 口ばかりですみませんです。 いえいえ,リリース作業の方が大変ですから,それに比べたら全然 です. ;D > はい。大丈夫なようです。CVSへお願いします。 コミットしました. |
From: Kouhei S. <ko...@co...> - 2006-05-25 15:11:40
Attachments:
rbglib-source-gc.diff
|
須藤です. In <200...@hi...> "Re: [ruby-gnome2-devel-ja] GC related callback for Gtk.idle_add and Gtk.timeout_add." on Thu, 25 May 2006 22:34:33 +0900, Masao Mutoh <mu...@hi...> wrote: > > ざくっとやってみましたが,いくつか問題点が見えてきました. > > > > * funcをそのままdataとしてg_idle_addしているわけではないので, > > idle_removeが動かなくなる. > > なるほど。正直、削除できなくてもいいやぁ、くらいで実装してしまった記憶が(^^;)。 > idle_addの方で、 > g_idle_addの戻り値をキーにしてfuncオブジェクトを保持して、 > g_idle_removeの方は、g_idle_addの戻り値を引数として受け取って、そのfuncオブジェクト > を検索し、dataとして渡す、と言う感じでどうでしょうか? それは面倒臭そうなのでやりたくなかったのですが,やりました. > > * GLib::Source.removeでG_REMOVE_RELATIVEしていないのでリーク > > する.G_REMOVE_RELATIVEできるようにするには...GLib::Source > > にG_RELATIVE2しておくとよいのかなぁ... > > なるほど・・・。確かにそのような対応が必要そうですね。 GLib::Source.removeをrbglib_maincontext.cにもってきてごにょ ごにょしました. > > * GLib::Idle.addでpriorityも設定出来るようにした方がよさげだ > > けど,現在はfuncをblockとしてではなくoptionalとして取得でき > > るようになっているので,priorityを入れるための引数の順番が > > 悩ましい. > > g_idle_add()からg_idle_add_full()にしたい、ってことですよね。 > > これ、API変えちゃいましょう。互換性を持たせておけばいいです。 > > GLib::Idle.add(&func) > GLib::Idle.add(priority, &func) > > APIリファレンスからは前者をObsolete扱いで抜かしちゃえばいいでしょう。 > > idle_add(argc, argv, self) > { > VALUE arg1, arg2; > > rb_scan_args(argc, argv, "02", &arg1, &arg2); > > if arg1 がProc > else arg1がpriority このようにしました. ということで,添付のパッチでどうでしょう? 手元のテストスクリプトはこんな感じです. --- require "glib2" class A; end @mainloop = GLib::MainLoop.new(nil, true) def idle_start i = 100 as = [] GLib::Idle.add do as << A.new i -= 1 if i.zero? @mainloop.quit false else true end end end def idle_test idle_start @mainloop.run end 10.times do idle_test p [:before, ObjectSpace.each_object(A) {}] GC.start p [:after, ObjectSpace.each_object(A) {}] end --- |
From: Kouhei S. <ko...@co...> - 2006-05-25 02:14:12
Attachments:
rbglib_maincontext-gc.diff
|
須藤です. 06/05/25 に Kouhei Sutou<ko...@co...> さんは書きました: > > できれば、glibの方もお願いしちゃってよろしいでしょうか? > > #rbglib_maincontext.cあたりかな。 > > わかりました. > 明日やっておきます. ざくっとやってみましたが,いくつか問題点が見えてきました. * funcをそのままdataとしてg_idle_addしているわけではないので, idle_removeが動かなくなる. * GLib::Source.removeでG_REMOVE_RELATIVEしていないのでリーク する.G_REMOVE_RELATIVEできるようにするには...GLib::Source にG_RELATIVE2しておくとよいのかなぁ... * GLib::Idle.addでpriorityも設定出来るようにした方がよさげだ けど,現在はfuncをblockとしてではなくoptionalとして取得でき るようになっているので,priorityを入れるための引数の順番が 悩ましい. |
From: Kouhei S. <ko...@co...> - 2006-05-24 13:50:07
|
須藤です. In <200...@hi...> "Re: [ruby-gnome2-devel-ja] GC related callback for Gtk.idle_add and Gtk.timeout_add." on Wed, 24 May 2006 21:57:40 +0900, Masao Mutoh <mu...@hi...> wrote: > 確かに効果がありました。 > > [:before, 201] > [:after, 101] > > 101個は残るんですね・・・。そういうものなんでしょうか? > ぱっと見た限りでは0になるのかなぁ、と思っていたのですが・・・。 繰り返しの間になにか処理を挟んでからまたGC.startすると消える かもしれませんが... とりあえずコミットしてもよいですか? |
From: Kouhei S. <ko...@co...> - 2006-05-24 03:41:40
|
須藤です. 06/05/24 に Masao Mutoh<mu...@hi...> さんは書きました: > むむむ。パッチ試してみたのですが、私の環境だと > > [:before, 100] > [:after, 100] > > になっちゃいます...。なんでだろう。 > > $ ruby -v > ruby 1.9.0 (2006-05-23) [i686-linux] > --enable-thread版、Sjoredパッチ付きのRuby/GLib2使用。 CVS版のrubyを使ったら私もそうなりました. が,以下のスクリプトならパッチの効果がわかりました. --- require "gtk2" Gtk.init class A; end def idle_start i = 100 as = [] Gtk.idle_add do as << A.new i -= 1 if i.zero? Gtk.main_quit false else true end end end def idle_test idle_start Gtk.main end 10.times do |i| idle_test p [:before, ObjectSpace.each_object(A) {}] GC.start p [:after, ObjectSpace.each_object(A) {}] end --- |