Chromium Code Reviews| Index: webrtc/p2p/base/p2ptransportchannel.cc | 
| diff --git a/webrtc/p2p/base/p2ptransportchannel.cc b/webrtc/p2p/base/p2ptransportchannel.cc | 
| index a4bde05d80cb9cac890e8aeaf81f76e3bd31611f..be4bfcc928c59134e3f93e01150eab48d181860f 100644 | 
| --- a/webrtc/p2p/base/p2ptransportchannel.cc | 
| +++ b/webrtc/p2p/base/p2ptransportchannel.cc | 
| @@ -125,6 +125,7 @@ void P2PTransportChannel::AddAllocatorSession( | 
| session->set_generation(static_cast<uint32_t>(allocator_sessions_.size())); | 
| session->SignalPortReady.connect(this, &P2PTransportChannel::OnPortReady); | 
| + session->SignalPortPruned.connect(this, &P2PTransportChannel::OnPortPruned); | 
| session->SignalCandidatesReady.connect( | 
| this, &P2PTransportChannel::OnCandidatesReady); | 
| session->SignalCandidatesAllocationDone.connect( | 
| @@ -1605,7 +1606,7 @@ void P2PTransportChannel::OnPortDestroyed(PortInterface* port) { | 
| std::remove(removed_ports_.begin(), removed_ports_.end(), port), | 
| removed_ports_.end()); | 
| - LOG(INFO) << "Removed port from p2p socket: " | 
| + LOG(INFO) << "Removed port because it is destroyed: " | 
| << static_cast<int>(ports_.size()) << " remaining"; | 
| } | 
| @@ -1615,15 +1616,11 @@ void P2PTransportChannel::OnPortNetworkInactive(PortInterface* port) { | 
| if (!config_.gather_continually) { | 
| return; | 
| } | 
| - auto it = std::find(ports_.begin(), ports_.end(), port); | 
| - // Don't need to do anything if the port has been deleted from the port list. | 
| - if (it == ports_.end()) { | 
| + if (!RemovePort(port)) { | 
| return; | 
| } | 
| - removed_ports_.push_back(*it); | 
| - ports_.erase(it); | 
| - LOG(INFO) << "Removed port due to inactive networks: " << ports_.size() | 
| - << " remaining"; | 
| + LOG(INFO) << "Removed port because its network is inactive : " | 
| + << port->ToString() << " " << ports_.size() << " remaining"; | 
| std::vector<Candidate> candidates = port->Candidates(); | 
| for (Candidate& candidate : candidates) { | 
| candidate.set_transport_name(transport_name()); | 
| @@ -1631,6 +1628,25 @@ void P2PTransportChannel::OnPortNetworkInactive(PortInterface* port) { | 
| SignalCandidatesRemoved(this, candidates); | 
| } | 
| +void P2PTransportChannel::OnPortPruned(PortAllocatorSession* session, | 
| + PortInterface* port) { | 
| + if (RemovePort(port)) { | 
| 
 
Taylor Brandstetter
2016/06/29 20:57:35
If a port is pruned and it doesn't have any connec
 
honghaiz3
2016/06/29 22:53:29
Since the candidates of the port may have been sen
 
 | 
| + LOG(INFO) << "Removed port because it is pruned: " << port->ToString() | 
| + << " " << ports_.size() << " remaining"; | 
| + } | 
| +} | 
| + | 
| +bool P2PTransportChannel::RemovePort(PortInterface* port) { | 
| + auto it = std::find(ports_.begin(), ports_.end(), port); | 
| + // Don't need to do anything if the port has been deleted from the port list. | 
| + if (it == ports_.end()) { | 
| + return false; | 
| + } | 
| + ports_.erase(it); | 
| + removed_ports_.push_back(port); | 
| + return true; | 
| +} | 
| + | 
| // We data is available, let listeners know | 
| void P2PTransportChannel::OnReadPacket(Connection* connection, | 
| const char* data, |