class Polyphony::ResourcePool

Implements a limited resource pool

Attributes

limit[R]
size[R]

Public Class Methods

new(opts, &block) click to toggle source

Initializes a new resource pool @param opts [Hash] options @param &block [Proc] allocator block

# File lib/polyphony/core/resource_pool.rb, line 11
def initialize(opts, &block)
  @allocator = block
  @limit = opts[:limit] || 4
  @size = 0
  @stock = Polyphony::Queue.new
  @acquired_resources = {}
end

Public Instance Methods

acquire() { |acquired_resources| ... } click to toggle source
# File lib/polyphony/core/resource_pool.rb, line 23
def acquire(&block)
  fiber = Fiber.current
  return yield @acquired_resources[fiber] if @acquired_resources[fiber]

  acquire_from_stock(fiber, &block)
end
acquire_from_stock(fiber) { |resource| ... } click to toggle source
# File lib/polyphony/core/resource_pool.rb, line 30
def acquire_from_stock(fiber)
  add_to_stock if (@stock.empty? || @stock.pending?) && @size < @limit
  resource = @stock.shift
  @acquired_resources[fiber] = resource
  yield resource
ensure
  if resource && @acquired_resources[fiber] == resource
    @acquired_resources.delete(fiber)
    @stock.push resource
  end
end
add_to_stock() click to toggle source

Allocates a resource @return [any] allocated resource

# File lib/polyphony/core/resource_pool.rb, line 52
def add_to_stock
  @size += 1
  resource = @allocator.call
  @stock << resource
end
available() click to toggle source
# File lib/polyphony/core/resource_pool.rb, line 19
def available
  @stock.size
end
discard!() click to toggle source

Discards the currently-acquired resource instead of returning it to the pool when done.

# File lib/polyphony/core/resource_pool.rb, line 60
def discard!
  @size -= 1 if @acquired_resources.delete(Fiber.current)
end
method_missing(sym, *args, &block) click to toggle source
# File lib/polyphony/core/resource_pool.rb, line 42
def method_missing(sym, *args, &block)
  acquire { |r| r.send(sym, *args, &block) }
end
preheat!() click to toggle source
# File lib/polyphony/core/resource_pool.rb, line 64
def preheat!
  add_to_stock while @size < @limit
end
respond_to_missing?(*_args) click to toggle source
# File lib/polyphony/core/resource_pool.rb, line 46
def respond_to_missing?(*_args)
  true
end