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