class FiberRecycling::RecycledFiber
Public Class Methods
new()
click to toggle source
# File lib/fiber_recycling/recycled_fiber.rb, line 8 def initialize @native_fiber = ::Fiber.new { execution_loop } @state = :initialized start end
yield(*args)
click to toggle source
# File lib/fiber_recycling/recycled_fiber.rb, line 4 def self.yield(*args) ::Fiber.yield(*args) end
Public Instance Methods
close()
click to toggle source
# File lib/fiber_recycling/recycled_fiber.rb, line 14 def close raise 'can not close, currently running a block' unless @state == :waiting_for_instruction @native_fiber.resume(:close) nil end
execution_loop()
click to toggle source
# File lib/fiber_recycling/recycled_fiber.rb, line 28 def execution_loop last_reutrn_value = nil loop do @state = :waiting_for_instruction instruction = ::Fiber.yield(last_reutrn_value) case instruction when :run @state = :executing_block args = ::Fiber.yield proc = ::Fiber.yield last_reutrn_value = proc.call(*args) when :close @state = :closed break else raise 'invalid instruction' end end end
resume(*args)
click to toggle source
# File lib/fiber_recycling/recycled_fiber.rb, line 48 def resume(*args) raise 'can not resume, not running a block' unless @state == :executing_block @native_fiber.resume(*args) end
run(*args, &block)
click to toggle source
# File lib/fiber_recycling/recycled_fiber.rb, line 20 def run(*args, &block) raise 'can not run, already running a block' unless @state == :waiting_for_instruction @native_fiber.resume(:run) @native_fiber.resume(args) block_reutrn_value = @native_fiber.resume(block) block_reutrn_value end
transfer(*args)
click to toggle source
# File lib/fiber_recycling/recycled_fiber.rb, line 53 def transfer(*args) raise 'can not transfer, not running a block' unless @state == :executing_block @native_fiber.transfer(*args) end
Private Instance Methods
start()
click to toggle source
# File lib/fiber_recycling/recycled_fiber.rb, line 60 def start @native_fiber.resume nil end