delete(instance)
click to toggle source
def delete(instance)
lock.synchronize do
instance.instance_variable_set(:@__pool, nil)
@used.delete(instance.object_id)
wait.signal
end
nil
end
dispose()
click to toggle source
def dispose
flush!
@resource.__pools.delete(@args)
!Extlib::Pooling.pools.delete?(self).nil?
end
expired?()
click to toggle source
def expired?
@available.each do |instance|
if Extlib.exiting || instance.instance_variable_get(:@__allocated_in_pool) + Extlib::Pooling.scavenger_interval <= (Time.now + 0.02)
instance.dispose
@available.delete(instance)
end
end
size == 0
end
flush!()
click to toggle source
def flush!
@available.pop.dispose until @available.empty?
end
inspect()
click to toggle source
def inspect
"#<Extlib::Pooling::Pool<#{@resource.name}> available=#{@available.size} used=#{@used.size} size=#{@max_size}>"
end
lock()
click to toggle source
def lock
@resource.__pool_lock
end
new()
click to toggle source
def new
instance = nil
begin
lock.synchronize do
if @available.size > 0
instance = @available.pop
@used[instance.object_id] = instance
elsif @used.size < @max_size
instance = @resource.__new(*@args)
raise InvalidResourceError.new("#{@resource} constructor created a nil object") if instance.nil?
raise InvalidResourceError.new("#{instance} is already part of the pool") if @used.include? instance
instance.instance_variable_set(:@__pool, self)
instance.instance_variable_set(:@__allocated_in_pool, Time.now)
@used[instance.object_id] = instance
else
wait.wait(lock)
end
end
end until instance
instance
end
release(instance)
click to toggle source
def release(instance)
lock.synchronize do
instance.instance_variable_set(:@__allocated_in_pool, Time.now)
@used.delete(instance.object_id)
@available.push(instance)
wait.signal
end
nil
end
scavenge_interval()
click to toggle source
def scavenge_interval
@resource.scavenge_interval
end
size()
click to toggle source
def size
@used.size + @available.size
end
wait()
click to toggle source
def wait
@resource.__pool_wait
end