Method: Extlib::Pooling::Pool#new

Defined in:
lib/extlib/pooling.rb

#newObject



154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
# File 'lib/extlib/pooling.rb', line 154

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 for another thread to release an instance.
        # If we exhaust the pool and don't release the active instance,
        # we'll wait here forever, so it's *very* important to always
        # release your services and *never* exhaust the pool within
        # a single thread.
        wait.wait(lock)
      end
    end
  end until instance
  instance
end