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