class FiberRecycling::NormalFiberBackend

Attributes

variables[R]

Public Class Methods

finalizer(recycled_fiber_borrower) click to toggle source
# File lib/fiber_recycling/normal_fiber_backend.rb, line 4
def self.finalizer(recycled_fiber_borrower)
  Proc.new { recycled_fiber_borrower.return }
end
new(fiber, block) click to toggle source
# File lib/fiber_recycling/normal_fiber_backend.rb, line 17
def initialize(fiber, block)
  @state = 'created'
  @variables = {}
  @recycled_fiber_borrower =  RecycledFiberPool.local.borrower
  @recycled_fiber = @recycled_fiber_borrower.retrieve
  @recycled_fiber.run { execute(fiber, block) }
  ObjectSpace.define_finalizer(self, self.class.finalizer(@recycled_fiber_borrower))
end
yield(*args) click to toggle source
# File lib/fiber_recycling/normal_fiber_backend.rb, line 8
def self.yield(*args)
  @state = 'suspended'
  return_value = RecycledFiber.yield(*args)
  @state = 'resumed'
  return_value
end

Public Instance Methods

alive?() click to toggle source
# File lib/fiber_recycling/normal_fiber_backend.rb, line 26
def alive?
  @state != 'terminated'
end
inspect() click to toggle source
# File lib/fiber_recycling/normal_fiber_backend.rb, line 30
def inspect
  to_s
end
resume(*args) click to toggle source
# File lib/fiber_recycling/normal_fiber_backend.rb, line 34
def resume(*args)
  raise FiberError, 'dead fiber called' unless alive?
  @recycled_fiber.resume(*args)
end
to_s() click to toggle source
# File lib/fiber_recycling/normal_fiber_backend.rb, line 39
def to_s
  "#<RecycledFiber::Fiber:#{object_hexid} (#{@state})>"
end
transfer(*args) click to toggle source
# File lib/fiber_recycling/normal_fiber_backend.rb, line 43
def transfer(*args)
  raise FiberError, 'dead fiber called' unless alive?
  @recycled_fiber.transfer(*args)
end

Private Instance Methods

execute(fiber, block) click to toggle source
# File lib/fiber_recycling/normal_fiber_backend.rb, line 50
def execute(fiber, block)
  args = RecycledFiber.yield
  Thread.current[:fiber_recycling__fiber] = fiber
  return_value = block.call(*args)
  Thread.current[:fiber_recycling__fiber] = nil
  @state = 'terminated'
  @recycled_fiber = nil
  @recycled_fiber_borrower.return
  return_value
end