Bug #4019
closedroot fiber allows double resume
Description
=begin
遠藤です。
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 [email protected]
=end
Updated by ko1 (Koichi Sasada) over 14 years ago
=begin
ささだです。
(2010/11/03 16:00), Yusuke Endoh wrote:
Fiber は自分自身を (直接または間接的に) resume しようとすると
double resume という例外を投げますがrequire "fiber"
Fiber.new do
Fiber.current.resume #=> double resume (FiberError)
endroot fiber の場合は 1 回目だけ何も言いません。
ご指摘ありがとうございます。コミットもお願いします。
--
// SASADA Koichi at atdot dot net
=end
Updated by mame (Yusuke Endoh) over 14 years ago
- Status changed from Open to Closed
- % Done changed from 0 to 100
=begin
This issue was solved with changeset r29680.
Yusuke, thank you for reporting this issue.
Your contribution to Ruby is greatly appreciated.
May Ruby be with you.
=end