From: Kouhei S. <ko...@co...> - 2005-09-06 14:03:59
|
須藤です. Ruby/Pangoのメモリの割り当て方がおかしい気がします.たとえば, layout_line_get_extents()はこんな風になっていますが, static VALUE layout_line_get_extents(self) VALUE self; { PangoRectangle ink_rect, logical_rect; pango_layout_line_get_extents(_SELF(self), &ink_rect, &logical_rect); return rb_assoc_new(BOXED2RVAL(&ink_rect, PANGO_TYPE_RECTANGLE), BOXED2RVAL(&logical_rect, PANGO_TYPE_RECTANGLE)); } こんな風にしなければいけないのでしょうか? static VALUE layout_line_get_extents(self) VALUE self; { PangoRectangle *ink_rect, *logical_rect; ink_rect = g_new(PangoRectangle, 1); logical_rect = g_new(PangoRectangle, 1); pango_layout_line_get_extents(_SELF(self), ink_rect, logical_rect); return rb_assoc_new(BOXED2RVAL(ink_rect, PANGO_TYPE_RECTANGLE), BOXED2RVAL(logical_rect, PANGO_TYPE_RECTANGLE)); } 手元では以下のスクリプトを実行したら結果に差が出ました. require 'gtk2' Gtk.init layout = Gtk::Invisible.new.create_pango_layout layout.set_text("a") 10000.times do layout.get_line(0).extents end オリジナルでは, pango-segv.rb:7: [BUG] Segmentation fault になり,修正後では *** glibc detected *** corrupted double-linked list: 0x08346070 *** となりました.むぅ. |
From: Kouhei S. <ko...@co...> - 2005-09-06 14:42:01
|
須藤です. In <200...@co...> "[ruby-gnome2-devel-ja] Ruby/Pangoのメモリ管理" on Tue, 06 Sep 2005 23:03:53 +0900 (JST), Kouhei Sutou <ko...@co...> wrote: > 手元では以下のスクリプトを実行したら結果に差が出ました. > > require 'gtk2' > > Gtk.init > layout = Gtk::Invisible.new.create_pango_layout > layout.set_text("a") > 10000.times do > layout.get_line(0).extents > end スクリプトをこうすると require 'gtk2' Gtk.init 10000.times do |i| layout = Gtk::Invisible.new.create_pango_layout layout.set_text("a") layout.get_line(0).extents end > オリジナルでは, このまま↓で > > pango-segv.rb:7: [BUG] Segmentation fault > > になり,修正後では > これ↓が出ずに正常に終了しました. > *** glibc detected *** corrupted double-linked list: 0x08346070 *** > > となりました.むぅ. |
From: Masao M. <mu...@hi...> - 2005-09-06 17:18:14
|
むとうです。 On Tue, 06 Sep 2005 23:03:53 +0900 (JST) Kouhei Sutou <ko...@co...> wrote: > 須藤です. > > Ruby/Pangoのメモリの割り当て方がおかしい気がします.たとえば, > layout_line_get_extents()はこんな風になっていますが, > > static VALUE > layout_line_get_extents(self) > VALUE self; > { > PangoRectangle ink_rect, logical_rect; > > pango_layout_line_get_extents(_SELF(self), &ink_rect, &logical_rect); > > return rb_assoc_new(BOXED2RVAL(&ink_rect, PANGO_TYPE_RECTANGLE), > BOXED2RVAL(&logical_rect, PANGO_TYPE_RECTANGLE)); > } > > こんな風にしなければいけないのでしょうか? > > static VALUE > layout_line_get_extents(self) > VALUE self; > { > PangoRectangle *ink_rect, *logical_rect; > ink_rect = g_new(PangoRectangle, 1); > logical_rect = g_new(PangoRectangle, 1); > > pango_layout_line_get_extents(_SELF(self), ink_rect, logical_rect); > > return rb_assoc_new(BOXED2RVAL(ink_rect, PANGO_TYPE_RECTANGLE), > BOXED2RVAL(logical_rect, PANGO_TYPE_RECTANGLE)); > } うーん。例えば、pango-1.8.1のpango-layout.cのpango_layout_line_get_x_ranges() の実装を見てみると、オリジナルの方と同じやり方してるんですよね...。 > 手元では以下のスクリプトを実行したら結果に差が出ました. > > require 'gtk2' > > Gtk.init > layout = Gtk::Invisible.new.create_pango_layout > layout.set_text("a") > 10000.times do > layout.get_line(0).extents > end > > オリジナルでは, > > pango-segv.rb:7: [BUG] Segmentation fault > > になり,修正後では > > *** glibc detected *** corrupted double-linked list: 0x08346070 *** > > となりました.むぅ. ってか、layout.get_line(0)で落ちてません? require 'gtk2' Gtk.init win = Gtk::Window.new win.realize layout = win.create_pango_layout layout.set_text("a") 10000.times do layout.get_line(0) end -- .:% Masao Mutoh<mu...@hi...> |
From: Masao M. <mu...@hi...> - 2005-09-07 16:32:13
|
むとうです。 On Wed, 07 Sep 2005 13:52:38 +0900 (JST) Kouhei Sutou <ko...@co...> wrote: > 須藤です. > > In <200...@hi...> > "Re: [ruby-gnome2-devel-ja] Ruby/Pangoのメモリ管理" on Wed, 7 Sep 2005 02:18:01 +0900, > Masao Mutoh <mu...@hi...> wrote: > > > > Ruby/Pangoのメモリの割り当て方がおかしい気がします.たとえば, > > > layout_line_get_extents()はこんな風になっていますが, > > > > > > static VALUE > > > layout_line_get_extents(self) > > > VALUE self; > > > { > > > PangoRectangle ink_rect, logical_rect; > > > > > > pango_layout_line_get_extents(_SELF(self), &ink_rect, &logical_rect); > > > > > > return rb_assoc_new(BOXED2RVAL(&ink_rect, PANGO_TYPE_RECTANGLE), > > > BOXED2RVAL(&logical_rect, PANGO_TYPE_RECTANGLE)); > > > } > > > > > > こんな風にしなければいけないのでしょうか? > > > > > > static VALUE > > > layout_line_get_extents(self) > > > VALUE self; > > > { > > > PangoRectangle *ink_rect, *logical_rect; > > > ink_rect = g_new(PangoRectangle, 1); > > > logical_rect = g_new(PangoRectangle, 1); > > > > > > pango_layout_line_get_extents(_SELF(self), ink_rect, logical_rect); > > > > > > return rb_assoc_new(BOXED2RVAL(ink_rect, PANGO_TYPE_RECTANGLE), > > > BOXED2RVAL(logical_rect, PANGO_TYPE_RECTANGLE)); > > > } > > > > > > うーん。例えば、pango-1.8.1のpango-layout.cのpango_layout_line_get_x_ranges() > > の実装を見てみると、オリジナルの方と同じやり方してるんですよね...。 > > pango_layout_line_get_x_ranges()はPangoRectangleを関数内でし > か使わないのでオリジナルの方でよくて, > layout_line_get_extents()はPangoRectangleを返すので,動的に > メモリを割り当てないといけないのではないかと言いたかったんで > す. > 言葉足らずですいません... あぁ、そういうことでしたか。 > > > 手元では以下のスクリプトを実行したら結果に差が出ました. > > > > > > require 'gtk2' > > > > > > Gtk.init > > > layout = Gtk::Invisible.new.create_pango_layout > > > layout.set_text("a") > > > 10000.times do > > > layout.get_line(0).extents > > > end > > > > > > オリジナルでは, > > > > > > pango-segv.rb:7: [BUG] Segmentation fault > > > > > > になり,修正後では > > > > > > *** glibc detected *** corrupted double-linked list: 0x08346070 *** > > > > > > となりました.むぅ. > > > > ってか、layout.get_line(0)で落ちてません? > > > > require 'gtk2' > > > > Gtk.init > > win = Gtk::Window.new > > win.realize > > layout = win.create_pango_layout > > layout.set_text("a") > > 10000.times do > > layout.get_line(0) > > end > > あ,落ちました. > > rbpangolayoutline.cのlayout_line_copy()でg_new()しちゃってい > るのがまずいです. > > Pango 1.10ではpango_layout_line_get_type()が提供されるみたい > なので,1.10になったら自前で作っているlayout_line_get_type() > からpango_layout_line_get_type()に移行するのを忘れないように > しないといけないですね. 1.10からってことがわかってるなら #if PANGO_CHECK_VERSION()で囲めますね。 ついでにお願いしちゃってよろしいですか? #あ、いや、あまりお任せすぎなのもアレなので私がやっても #良いのですけど...。 ちなみに、これって、結局、この両方の修正を加えたら問題はなおったの でしょうか? #自分で確認もせずにすみませんです....。 -- .:% Masao Mutoh<mu...@hi...> |
From: Kouhei S. <ko...@co...> - 2005-09-08 02:36:51
|
須藤です. In <200...@hi...> "Re: [ruby-gnome2-devel-ja] Re: [ruby-gnome2-devel-ja] Ruby/Pangoのメモリ管理" on Thu, 8 Sep 2005 01:32:03 +0900, Masao Mutoh <mu...@hi...> wrote: > > rbpangolayoutline.cのlayout_line_copy()でg_new()しちゃってい > > るのがまずいです. > > > > Pango 1.10ではpango_layout_line_get_type()が提供されるみたい > > なので,1.10になったら自前で作っているlayout_line_get_type() > > からpango_layout_line_get_type()に移行するのを忘れないように > > しないといけないですね. > > 1.10からってことがわかってるなら > #if PANGO_CHECK_VERSION()で囲めますね。 > ついでにお願いしちゃってよろしいですか? はい,やりました. # PANGO_CHECK_VERSION()ってRuby/Pangoで提供していたんですね. > #あ、いや、あまりお任せすぎなのもアレなので私がやっても > #良いのですけど...。 # 忙しい時はお互い様ということで. :) > ちなみに、これって、結局、この両方の修正を加えたら問題はなおったの > でしょうか? layout_line_copy()の修正だけでOKでした. Pango::RectangleはRVAL2BOXEDされるときに(やっぱりRuby/Pango で提供している)pango_rectangle_copy()の中でg_new()されてい たので今のままで大丈夫でした.お騒がせしました. |
From: Masao M. <mu...@hi...> - 2005-09-08 17:47:14
|
むとうです。 On Thu, 08 Sep 2005 11:36:43 +0900 (JST) Kouhei Sutou <ko...@co...> wrote: > 須藤です. > > In <200...@hi...> > "Re: [ruby-gnome2-devel-ja] Re: [ruby-gnome2-devel-ja] Ruby/Pangoのメモリ管理" on Thu, 8 Sep 2005 01:32:03 +0900, > Masao Mutoh <mu...@hi...> wrote: > > > > rbpangolayoutline.cのlayout_line_copy()でg_new()しちゃってい > > > るのがまずいです. > > > > > > Pango 1.10ではpango_layout_line_get_type()が提供されるみたい > > > なので,1.10になったら自前で作っているlayout_line_get_type() > > > からpango_layout_line_get_type()に移行するのを忘れないように > > > しないといけないですね. > > > > 1.10からってことがわかってるなら > > #if PANGO_CHECK_VERSION()で囲めますね。 > > ついでにお願いしちゃってよろしいですか? > > はい,やりました. ありがとうございます。 > # PANGO_CHECK_VERSION()ってRuby/Pangoで提供していたんですね. あ、そうです。説明不足ですみませんです。 ruby extconf.rbしないと最新にならないので注意が必要です。 > > #あ、いや、あまりお任せすぎなのもアレなので私がやっても > > #良いのですけど...。 > > # 忙しい時はお互い様ということで. :) たすかりますm(__)m。 > > ちなみに、これって、結局、この両方の修正を加えたら問題はなおったの > > でしょうか? > > layout_line_copy()の修正だけでOKでした. > Pango::RectangleはRVAL2BOXEDされるときに(やっぱりRuby/Pango > で提供している)pango_rectangle_copy()の中でg_new()されてい > たので今のままで大丈夫でした.お騒がせしました. 了解です。ありがとうございました。 -- .:% Masao Mutoh<mu...@hi...> |
From: Kouhei S. <ko...@co...> - 2005-09-07 04:52:44
Attachments:
ruby-gnome2-pango-layout-line.diff
|
須藤です. In <200...@hi...> "Re: [ruby-gnome2-devel-ja] Ruby/Pangoのメモリ管理" on Wed, 7 Sep 2005 02:18:01 +0900, Masao Mutoh <mu...@hi...> wrote: > > Ruby/Pangoのメモリの割り当て方がおかしい気がします.たとえば, > > layout_line_get_extents()はこんな風になっていますが, > > > > static VALUE > > layout_line_get_extents(self) > > VALUE self; > > { > > PangoRectangle ink_rect, logical_rect; > > > > pango_layout_line_get_extents(_SELF(self), &ink_rect, &logical_rect); > > > > return rb_assoc_new(BOXED2RVAL(&ink_rect, PANGO_TYPE_RECTANGLE), > > BOXED2RVAL(&logical_rect, PANGO_TYPE_RECTANGLE)); > > } > > > > こんな風にしなければいけないのでしょうか? > > > > static VALUE > > layout_line_get_extents(self) > > VALUE self; > > { > > PangoRectangle *ink_rect, *logical_rect; > > ink_rect = g_new(PangoRectangle, 1); > > logical_rect = g_new(PangoRectangle, 1); > > > > pango_layout_line_get_extents(_SELF(self), ink_rect, logical_rect); > > > > return rb_assoc_new(BOXED2RVAL(ink_rect, PANGO_TYPE_RECTANGLE), > > BOXED2RVAL(logical_rect, PANGO_TYPE_RECTANGLE)); > > } > > > うーん。例えば、pango-1.8.1のpango-layout.cのpango_layout_line_get_x_ranges() > の実装を見てみると、オリジナルの方と同じやり方してるんですよね...。 pango_layout_line_get_x_ranges()はPangoRectangleを関数内でし か使わないのでオリジナルの方でよくて, layout_line_get_extents()はPangoRectangleを返すので,動的に メモリを割り当てないといけないのではないかと言いたかったんで す. 言葉足らずですいません... > > 手元では以下のスクリプトを実行したら結果に差が出ました. > > > > require 'gtk2' > > > > Gtk.init > > layout = Gtk::Invisible.new.create_pango_layout > > layout.set_text("a") > > 10000.times do > > layout.get_line(0).extents > > end > > > > オリジナルでは, > > > > pango-segv.rb:7: [BUG] Segmentation fault > > > > になり,修正後では > > > > *** glibc detected *** corrupted double-linked list: 0x08346070 *** > > > > となりました.むぅ. > > ってか、layout.get_line(0)で落ちてません? > > require 'gtk2' > > Gtk.init > win = Gtk::Window.new > win.realize > layout = win.create_pango_layout > layout.set_text("a") > 10000.times do > layout.get_line(0) > end あ,落ちました. rbpangolayoutline.cのlayout_line_copy()でg_new()しちゃってい るのがまずいです. Pango 1.10ではpango_layout_line_get_type()が提供されるみたい なので,1.10になったら自前で作っているlayout_line_get_type() からpango_layout_line_get_type()に移行するのを忘れないように しないといけないですね. |