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