From: Yukihiro Matsumoto Date: 2006-02-06T17:39:05+09:00 Subject: [ruby-dev:28304] Re: SEGV with zlib まつもと ゆきひろです In message "Re: [ruby-dev:28303] Re: SEGV with zlib" on Mon, 6 Feb 2006 16:03:10 +0900, H.Yamamoto writes: |確保した順番に関係なく、オブジェクトIDの小さいほうから free 関数を |呼んでいるように見えます。つまり | | A(0x03) -> B(0x02) -> C(0x04) | |のように参照されていると、B が解放されて A の free 関数が解放済みの B |にアクセスしてしまうと。 そういうことです。で、それは仕様だと思ってます。 |zlib.c では gzfile_writer_end で一応 OBJ_IS_FREED という形でチェックしている |のですが、flags に出鱈目な値が入っているので、意図したように働いていません。 開放されてりゃzeroになってるはずなんですがね。デタラメな値が 入っているってことは再利用されちゃってるのかな。 |でも、これって zlib.c のバグというより GC のバグのような・・・ これをバグ認定するとすると、これから解放するオブジェクトに対 して、再度マークスイープを実行して...、とかいうようなことを する必要が出てくるわけなんですが、それだけのGCの速度低下を許 容できる人はいないように思います。私が思いつかないだけで高速 な実装が可能なのかもしれませんが。 # えーと、今思いついたのは、たとえばスイープの前にマークされ # てないT_DATAでもmark関数を呼んでおく(つまり、T_DATAからマー # クされていると解放が1GCサイクル遅くなる)という手はあります # けど、あんまりやりたくないです。 ということで、私としてはzlib.cに「finalizeの中で解放されてい るかもしれないオブジェクトには触らないほうがよい(メソッド呼 び出すとかもってのほか)」とアドバイスしたいところであります。 まつもと ゆきひろ /:|)