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