From: Yusuke ENDOH Date: 2010-04-21T23:55:14+09:00 Subject: [ruby-dev:41035] Re: [Bug #595] Fiber ignores ensure clause 遠藤です。 2010年4月10日23:20 _ wanabe : > ささださん > > このチケットおよびパッチについてコメントいただければ幸いです。 > この対処で問題ないかどうか、もし問題ないとしたら > 1.9.2 リリース前に入れるべきかどうかが気になっています。 > そもそもアプローチがまずいようでしたら別の方法を考えます。 ささださんではないですが勝手にコメントします。 1) プロセス終了時でなく、Fiber が GC で回収される時に ensure 節が 実行されません。 1000.times do Fiber.new do begin Fiber.yield ensure puts "foo!" end end.resume GC.start end # foo! が 1 個しか出ない (期待は 1000 個) $ ./ruby t.rb foo! 実行中の Thread と同様に、yield 中の Fiber は GC しないようにする くらいしか思いつきません。 2) Fiber を作ったスレッドが終了した場合、Fiber の ensure 節が実行 されません。 Thread.new do Fiber.new do begin Fiber.yield ensure puts "foo!" end end.resume end sleep 1 puts "end" # foo! が出ない $ ./ruby t.rb end プロセスの終了時でなく、スレッドの終了時に Fiber を起こさないと 行けない? どちらも仕様レベルで検討しないといけないことのような気がします。 まだ結構大変そうなので、1.9.2 は見送った方がいいんじゃないかなと 思います。早くコメントしていれば、wanabe さんなら余裕で直せたと 思うので残念ですが。 -- Yusuke Endoh