From: Masao M. <mu...@hi...> - 2003-10-05 08:49:18
|
むとうです。 On Sun, 05 Oct 2003 10:14:22 +0900 Hiroshi IGARASHI <ig...@ru...> wrote: > いがらしです。 > > At Sun, 05 Oct 2003 03:30:53 +0900 (JST), > Masahiro Sakai (酒井政裕) <sa...@to...> wrote: > > > > そういえば、g_mem_set_vtable()を使って、 > > glibのメモリ管理そのものを置き換えてしまうという手も > > 使えるかも知れません。 これ、良いですね。まずはこれあてちゃってください。 実際、試してみたんですけど、前回は”固まった”ものが、 ひととおり最後までは処理できます。 もちろん、メモリの限界(?)までGCされないので、 GC.startを明示的に行うよりは重くなります。ま、当たり前ですね。 > これができるなら、同プロセス内のglib管理下のメモリに > 関しては解決できるでしょうね。ただこれ以外にも > > ・メモリ以外のリソース(File Descriptorなど) > ・他プロセス(ex. Xサーバ)側のリソース > > があって、 > > ・オブジェクト生成時の救済 > (リソースが足りなかったらrb_gc()を呼んでから再試行。 > ex. rubyのio.c, socket.c) rb_fopen()等を見てみたのですが、それを参考にするとしたら オブジェクト生成時の救済はGdk::Pixbuf.new内のgdk_pixbuf_new()がNULL を返したらrb_gc()を入れて再度gdk_pixbuf_new()してみれば良いのかな。 > ・明示的なリソース解放手段の提供 gtk_object_destroy()の中身ってg_object_run_dispose()呼んでる だけなんですね。これを実装すれば良いのかな。 ってやってみたら、イマイチ効果がわかりませんでした。 オブジェクトはきちんとdestroyedになるようだけど。 rb_gc()との合わせ技だとかなり効果的ですがどうでしょうか。 サンプル require 'gnome2' Gtk.init app = Gtk::Window.new img = Gtk::Image.new app.add img.show app.show file = ARGV[0] Thread.new do 300.times do pb = Gdk::Pixbuf.new(file) img.pixbuf = pb pb.run_dispose p pb, i end end Gtk.main Index: rbgobj_object.c =================================================================== RCS file: /cvsroot/ruby-gnome2/ruby-gnome2/glib/src/rbgobj_object.c,v retrieving revision 1.52 diff -u -r1.52 rbgobj_object.c --- rbgobj_object.c 3 Sep 2003 07:11:02 -0000 1.52 +++ rbgobj_object.c 5 Oct 2003 08:46:57 -0000 @@ -352,6 +352,15 @@ } static VALUE +gobj_run_dispose(self) + VALUE self; +{ + g_object_run_dispose(G_OBJECT(RVAL2GOBJ(self))); + rb_gc(); + return Qnil; +} + +static VALUE gobj_inspect(self) VALUE self; { @@ -593,6 +602,7 @@ rb_define_method(cGObject, "notify", gobj_notify, 1); rb_define_method(cGObject, "thaw_notify", gobj_thaw_notify, 0); rb_define_method(cGObject, "destroyed?", gobj_is_destroyed, 0); + rb_define_method(cGObject, "run_dispose", gobj_run_dispose, 0); rb_define_method(cGObject, "initialize", gobj_initialize, -1); rb_define_method(cGObject, "ref_count", gobj_ref_count, 0); /* for debugging */ -- .:% Masao Mutoh<mu...@hi...> |