遠藤です。

2010年4月10日23:20 _ wanabe <redmine / ruby-lang.org>:
> ささださん
>
> このチケットおよびパッチについてコメントいただければ幸いです。
> この対処で問題ないかどうか、もし問題ないとしたら
> 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 <mame / tsg.ne.jp>