From: Kouhei S. <ko...@co...> - 2006-05-25 15:11:40
|
須藤です. 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 --- |