Hatena::ブログ(Diary)

Islands in the byte stream

2009-07-01

Fixed memory leaks in Class::MOP

Class::MOP::Class->create_anon_class()がメモリリークを起こしていたので修正パッチを書いた。

create_anon_class()自体がメモリリークしていたのは以前から知っていたのだが,気が付いたらメモリリークが増えており,コードのいたるところでリークを起こしていた。その影響は多岐にわたり,create_anon_class()を使わない場合でもリークしていた。

今回のバグで多かったのがXSにおけるSVの揮発化(mortalize)のし忘れである。

XSでは,作業用にSVを割り当てたら,sv_2mortal()で揮発化するか,使い終わったらSvREFCNT_dec()で解放するかしなければならない。そのSVを使用している間に例外が起きる可能性がある場合は,揮発化しておくほうがいいだろう。そうすれば,スコープの終わりに自動的に解放される。

また,XSから戻り値を複数返す時*1は揮発性SVを返さなければならない。XSからの戻り値は普通揮発化する必要がないので注意が必要である。

*1:PPCODE:とPUSHsを使う場合

スパム対策のためのダミーです。もし見えても何も入力しないでください
ゲスト


画像認証

トラックバック - http://d.hatena.ne.jp/gfx/20090701/1246439598