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