Actions
Feature #20102
closedIntroduce `Fiber#resuming?`
Feature #20102:
Introduce `Fiber#resuming?`
Description
There are some tricky edge cases when using Fibre#raise and Fiber#kill, e.g.
fiber = nil
killer = Fiber.new do
fiber.raise("Stop")
end
fiber = Fiber.new do
killer.resume
end
fiber.resume
# 4:in `raise': attempt to raise a resuming fiber (FiberError)
# 4:in `block in <main>'
Async has to deal with this edge case explicitly by rescuing the exception:
I'd like to avoid doing that and instead just ask "Can I kill/raise on this fiber right now?" which is determined by whether the fiber itself can be resumed or transferred to.
To address this, I'd like to introduce Fiber#resuming?:
/*
* call-seq: fiber.resumed? -> true or false
*
* Whether the fiber is currently resumed.
*/
VALUE
rb_fiber_resuming_p(VALUE fiber_value)
{
struct rb_fiber_struct *fiber = fiber_ptr(fiber_value);
if (FIBER_TERMINATED_P(fiber)) return RUBY_Qfalse;
return RBOOL(fiber->resuming_fiber);
}
See the PR: https://github.com/ruby/ruby/pull/9382
Actions