core/fiber.rb
class Fiber
attr_reader :stack_size
attr_reader :thread_name
attr_reader :fiber_id
attr_reader :source
def self.new(**kw, &block)
if block.nil?
raise ArgumentError, "Fiber.new requires a block"
end
stack_size = Rubinius::Type.try_convert kw[:stack_size], Fixnum, :to_int
Rubinius.invoke_primitive :fiber_new, stack_size, block, self
end
def self.current
Rubinius.primitive :fiber_s_current
raise PrimitiveFailure, "Fiber.current primitive failed"
end
def self.yield(*args)
Rubinius.primitive :fiber_s_yield
raise PrimitiveFailure, "Fiber.yield primitive failed"
end
def self.list
Rubinius.primitive :fiber_s_list
raise PrimitiveFailure, "Fiber.list primitive failed"
end
def self.main
Rubinius.primitive :fiber_s_main
raise PrimitiveFailure, "Fiber.main primitive failed"
end
def self.count
Rubinius.primitive :fiber_s_count
raise PrimitiveFailure, "Fiber.count primitive failed"
end
def status
Rubinius.primitive :fiber_status
raise PrimitiveFailure, "Fiber#status primitive failed"
end
def resume(*args)
Rubinius.primitive :fiber_resume
raise PrimitiveFailure, "Fiber#resume primitive failed"
end
def transfer(*args)
Rubinius.primitive :fiber_transfer
raise PrimitiveFailure, "Fiber#transfer primitive failed"
end
def dispose
Rubinius.primitive :fiber_dispose
raise PrimitiveFailure, "Fiber#dispose primitive failed"
end
def alive?
status != "dead"
end
def inspect
str = "#<#{self.class}:0x#{object_id.to_s(16)} thread_name=#{@thread_name} fiber_id=#{@fiber_id} status=#{status}"
str << " source=#{@source}" if @source
str << ">"
end
alias_method :to_s, :inspect
end