Bug #3050
closedFiber transfer limitation
Description
=begin
ささだです.
1.9.2 に入れて欲しい Fiber に関する仕様変更について,一つ忘れていました.
現在,Fiber#transfer と Fiber.yield/Fiber#resume は一緒に使うな,使っ
て変なことが起きても知らないよ,という立場を取っています.というのも,一
緒に使うと簡単に SEGV させることが出来るからです.
例:
require 'fiber'
f2 = nil
f1 = Fiber.new{
p :f1_start
f2.resume
p :f1_end
}
f2 = Fiber.new{
p :f2_start
f1.resume
p :f2_end
}
f1.transfer
#=>
ruby 1.9.2dev (2010-03-16 trunk 26952) [i386-mswin32_90]
:f1_start
:f2_start
:f1_end
:f2_end
[BUG] Segmentation fault
例えば前者が出来るクラスを Coroutine,後者が出来るクラスを
SemiCoroutine として提供して混ぜないようにするという手段もあるのですが,
大クラス主義の Ruby とはなじみません.
そこで,Fiber#resume をした,つまり Fiber.yield する先がある Fiber に
関しては transfer を禁止しようと思います.また,一度でも Fiber#transfer
された先の Fiber を resume 出来ないようにしようと思います.
ちょっと,この制限で十分なのか,検討が足りてないんですが.¶
例だと,f1.resume の時点で例外が飛ぶことになります.
混ぜるな危険,としていたと思うので,この変更で困る人はあんまりいないん
じゃないかなぁと思います.というか,SEGV するバグなので回避しなきゃ
なぁ,という感じです.
バタバタとすみませんが,ご検討下さい.
--
// SASADA Koichi at atdot dot net
=end