Chromium Code Reviews| Index: webrtc/p2p/base/transportcontroller.cc |
| diff --git a/webrtc/p2p/base/transportcontroller.cc b/webrtc/p2p/base/transportcontroller.cc |
| index 4b24b1990d205a1ae12ec6cf87015ee50cf17822..01394a97aaf19e6cce628e07b157c22b59abf458 100644 |
| --- a/webrtc/p2p/base/transportcontroller.cc |
| +++ b/webrtc/p2p/base/transportcontroller.cc |
| @@ -18,7 +18,7 @@ |
| #include "webrtc/base/thread.h" |
| #include "webrtc/p2p/base/port.h" |
| -namespace cricket { |
| +namespace { |
| enum { |
| MSG_ICECONNECTIONSTATE, |
| @@ -29,11 +29,40 @@ enum { |
| struct CandidatesData : public rtc::MessageData { |
| CandidatesData(const std::string& transport_name, |
| - const Candidates& candidates) |
| + const cricket::Candidates& candidates) |
| : transport_name(transport_name), candidates(candidates) {} |
| std::string transport_name; |
| - Candidates candidates; |
| + cricket::Candidates candidates; |
| +}; |
| + |
| +} // namespace { |
|
honghaiz3
2016/12/14 01:20:00
No left bracket.
|
| + |
| +namespace cricket { |
| + |
| +// This class groups the DTLS and ICE channels, and helps keep track of |
| +// how many external objects (BaseChannels) reference each channel. |
| +class TransportController::ChannelPair { |
| + public: |
| + // TODO(deadbeef): Change the types of |dtls| and |ice| to |
| + // DtlsTransportChannelWrapper and P2PTransportChannelWrapper, |
| + // once TransportChannelImpl is removed. |
| + ChannelPair(TransportChannelImpl* dtls, TransportChannelImpl* ice) |
| + : ice_(ice), dtls_(dtls) {} |
| + |
| + // Currently, all ICE-related calls still go through this DTLS channel. But |
| + // that will change once we get rid of TransportChannelImpl, and the DTLS |
| + // channel interface no longer includes ICE-specific methods. |
| + const TransportChannelImpl* dtls() const { return dtls_.get(); } |
| + TransportChannelImpl* dtls() { return dtls_.get(); } |
| + const TransportChannelImpl* ice() const { return ice_.get(); } |
| + TransportChannelImpl* ice() { return ice_.get(); } |
| + |
| + private: |
| + std::unique_ptr<TransportChannelImpl> ice_; |
| + std::unique_ptr<TransportChannelImpl> dtls_; |
| + |
| + RTC_DISALLOW_COPY_AND_ASSIGN(ChannelPair); |
| }; |
| TransportController::TransportController(rtc::Thread* signaling_thread, |
| @@ -240,7 +269,9 @@ TransportChannel* TransportController::CreateTransportChannel_n( |
| this, &TransportController::OnChannelStateChanged_n); |
| dtls->SignalDtlsHandshakeError.connect( |
| this, &TransportController::OnDtlsHandshakeError); |
| - channels_.insert(channels_.end(), RefCountedChannel(dtls, ice))->AddRef(); |
| + RefCountedChannel* new_pair = new RefCountedChannel(dtls, ice); |
| + new_pair->AddRef(); |
| + channels_.insert(channels_.end(), new_pair); |
| bool channel_added = transport->AddChannel(dtls, component); |
| RTC_DCHECK(channel_added); |
| // Adding a channel could cause aggregate state to change. |
| @@ -260,8 +291,7 @@ void TransportController::DestroyTransportChannel_n( |
| << ", which doesn't exist."; |
| return; |
| } |
| - it->DecRef(); |
| - if (it->ref() > 0) { |
| + if ((*it)->Release() > 0) { |
| return; |
| } |
| channels_.erase(it); |
| @@ -289,8 +319,8 @@ std::vector<std::string> TransportController::transport_names_for_testing() { |
| std::vector<TransportChannelImpl*> TransportController::channels_for_testing() { |
| std::vector<TransportChannelImpl*> ret; |
| - for (RefCountedChannel& channel : channels_) { |
| - ret.push_back(channel.dtls()); |
| + for (RefCountedChannel* channel : channels_) { |
| + ret.push_back(channel->dtls()); |
| } |
| return ret; |
| } |
| @@ -353,27 +383,27 @@ void TransportController::OnMessage(rtc::Message* pmsg) { |
| } |
| } |
| -std::vector<TransportController::RefCountedChannel>::iterator |
| +std::vector<TransportController::RefCountedChannel*>::iterator |
| TransportController::GetChannelIterator_n(const std::string& transport_name, |
| int component) { |
| RTC_DCHECK(network_thread_->IsCurrent()); |
| - return std::find_if( |
| - channels_.begin(), channels_.end(), |
| - [transport_name, component](const RefCountedChannel& channel) { |
| - return channel.dtls()->transport_name() == transport_name && |
| - channel.dtls()->component() == component; |
| - }); |
| + return std::find_if(channels_.begin(), channels_.end(), |
| + [transport_name, component](RefCountedChannel* channel) { |
| + return channel->dtls()->transport_name() == |
| + transport_name && |
| + channel->dtls()->component() == component; |
| + }); |
| } |
| -std::vector<TransportController::RefCountedChannel>::const_iterator |
| +std::vector<TransportController::RefCountedChannel*>::const_iterator |
| TransportController::GetChannelIterator_n(const std::string& transport_name, |
| int component) const { |
| RTC_DCHECK(network_thread_->IsCurrent()); |
| return std::find_if( |
| channels_.begin(), channels_.end(), |
| - [transport_name, component](const RefCountedChannel& channel) { |
| - return channel.dtls()->transport_name() == transport_name && |
| - channel.dtls()->component() == component; |
| + [transport_name, component](const RefCountedChannel* channel) { |
| + return channel->dtls()->transport_name() == transport_name && |
| + channel->dtls()->component() == component; |
| }); |
| } |
| @@ -394,7 +424,7 @@ const TransportController::RefCountedChannel* TransportController::GetChannel_n( |
| int component) const { |
| RTC_DCHECK(network_thread_->IsCurrent()); |
| auto it = GetChannelIterator_n(transport_name, component); |
| - return (it == channels_.end()) ? nullptr : &(*it); |
| + return (it == channels_.end()) ? nullptr : *it; |
| } |
| TransportController::RefCountedChannel* TransportController::GetChannel_n( |
| @@ -402,7 +432,7 @@ TransportController::RefCountedChannel* TransportController::GetChannel_n( |
| int component) { |
| RTC_DCHECK(network_thread_->IsCurrent()); |
| auto it = GetChannelIterator_n(transport_name, component); |
| - return (it == channels_.end()) ? nullptr : &(*it); |
| + return (it == channels_.end()) ? nullptr : *it; |
| } |
| JsepTransport* TransportController::GetOrCreateJsepTransport( |
| @@ -422,6 +452,13 @@ JsepTransport* TransportController::GetOrCreateJsepTransport( |
| void TransportController::DestroyAllChannels_n() { |
| RTC_DCHECK(network_thread_->IsCurrent()); |
| transports_.clear(); |
| + for (RefCountedChannel* channel : channels_) { |
| + // Even though these objects are normally ref-counted, if |
| + // TransportController is deleted while they still have references, just |
| + // remove all references. |
| + while (channel->Release() > 0) { |
| + } |
| + } |
| channels_.clear(); |
| } |
| @@ -443,7 +480,7 @@ void TransportController::SetIceConfig_n(const IceConfig& config) { |
| ice_config_ = config; |
| for (auto& channel : channels_) { |
| - channel.dtls()->SetIceConfig(ice_config_); |
| + channel->dtls()->SetIceConfig(ice_config_); |
| } |
| } |
| @@ -452,7 +489,7 @@ void TransportController::SetIceRole_n(IceRole ice_role) { |
| ice_role_ = ice_role; |
| for (auto& channel : channels_) { |
| - channel.dtls()->SetIceRole(ice_role_); |
| + channel->dtls()->SetIceRole(ice_role_); |
| } |
| } |
| @@ -485,7 +522,7 @@ bool TransportController::SetLocalCertificate_n( |
| } |
| // ... and for the DTLS channel, which needs it for the DTLS handshake. |
| for (auto& channel : channels_) { |
| - bool set_cert_success = channel.dtls()->SetLocalCertificate(certificate); |
| + bool set_cert_success = channel->dtls()->SetLocalCertificate(certificate); |
| RTC_DCHECK(set_cert_success); |
| } |
| return true; |
| @@ -584,7 +621,7 @@ bool TransportController::SetRemoteTransportDescription_n( |
| void TransportController::MaybeStartGathering_n() { |
| for (auto& channel : channels_) { |
| - channel.dtls()->MaybeStartGathering(); |
| + channel->dtls()->MaybeStartGathering(); |
| } |
| } |
| @@ -682,7 +719,7 @@ void TransportController::SetMetricsObserver_n( |
| RTC_DCHECK(network_thread_->IsCurrent()); |
| metrics_observer_ = metrics_observer; |
| for (auto& channel : channels_) { |
| - channel.dtls()->SetMetricsObserver(metrics_observer); |
| + channel->dtls()->SetMetricsObserver(metrics_observer); |
| } |
| } |
| @@ -775,21 +812,21 @@ void TransportController::UpdateAggregateStates_n() { |
| bool any_gathering = false; |
| bool all_done_gathering = !channels_.empty(); |
| for (const auto& channel : channels_) { |
| - any_receiving = any_receiving || channel.dtls()->receiving(); |
| + any_receiving = any_receiving || channel->dtls()->receiving(); |
| any_failed = |
| any_failed || |
| - channel.dtls()->GetState() == TransportChannelState::STATE_FAILED; |
| - all_connected = all_connected && channel.dtls()->writable(); |
| + channel->dtls()->GetState() == TransportChannelState::STATE_FAILED; |
| + all_connected = all_connected && channel->dtls()->writable(); |
| all_completed = |
| - all_completed && channel.dtls()->writable() && |
| - channel.dtls()->GetState() == TransportChannelState::STATE_COMPLETED && |
| - channel.dtls()->GetIceRole() == ICEROLE_CONTROLLING && |
| - channel.dtls()->gathering_state() == kIceGatheringComplete; |
| + all_completed && channel->dtls()->writable() && |
| + channel->dtls()->GetState() == TransportChannelState::STATE_COMPLETED && |
| + channel->dtls()->GetIceRole() == ICEROLE_CONTROLLING && |
| + channel->dtls()->gathering_state() == kIceGatheringComplete; |
| any_gathering = |
| - any_gathering || channel.dtls()->gathering_state() != kIceGatheringNew; |
| + any_gathering || channel->dtls()->gathering_state() != kIceGatheringNew; |
| all_done_gathering = |
| all_done_gathering && |
| - channel.dtls()->gathering_state() == kIceGatheringComplete; |
| + channel->dtls()->gathering_state() == kIceGatheringComplete; |
| } |
| if (any_failed) { |