From: ko1@... Date: 2019-10-24T08:17:31+00:00 Subject: [ruby-core:95529] [Ruby master Bug#9664] cannot resume transferred Fiber even if it should resume Issue #9664 has been updated by ko1 (Koichi Sasada). Assignee changed from ioquatix (Samuel Williams) to ko1 (Koichi Sasada) Status changed from Closed to Rejected The reported behavior is intentional. Fibers are separated to two categories: (1) Semi-coroutine: transition by resume/yiled. There is a "parent/child" relationship like function call (caller/callee). (2) Coroutine: transition by `Fiber#transfer`. There is no relationship between transfer. (2) is the traditional coroutine. However, we designed (1) because it is easy to retrieve (at least I believe it). For example, exception caused by a hild fiber, all parents fibers receive the exception. (2) is optional, like callcc. It should be difficult to use and we believe (1) and (2) should not be mixed (a Fiber should be used by one). (10 years ago, we found good example to show how it is danger behavior, but I can't remember it. sorry) ---------------------------------------- Bug #9664: cannot resume transferred Fiber even if it should resume https://bugs.ruby-lang.org/issues/9664#change-82304 * Author: royaltm (Rafa�� Michalski) * Status: Rejected * Priority: Normal * Assignee: ko1 (Koichi Sasada) * Target version: * ruby -v: 2.1.0 2.0.0-p353 * Backport: 2.0.0: UNKNOWN, 2.1: UNKNOWN ---------------------------------------- The simplified case: ~~~ root = Fiber.current f = Fiber.new { puts 'transfer' root.transfer puts 'yield' Fiber.yield puts 'ok' } f.resume f.transfer f.resume ~~~ First we resume into a new fiber, then the fiber f transfers control back to root and then root transfers control back to f. Then the fiber f yields back to root and when root tries to resume fiber f the unexpected error is raised. In ruby MRI 1.9.(1-3) it works as expected and the result is: transfer yield ok However since MRI 2.0 we get: ~~~ transfer yield -:11:in `resume': cannot resume transferred Fiber (FiberError) from -:11:in `
' ~~~ In ruby #transfer docs one reads: > The fiber which receives the transfer call is treats it much like 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. But it looks like since 2.0 you can't yield and resume fiber after transfering control from or back to it. This looks like if a fiber has ever transfered control with #transfer then it is somehow marked and resuming to it is no more possible. This bug kills possibility to use e.g. fiber-synchronized async frameworks together with enumerators. -- https://bugs.ruby-lang.org/ Unsubscribe: