class Rbgo::CoRun::Routine

Attributes

args[RW]
blk[RW]
error[RW]
fiber[RW]
io_receipt[RW]

Public Class Methods

new(*args, new_thread: false, queue_tag: :default, &blk) click to toggle source
# File lib/rbgo/corun.rb, line 138
def initialize(*args, new_thread: false, queue_tag: :default, &blk) # :default :none :actor
  raise 'Routine must have a block' if blk.nil?
  self.args = args
  self.blk  = blk
  Scheduler.instance.schedule(self, new_thread: new_thread, queue_tag: queue_tag)
end

Public Instance Methods

alive?() click to toggle source
# File lib/rbgo/corun.rb, line 129
def alive?
  return fiber.alive? unless fiber.nil?
  true
end

Private Instance Methods

perform() click to toggle source
# File lib/rbgo/corun.rb, line 145
def perform
  if fiber.nil?
    self.fiber = Fiber.new do |*args|
      Thread.current[IS_CORUN_FIBER] = true
      blk.call(*args)
    end
    fiber.define_singleton_method(:transfer) do
      raise 'can not call transfer on CoRun fiber'
    end
  end

  if fiber.alive?
    if io_receipt.nil?
      obj = fiber.resume(*args)
    else
      if io_receipt.done_flag
        obj = fiber.resume(io_receipt.res)
      else
        return nil
      end
    end
    if obj.is_a?(Array) &&
      obj.size == 2 &&
      obj[0] == YIELD_IO_OPERATION &&
      obj[1].is_a?(IOReceipt)
      self.io_receipt = obj[1]
    else
      self.io_receipt = nil
    end
  end
  nil
end