Line data Source code
1 : #include "source/common/network/connection_balancer_impl.h" 2 : 3 : namespace Envoy { 4 : namespace Network { 5 : 6 0 : void ExactConnectionBalancerImpl::registerHandler(BalancedConnectionHandler& handler) { 7 0 : absl::MutexLock lock(&lock_); 8 0 : handlers_.push_back(&handler); 9 0 : } 10 : 11 0 : void ExactConnectionBalancerImpl::unregisterHandler(BalancedConnectionHandler& handler) { 12 0 : absl::MutexLock lock(&lock_); 13 : // This could be made more efficient in various ways, but the number of listeners is generally 14 : // small and this is a rare operation so we can start with this and optimize later if this 15 : // becomes a perf bottleneck. 16 0 : handlers_.erase(std::find(handlers_.begin(), handlers_.end(), &handler)); 17 0 : } 18 : 19 : BalancedConnectionHandler& 20 0 : ExactConnectionBalancerImpl::pickTargetHandler(BalancedConnectionHandler&) { 21 0 : BalancedConnectionHandler* min_connection_handler = nullptr; 22 0 : { 23 0 : absl::MutexLock lock(&lock_); 24 0 : for (BalancedConnectionHandler* handler : handlers_) { 25 0 : if (min_connection_handler == nullptr || 26 0 : handler->numConnections() < min_connection_handler->numConnections()) { 27 0 : min_connection_handler = handler; 28 0 : } 29 0 : } 30 : 31 0 : min_connection_handler->incNumConnections(); // NOLINT(clang-analyzer-core.CallAndMessage) 32 0 : } 33 : 34 0 : return *min_connection_handler; 35 0 : } 36 : 37 : } // namespace Network 38 : } // namespace Envoy