def lookup_or_add(key)
raise ArgumentError, "cleanup() has already been called." if @done
must_be_in_synchronize_block
server = @collection[key]
if server
register_activity(server)
return server
else
server = yield
if !server.respond_to?(:start)
raise TypeError, "The block didn't return a valid AbstractServer object."
end
if eligable_for_cleanup?(server)
server.next_cleaning_time = Time.now + server.max_idle_time
if @next_cleaning_time && server.next_cleaning_time < @next_cleaning_time
@next_cleaning_time = server.next_cleaning_time
@next_cleaning_time_changed = true
end
end
@collection[key] = server
return server
end
end