| Class | Extlib::Pooling::Pool |
| In: |
lib/extlib/pooling.rb
|
| Parent: | Object |
| available | [R] | |
| used | [R] |
# File lib/extlib/pooling.rb, line 129
129: def initialize(max_size, resource, args)
130: raise ArgumentError.new("+max_size+ should be a Fixnum but was #{max_size.inspect}") unless Fixnum === max_size
131: raise ArgumentError.new("+resource+ should be a Class but was #{resource.inspect}") unless Class === resource
132:
133: @max_size = max_size
134: @resource = resource
135: @args = args
136:
137: @available = []
138: @used = {}
139: Extlib::Pooling.append_pool(self)
140: end
# File lib/extlib/pooling.rb, line 191
191: def delete(instance)
192: lock.synchronize do
193: instance.instance_variable_set(:@__pool, nil)
194: @used.delete(instance.object_id)
195: wait.signal
196: end
197: nil
198: end
# File lib/extlib/pooling.rb, line 213
213: def dispose
214: flush!
215: @resource.__pools.delete(@args)
216: !Extlib::Pooling.pools.delete?(self).nil?
217: end
# File lib/extlib/pooling.rb, line 219
219: def expired?
220: @available.each do |instance|
221: if Extlib.exiting || instance.instance_variable_get(:@__allocated_in_pool) + Extlib::Pooling.scavenger_interval <= (Time.now + 0.02)
222: instance.dispose
223: @available.delete(instance)
224: end
225: end
226: size == 0
227: end
# File lib/extlib/pooling.rb, line 209
209: def flush!
210: @available.pop.dispose until @available.empty?
211: end
# File lib/extlib/pooling.rb, line 205
205: def inspect
206: "#<Extlib::Pooling::Pool<#{@resource.name}> available=#{@available.size} used=#{@used.size} size=#{@max_size}>"
207: end
# File lib/extlib/pooling.rb, line 154
154: def new
155: instance = nil
156: begin
157: lock.synchronize do
158: if @available.size > 0
159: instance = @available.pop
160: @used[instance.object_id] = instance
161: elsif @used.size < @max_size
162: instance = @resource.__new(*@args)
163: raise InvalidResourceError.new("#{@resource} constructor created a nil object") if instance.nil?
164: raise InvalidResourceError.new("#{instance} is already part of the pool") if @used.include? instance
165: instance.instance_variable_set(:@__pool, self)
166: instance.instance_variable_set(:@__allocated_in_pool, Time.now)
167: @used[instance.object_id] = instance
168: else
169: # Wait for another thread to release an instance.
170: # If we exhaust the pool and don't release the active instance,
171: # we'll wait here forever, so it's *very* important to always
172: # release your services and *never* exhaust the pool within
173: # a single thread.
174: wait.wait(lock)
175: end
176: end
177: end until instance
178: instance
179: end
# File lib/extlib/pooling.rb, line 181
181: def release(instance)
182: lock.synchronize do
183: instance.instance_variable_set(:@__allocated_in_pool, Time.now)
184: @used.delete(instance.object_id)
185: @available.push(instance)
186: wait.signal
187: end
188: nil
189: end
# File lib/extlib/pooling.rb, line 150
150: def scavenge_interval
151: @resource.scavenge_interval
152: end