Index: webrtc/p2p/base/p2ptransportchannel.cc |
diff --git a/webrtc/p2p/base/p2ptransportchannel.cc b/webrtc/p2p/base/p2ptransportchannel.cc |
index 0458baf3ef46a0b9d9894ae87cbc6d395ffc2f98..6bcf0d7d2bfb09e9548501dccfde4e2ba249a5bd 100644 |
--- a/webrtc/p2p/base/p2ptransportchannel.cc |
+++ b/webrtc/p2p/base/p2ptransportchannel.cc |
@@ -1306,35 +1306,34 @@ |
} |
void P2PTransportChannel::PruneConnections() { |
- // We can prune any connection for which there is a connected, writable, |
- // and receiving connection with the same network name with better or equal |
- // priority. We leave those with better priority just in case they become |
- // writable later (at which point, we would prune out the current selected |
- // connection). We leave connections on other networks because they may not |
- // be using the same resources and they may represent very distinct paths |
- // over which we can switch. If the |premier| connection is not connected, |
- // we may be reconnecting a TCP connection and temporarily do not prune |
- // connections in this network. See the big comment in |
- // CompareConnectionStates. |
- |
- std::map<std::string, Connection*> premier_connection_by_network_name; |
- if (selected_connection_) { |
- // |selected_connection_| is always a premier connection. |
- const std::string& network_name = |
- selected_connection_->port()->Network()->name(); |
- premier_connection_by_network_name[network_name] = selected_connection_; |
- } |
- for (Connection* conn : connections_) { |
- const std::string& network_name = conn->port()->Network()->name(); |
- Connection* premier = premier_connection_by_network_name[network_name]; |
- // Since the connections are sorted, the first one with a given network name |
- // is the premier connection for the network name. |
- // |premier| might be equal to |conn| if this is the selected connection. |
- if (premier == nullptr) { |
- premier_connection_by_network_name[network_name] = conn; |
- } else if (premier != conn && !premier->weak() && |
- CompareConnectionCandidates(premier, conn) >= 0) { |
- conn->Prune(); |
+ // We can prune any connection for which there is a connected, writable |
+ // connection on the same network with better or equal priority. We leave |
+ // those with better priority just in case they become writable later (at |
+ // which point, we would prune out the current selected connection). We leave |
+ // connections on other networks because they may not be using the same |
+ // resources and they may represent very distinct paths over which we can |
+ // switch. If the |premier| connection is not connected, we may be |
+ // reconnecting a TCP connection and temporarily do not prune connections in |
+ // this network. See the big comment in CompareConnectionStates. |
+ |
+ // Get a list of the networks that we are using. |
+ std::set<rtc::Network*> networks; |
+ for (const Connection* conn : connections_) { |
+ networks.insert(conn->port()->Network()); |
+ } |
+ for (rtc::Network* network : networks) { |
+ Connection* premier = GetBestConnectionOnNetwork(network); |
+ // Do not prune connections if the current selected connection is weak on |
+ // this network. Otherwise, it may delete connections prematurely. |
+ if (!premier || premier->weak()) { |
+ continue; |
+ } |
+ |
+ for (Connection* conn : connections_) { |
+ if ((conn != premier) && (conn->port()->Network() == network) && |
+ (CompareConnectionCandidates(premier, conn) >= 0)) { |
+ conn->Prune(); |
+ } |
} |
} |
} |
@@ -1472,6 +1471,26 @@ |
PresumedWritable(connection)); |
} |
+// If we have a selected connection, return it, otherwise return top one in the |
+// list (later we will mark it best). |
+Connection* P2PTransportChannel::GetBestConnectionOnNetwork( |
+ rtc::Network* network) const { |
+ // If the selected connection is on this network, then it wins. |
+ if (selected_connection_ && |
+ (selected_connection_->port()->Network() == network)) { |
+ return selected_connection_; |
+ } |
+ |
+ // Otherwise, we return the top-most in sorted order. |
+ for (size_t i = 0; i < connections_.size(); ++i) { |
+ if (connections_[i]->port()->Network() == network) { |
+ return connections_[i]; |
+ } |
+ } |
+ |
+ return NULL; |
+} |
+ |
// Handle any queued up requests |
void P2PTransportChannel::OnMessage(rtc::Message *pmsg) { |
switch (pmsg->message_id) { |