mrubyのmrb_gc_arena_save()/mrb_gc_arena_restore()の使い方

mrubyでC拡張を書く時に引っかかりやすいarena overflowの回避法。あと、arenaの目的についても解説。
3
すずかぜ@スト6 @suzukaze_jp

@matsumotory mrubyで質問です。mrb_gc_arena_save(),mrb_gc_arena_restore()でGCに回収されないようにする?どういう時に使用すればいいでしょうか?

2013-07-31 00:48:15
Yukihiro Matz @yukihiro_matz

@ryu_gi @matsumotory 質問を理解してない気がするのですが、areneの目的のこと? それともarenaを解放した後もGCからオブジェクトを保護するにはどうしたらいいのかってこと?

2013-07-31 01:03:24
Yukihiro Matz @yukihiro_matz

@ryu_gi @matsumotory 質問を理解してない気がするのですが、areneの目的のこと? それともarenaを解放した後もGCからオブジェクトを保護するにはどうしたらいいのかってこと?

2013-07-31 01:03:24
すずかぜ@スト6 @suzukaze_jp

@yukihiro_matz @matsumotory (1)mrb_gc_arena_save(),mrb_gc_arena_restore()という関数があるけど何をするのか?(2)アリーナの役割もわかってないです。/arenaを解放した後もGC...という質問ではないです

2013-07-31 01:19:07
すずかぜ@スト6 @suzukaze_jp

@yukihiro_matz @matsumotory (3)mrb_gc_arena_save(),mrb_gc_arena_restore() どうい場合に使用するのかを知りたいです。

2013-07-31 01:21:04
まつもとりー / Ryosuke Matsumoto @matsumotory

@ryu_gi @yukihiro_matz arena_saveやrestoreは、C関数上のオブジェクトを登録しておくarena領域において、そのインデックスを調整するためのAPIです。arenaはgcのルート処理に登録される領域でC関数上のオブジェクトを登録しておく場所です

2013-07-31 01:30:17
まつもとりー / Ryosuke Matsumoto @matsumotory

@ryu_gi @yukihiro_matz arena領域はデフォルトでオブジェクトを100個しか登録できないので、C関数の中でオブジェクトを沢山生成する場合は、生成前にarenaのindexをsaveしておいて、処理が終わった後にrestoreで元のindexに戻してやります

2013-07-31 01:32:52
まつもとりー / Ryosuke Matsumoto @matsumotory

@matsumotory @ryu_gi @yukihiro_matz というのが僕の認識ですが、間違ってる所や補足箇所があれば、Matzさんお願いします…

2013-07-31 01:34:19
Yukihiro Matz @yukihiro_matz

@ryu_gi arenaの目的。利用中のオブジェクトはGCに回収されないよう保護する必要がありますが、Cのスタックはポータブルに参照できません。そこでC関数実行中に生成したオブジェクトは全部「生きている」とみなす事で保守的に保護します。

2013-07-31 08:16:45
Yukihiro Matz @yukihiro_matz

@ryu_gi arenaの目的(2)。この保護のためにオブジェクトを記録しておく領域がarenaです。mrubyではデフォルトで100個のオブジェクトを登録できます。

2013-07-31 08:19:02
Yukihiro Matz @yukihiro_matz

@ryu_gi save/restoreの仕事。現状arenaのサイズは固定なのでC関数実行中にあまり沢山オブジェクトを生成するとarenaが溢れます。そこで沢山オブジェクトを生成する前後にsave/restoreを置くことでarenaのサイズを復元し、溢れを回避します

2013-07-31 08:27:02
Yukihiro Matz @yukihiro_matz

@ryu_gi save/restoreの使い方。オブジェクトを生成する領域の前後をsave/restoreで囲みます。ただし、囲まれた範囲内のオブジェクトが保護されなくなりますから、どうしても必要なものはrestore後mrb_gc_protect()で改めて保護してください。

2013-07-31 08:33:16
Yukihiro Matz @yukihiro_matz

link: Matzにっき(2013-07-31) - mrubyのmrb_gc_arena_save()/mrb_gc_arena_restore()の使い方 / Twitterに限界を感じてひさびさに書いた http://t.co/PlDQflzr4K

2013-07-31 14:17:11