From: Yusuke Endoh Date: 2010-11-04T01:00:10+09:00 Subject: [ruby-dev:42523] [Ruby 1.9-Bug#4019][Open] root fiber allows double resume Bug #4019: root fiber allows double resume http://redmine.ruby-lang.org/issues/show/4019 起票者: Yusuke Endoh ステータス: Open, 優先度: Normal カテゴリ: core ruby -v: ruby 1.9.3dev (2010-11-03 trunk 29679) [i686-linux] 遠藤です。 Fiber は自分自身を (直接または間接的に) resume しようとすると double resume という例外を投げますが require "fiber" Fiber.new do Fiber.current.resume #=> double resume (FiberError) end root fiber の場合は 1 回目だけ何も言いません。 require "fiber" Fiber.current.resume #=> nil Fiber.current.resume #=> double resume (FiberError) diff --git a/cont.c b/cont.c index b0b3f41..b0defca 100644 --- a/cont.c +++ b/cont.c @@ -1292,7 +1292,7 @@ rb_fiber_resume(VALUE fibval, int argc, VALUE *argv) rb_fiber_t *fib; GetFiberPtr(fibval, fib); - if (fib->prev != Qnil) { + if (fib->prev != Qnil || fib->cont.type == ROOT_FIBER_CONTEXT) { rb_raise(rb_eFiberError, "double resume"); } diff --git a/test/ruby/test_fiber.rb b/test/ruby/test_fiber.rb index edfe55a..ec64f98 100644 --- a/test/ruby/test_fiber.rb +++ b/test/ruby/test_fiber.rb @@ -189,5 +189,13 @@ class TestFiber < Test::Unit::TestCase f1.transfer }, '[ruby-dev:40833]' end + + def test_resume_root_fiber + assert_raise(FiberError) do + Thread.new do + Fiber.current.resume + end.join + end + end end -- Yusuke Endoh ---------------------------------------- http://redmine.ruby-lang.org