diff options
author | Jeremy Evans <[email protected]> | 2019-10-21 16:54:58 -0700 |
---|---|---|
committer | GitHub <[email protected]> | 2019-10-21 16:54:58 -0700 |
commit | fa8ac91e957a076f6df1adaecad7896817138009 (patch) | |
tree | c8871b6dd46412100ba615b99860bd5c081eacaa /cont.c | |
parent | f37cc1c719f12d2cad6032aa4e6f4236f0604992 (diff) |
Fix Fiber#transfer
Fiber#transfer previously made it impossible to resume the fiber
if it was transferred to (no resuming the target of Fiber#transfer).
However, the documentation specifies that you cannot resume a fiber
that has transferred to another fiber (no resuming the source of
Fiber#transfer), unless control is transferred back.
Fix the code by setting the transferred flag on the current/source
fiber, and unsetting the transferred flag on the target fiber.
Fixes [Bug #9664]
Fixes [Bug #12555]
Notes
Notes:
Merged: https://github.com/ruby/ruby/pull/2588
Merged-By: jeremyevans <[email protected]>
Diffstat (limited to 'cont.c')
-rw-r--r-- | cont.c | 3 |
1 files changed, 2 insertions, 1 deletions
@@ -2226,7 +2226,8 @@ static VALUE rb_fiber_m_transfer(int argc, VALUE *argv, VALUE fiber_value) { rb_fiber_t *fiber = fiber_ptr(fiber_value); - fiber->transferred = 1; + fiber_current()->transferred = 1; + fiber->transferred = 0; return fiber_switch(fiber, argc, argv, 0, PASS_KW_SPLAT); } |