編集部が選ぶ「みんなに見てほしい」イチオシまとめはこちら

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

mrubyでC拡張を書く時に引っかかりやすいarena overflowの回避法。あと、arenaの目的についても解説。
プログラミング mruby GC Ruby
4916view 2コメント
3
すずかぜ @suzukaze_jp
@matsumotory mrubyで質問です。mrb_gc_arena_save(),mrb_gc_arena_restore()でGCに回収されないようにする?どういう時に使用すればいいでしょうか?
Yukihiro Matsumoto @yukihiro_matz
@ryu_gi @matsumotory 質問を理解してない気がするのですが、areneの目的のこと? それともarenaを解放した後もGCからオブジェクトを保護するにはどうしたらいいのかってこと?
Yukihiro Matsumoto @yukihiro_matz
@ryu_gi @matsumotory 質問を理解してない気がするのですが、areneの目的のこと? それともarenaを解放した後もGCからオブジェクトを保護するにはどうしたらいいのかってこと?
すずかぜ @suzukaze_jp
@yukihiro_matz @matsumotory (1)mrb_gc_arena_save(),mrb_gc_arena_restore()という関数があるけど何をするのか?(2)アリーナの役割もわかってないです。/arenaを解放した後もGC...という質問ではないです
すずかぜ @suzukaze_jp
@yukihiro_matz @matsumotory (3)mrb_gc_arena_save(),mrb_gc_arena_restore() どうい場合に使用するのかを知りたいです。
松本 亮介 / まつもとりー @matsumotory
@ryu_gi @yukihiro_matz arena_saveやrestoreは、C関数上のオブジェクトを登録しておくarena領域において、そのインデックスを調整するためのAPIです。arenaはgcのルート処理に登録される領域でC関数上のオブジェクトを登録しておく場所です
松本 亮介 / まつもとりー @matsumotory
@ryu_gi @yukihiro_matz arena領域はデフォルトでオブジェクトを100個しか登録できないので、C関数の中でオブジェクトを沢山生成する場合は、生成前にarenaのindexをsaveしておいて、処理が終わった後にrestoreで元のindexに戻してやります
松本 亮介 / まつもとりー @matsumotory
@matsumotory @ryu_gi @yukihiro_matz というのが僕の認識ですが、間違ってる所や補足箇所があれば、Matzさんお願いします…
Yukihiro Matsumoto @yukihiro_matz
@ryu_gi arenaの目的。利用中のオブジェクトはGCに回収されないよう保護する必要がありますが、Cのスタックはポータブルに参照できません。そこでC関数実行中に生成したオブジェクトは全部「生きている」とみなす事で保守的に保護します。
Yukihiro Matsumoto @yukihiro_matz
@ryu_gi arenaの目的(2)。この保護のためにオブジェクトを記録しておく領域がarenaです。mrubyではデフォルトで100個のオブジェクトを登録できます。
Yukihiro Matsumoto @yukihiro_matz
@ryu_gi save/restoreの仕事。現状arenaのサイズは固定なのでC関数実行中にあまり沢山オブジェクトを生成するとarenaが溢れます。そこで沢山オブジェクトを生成する前後にsave/restoreを置くことでarenaのサイズを復元し、溢れを回避します
Yukihiro Matsumoto @yukihiro_matz
@ryu_gi save/restoreの使い方。オブジェクトを生成する領域の前後をsave/restoreで囲みます。ただし、囲まれた範囲内のオブジェクトが保護されなくなりますから、どうしても必要なものはrestore後mrb_gc_protect()で改めて保護してください。
Yukihiro Matsumoto @yukihiro_matz
link: Matzにっき(2013-07-31) - mrubyのmrb_gc_arena_save()/mrb_gc_arena_restore()の使い方 / Twitterに限界を感じてひさびさに書いた http://t.co/PlDQflzr4K

コメント

(๑♪_ ♪๑) @ompugao 2013-07-31 08:58:37
この解説を待っていた!
やまさ@デレ6th全通 @yamasa 2013-08-01 12:04:17
オブジェクトへの参照をスタック以外の場所に保持しておいて寿命管理する、ってのはハザードポインタとかと同じだね。確かにこの方法だとポータブルに書ける。
ログインして広告を非表示にする