Project

General

Profile

Actions

Bug #3050

closed

Fiber transfer limitation

Added by ko1 (Koichi Sasada) about 14 years ago. Updated almost 13 years ago.

Status:
Closed
Target version:
ruby -v:
-
Backport:
[ruby-dev:40833]

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

Actions

Also available in: Atom PDF

Like0
Like0Like0Like0Like0Like0