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...> |