class Upfluence::Pool

Attributes

max[R]

Public Class Methods

new(size = 0, options = {}, &block) click to toggle source
# File lib/upfluence/pool.rb, line 11
def initialize(size = 0, options = {}, &block)
  raise NoInstanciationBlock unless block

  @create_block = block
  @redeemed = []
  @que = []
  @max = size
  @mutex = Mutex.new
  @resource = ConditionVariable.new
  @shutdown_block = nil
  @timeout = options.fetch :timeout, 5
end

Public Instance Methods

discard(obj) click to toggle source
# File lib/upfluence/pool.rb, line 24
def discard(obj)
  @mutex.synchronize do
    remove_from_redeemed obj
    @resource.broadcast
  end
end
empty?() click to toggle source
# File lib/upfluence/pool.rb, line 58
def empty?
  (@redeemed.length - @que.length) >= @max
end
length() click to toggle source
# File lib/upfluence/pool.rb, line 62
def length
  @max - @redeemed.length + @que.length
end
pop(options = {}) click to toggle source
# File lib/upfluence/pool.rb, line 40
def pop(options = {})
  timeout = options.fetch :timeout, @timeout
  deadline = Time.now + timeout

  @mutex.synchronize do
    loop do
      return redeem(@que.pop) unless @que.empty?

      connection = redeem(try_create(options))
      return connection if connection

      to_wait = deadline - Time.now
      raise Timeout::Error, "Waited #{timeout} sec" if to_wait <= 0
      @resource.wait(@mutex, to_wait)
    end
  end
end
push(obj) click to toggle source
# File lib/upfluence/pool.rb, line 31
def push(obj)
  @mutex.synchronize do
    remove_from_redeemed obj

    @que.push obj
    @resource.broadcast
  end
end

Private Instance Methods

redeem(obj) click to toggle source
# File lib/upfluence/pool.rb, line 76
def redeem(obj)
  @redeemed << obj if obj
  obj
end
remove_from_redeemed(obj) click to toggle source
# File lib/upfluence/pool.rb, line 68
def remove_from_redeemed(obj)
  unless @redeemed.map(&:object_id).include? obj.object_id
    raise UnknownResource
  end

  @redeemed.reject! { |e| e.object_id == obj.object_id }
end
try_create(_options = nil) click to toggle source
# File lib/upfluence/pool.rb, line 81
def try_create(_options = nil)
  return if @redeemed.length >= @max

  @create_block.call
end