How to know whether current Fiber is the root Fiber?

Hi, calling Fiber.yield without being in the context of a created
Fiber raises an error:

  can't yield from root fiber (FiberError)

It makes sense, of course. However I would like to know how to check
whether I'm into the root Fiber or not. The documentation doesn't
provide a method for this purpose. Is there a way? I expected
something like Fiber#root?.

Thanks a lot.

···

--
Iñaki Baz Castillo
<ibc@aliax.net>

How about catching the exception?

begin
  Fiber.yield
rescue FiberError
  puts "In root fiber..."
  puts "... so I am going to do something different here."
end

puts 'executing rest of program'

--output:--
In root fiber...
... so I am going to do something different here.
executing rest of program

Or, maybe do something like this:

···

--
Posted via http://www.ruby-forum.com/.

7stud -- wrote in post #991816:

For example:

require 'fiber'

root_fiber = Fiber.current

f = Fiber.new do
  if Fiber.current.eql?(f)
    puts 'not root fiber'
  else
    puts 'root fiber'
  end

  Fiber.yield "hello world"
end

f.resume

--output:--
not root fiber
root fiber

Instead, make that:

require 'fiber'

root_fiber = Fiber.current

f = Fiber.new do
  if Fiber.current.eql?(root_fiber)
    puts 'root fiber'
  else
    puts 'not root fiber'
  end

  Fiber.yield "hello world"
end

f.resume

if Fiber.current.eql?(root_fiber)
  puts 'root fiber'
else
  puts 'not root fiber'
end

···

--
Posted via http://www.ruby-forum.com/\.

Great solution :slight_smile:

Thanks a lot.

···

2011/4/8 7stud -- <bbxx789_05ss@yahoo.com>:

Instead, make that:

require 'fiber'

root_fiber = Fiber.current

f = Fiber.new do
if Fiber.current.eql?(root_fiber)
puts 'root fiber'
else
puts 'not root fiber'
end

Fiber.yield "hello world"
end

f.resume

if Fiber.current.eql?(root_fiber)
puts 'root fiber'
else
puts 'not root fiber'
end

--
Iñaki Baz Castillo
<ibc@aliax.net>

You could even use #equal? instead of #eql? just in case #eql? is overridden.

Kind regards

robert

···

On Mon, Apr 11, 2011 at 9:30 AM, Iñaki Baz Castillo <ibc@aliax.net> wrote:

2011/4/8 7stud -- <bbxx789_05ss@yahoo.com>:

Instead, make that:

require 'fiber'

root_fiber = Fiber.current

f = Fiber.new do
if Fiber.current.eql?(root_fiber)
puts 'root fiber'
else
puts 'not root fiber'
end

Fiber.yield "hello world"
end

f.resume

if Fiber.current.eql?(root_fiber)
puts 'root fiber'
else
puts 'not root fiber'
end

Great solution :slight_smile:

--
remember.guy do |as, often| as.you_can - without end
http://blog.rubybestpractices.com/