Class: MessagePack::Factory::Pool::MemberPool

Inherits:
Object
  • Object
show all
Defined in:
lib/msgpack/factory.rb,
lib/msgpack/factory.rb

Instance Method Summary collapse

Constructor Details

#initialize(size, &block) ⇒ MemberPool

Returns a new instance of MemberPool.



131
132
133
134
135
# File 'lib/msgpack/factory.rb', line 131

def initialize(size, &block)
  @size = size
  @new_member = block
  @members = []
end

Instance Method Details

#withObject



137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
# File 'lib/msgpack/factory.rb', line 137

def with
  member = @members.pop || @new_member.call
  begin
    yield member
  ensure
    # If the pool is already full, we simply drop the extra member.
    # This is because contrary to a connection pool, creating an extra instance
    # is extremely unlikely to cause some kind of resource exhaustion.
    #
    # We could cycle the members (keep the newer one) but first It's more work and second
    # the older member might have been created pre-fork, so it might be at least partially
    # in shared memory.
    if member && @members.size < @size
      member.reset
      @members << member
    end
  end
end