typename TTunnels::value_type TunnelPool::GetNextTunnel (TTunnels& tunnels) { if (tunnels.empty ()) return nullptr; for (auto it: tunnels) if (!it->IsFailed ()) return it; return nullptr; }
typename TTunnels::value_type TunnelPool::GetNextTunnel (TTunnels& tunnels, typename TTunnels::value_type excluded) const { if (tunnels.empty ()) return nullptr; uint32_t ind = rand () % (tunnels.size ()/2 + 1), i = 0; typename TTunnels::value_type tunnel = nullptr; for (auto it: tunnels) { if (it->IsEstablished () && it != excluded) { tunnel = it; i++; } if (i > ind && tunnel) break; } if (!tunnel && excluded && excluded->IsEstablished ()) tunnel = excluded; return tunnel; }