[前][次][番号順一覧][スレッド一覧]

ruby-changes:58464

From: Jeremy <ko1@a...>
Date: Sun, 27 Oct 2019 10:50:17 +0900 (JST)
Subject: [ruby-changes:58464] aba23d83f2 (master): Fix documentation for Fiber#transfer [ci skip]

https://git.ruby-lang.org/ruby.git/commit/?id=aba23d83f2

From aba23d83f2697247488a2e770fcb9ce5abfcd16c Mon Sep 17 00:00:00 2001
From: Jeremy Evans <code@j...>
Date: Sat, 26 Oct 2019 18:41:35 -0700
Subject: Fix documentation for Fiber#transfer [ci skip]

Fiber#transfer prevents calling Fiber#resume on the receiver of the
transfer method, not the fiber calling transfer.

Transfering back to a fiber does not allow later calling resume on
the fiber.  Once transfer has been called on a fiber, you can never
call resume on the fiber.

Calling resume on a transferred fiber is not a double resume error,
it is a different FiberError (cannot resume transferred Fiber).

For details on the differences between transferred fibers and
regular fibers, see Sasada-san's RubyKaigi 2017 presentation (in
short, Fiber#transfer is for coroutine, Fiber#resume is for
semi-coroutine).

diff --git a/cont.c b/cont.c
index 0db18bb..832068f 100644
--- a/cont.c
+++ b/cont.c
@@ -2191,15 +2191,18 @@ rb_fiber_raise(int argc, VALUE *argv, VALUE fiber) https://github.com/ruby/ruby/blob/trunk/cont.c#L2191
  *  a resume call. Arguments passed to transfer are treated like those
  *  passed to resume.
  *
- *  You cannot resume a fiber that transferred control to another one.
- *  This will cause a double resume error. You need to transfer control
- *  back to this fiber before it can yield and resume.
+ *  You cannot call +resume+ on a fiber that has been transfered to.
+ *  If you call +transfer+ on a fiber, and later call +resume+ on the
+ *  the fiber, a +FiberError+ will be raised. Once you call +transfer+ on
+ *  a fiber, the only way to resume processing the fiber is to
+ *  call +transfer+ on it again.
  *
  *  Example:
  *
  *    fiber1 = Fiber.new do
  *      puts "In Fiber 1"
  *      Fiber.yield
+ *      puts "In Fiber 1 again"
  *    end
  *
  *    fiber2 = Fiber.new do
@@ -2214,12 +2217,16 @@ rb_fiber_raise(int argc, VALUE *argv, VALUE fiber) https://github.com/ruby/ruby/blob/trunk/cont.c#L2217
  *
  *    fiber2.resume
  *    fiber3.resume
+ *    fiber1.resume rescue (p $!)
+ *    fiber1.transfer
  *
  *  <em>produces</em>
  *
- *    In fiber 2
- *    In fiber 1
- *    In fiber 3
+ *    In Fiber 2
+ *    In Fiber 1
+ *    In Fiber 3
+ *    #<FiberError: cannot resume transferred Fiber>
+ *    In Fiber 1 again
  *
  */
 static VALUE
-- 
cgit v0.10.2


--
ML: ruby-changes@q...
Info: http://www.atdot.net/~ko1/quickml/

[前][次][番号順一覧][スレッド一覧]