From: Narihiro Nakamura Date: 2010-10-18T13:01:50+09:00 Subject: [ruby-dev:42409] Re: [BUG: trunk] Lazy sweep and ObjectSpace.each_object nariです。 2010年10月14日19:13 SASADA Koichi : >  ささだです。 > > (2010/10/14 2:34), Yukihiro Matsumoto wrote: >> | 解決策として、中田さんに ObjectSpace.each_object に相当する関数 >> |rb_objspace_each_objects を実行する前に sweep を完全に終了させる、という >> |方法を教えてもらいました。 >> >> オブジェクトがsweep対象かどうかはわかるはずなんだから、sweep >> されるはずのものはeach_objectの対象にしない手もあるんじゃな >> いの? なんか勘違いしてる? > >  手もあると思います。 > > ただ、 "rb_objspace_each_objects()" の仕様上、slot を callback にその > まま渡すようにしているため、free / sweep 対象かは、callback 先で確認しな > ければなりません。free オブジェクトかどうかは、 > > flag が 0 かどうか > > で見ることが出来ますが、sweep 対象(実質 free)であるかどうかは、 > > slot が sweep_slots かつ、 > mark されていないか > > を確認しなければなりません。callback に sweep_slots かどうかを入れるのも > 大変だし、そもそも rb_objspace_each_objects() なんて使われるのはレアケー > スだし、まー全部やっちゃえばいいか、という感じです。 > > > と、今気づきましたが、rb_objspace_each_objects() の callback で GC が > 起きても同じ問題がありますね。callback する前で sweep を完了するように変 > 更しても、結局問題は残るし。どうしようかな。 > > 上記 check を行う rb_objspace_live_p(VALUE) みたいなのを用意して、これ > を使うようにしてもらう、とか? > > -- > // SASADA Koichi at atdot dot net > > rb_objspace_each_objects() の実行前には sweep を完全に終了させることに して、実行中は rb_gc_disable() して、実行後に元に戻すようにどうかなと思った のですが、いかがでしょうか? -- Narihiro Nakamura (nari)