From c5fd745672798221b71611a92c33ab5f2bf04a3b Mon Sep 17 00:00:00 2001 From: Tomas Gunnarsson Date: Sun, 22 Nov 2020 13:44:36 +0100 Subject: [PATCH] Remove AsyncInvoker dependency from P2PTransportChannel Bug: webrtc:11988 Change-Id: Ic7e1f35a18c0af7ae3f602a2d81a0b7fd45b6cf0 Reviewed-on: https://webrtc-review.googlesource.com/c/src/+/194337 Commit-Queue: Tommi Reviewed-by: Harald Alvestrand Cr-Commit-Position: refs/heads/master@{#32663} --- p2p/BUILD.gn | 1 + p2p/base/p2p_transport_channel.cc | 34 +++++++++++++++---------------- p2p/base/p2p_transport_channel.h | 8 +++----- 3 files changed, 21 insertions(+), 22 deletions(-) diff --git a/p2p/BUILD.gn b/p2p/BUILD.gn index 76c8273fba..f8f20de784 100644 --- a/p2p/BUILD.gn +++ b/p2p/BUILD.gn @@ -108,6 +108,7 @@ rtc_library("rtc_p2p") { "../rtc_base/network:sent_packet", "../rtc_base/synchronization:mutex", "../rtc_base/system:rtc_export", + "../rtc_base/task_utils:pending_task_safety_flag", "../rtc_base/task_utils:to_queued_task", "../rtc_base/third_party/base64", "../rtc_base/third_party/sigslot", diff --git a/p2p/base/p2p_transport_channel.cc b/p2p/base/p2p_transport_channel.cc index 998f4a9f6f..ad002aedbb 100644 --- a/p2p/base/p2p_transport_channel.cc +++ b/p2p/base/p2p_transport_channel.cc @@ -109,6 +109,7 @@ namespace cricket { using webrtc::RTCError; using webrtc::RTCErrorType; +using webrtc::ToQueuedTask; bool IceCredentialsChanged(const std::string& old_ufrag, const std::string& old_pwd, @@ -192,6 +193,7 @@ P2PTransportChannel::P2PTransportChannel( } P2PTransportChannel::~P2PTransportChannel() { + RTC_DCHECK_RUN_ON(network_thread_); std::vector copy(connections().begin(), connections().end()); for (Connection* con : copy) { con->Destroy(); @@ -200,7 +202,6 @@ P2PTransportChannel::~P2PTransportChannel() { p.resolver_->Destroy(false); } resolvers_.clear(); - RTC_DCHECK_RUN_ON(network_thread_); } // Add the allocator session to our list so that we know which sessions @@ -283,10 +284,11 @@ bool P2PTransportChannel::MaybeSwitchSelectedConnection( // threshold, the new connection is in a better receiving state than the // currently selected connection. So we need to re-check whether it needs // to be switched at a later time. - invoker_.AsyncInvokeDelayed( - RTC_FROM_HERE, thread(), - rtc::Bind(&P2PTransportChannel::SortConnectionsAndUpdateState, this, - *result.recheck_event), + network_thread_->PostDelayedTask( + ToQueuedTask(task_safety_, + [this, recheck = *result.recheck_event]() { + SortConnectionsAndUpdateState(recheck); + }), result.recheck_event->recheck_delay_ms); } @@ -1238,8 +1240,8 @@ void P2PTransportChannel::OnCandidateResolved( Candidate candidate = p->candidate_; resolvers_.erase(p); AddRemoteCandidateWithResolver(candidate, resolver); - thread()->PostTask( - webrtc::ToQueuedTask([] {}, [resolver] { resolver->Destroy(false); })); + network_thread_->PostTask( + ToQueuedTask([resolver]() { resolver->Destroy(false); })); } void P2PTransportChannel::AddRemoteCandidateWithResolver( @@ -1612,10 +1614,10 @@ void P2PTransportChannel::RequestSortAndStateUpdate( IceControllerEvent reason_to_sort) { RTC_DCHECK_RUN_ON(network_thread_); if (!sort_dirty_) { - invoker_.AsyncInvoke( - RTC_FROM_HERE, thread(), - rtc::Bind(&P2PTransportChannel::SortConnectionsAndUpdateState, this, - reason_to_sort)); + network_thread_->PostTask( + ToQueuedTask(task_safety_, [this, reason_to_sort]() { + SortConnectionsAndUpdateState(reason_to_sort); + })); sort_dirty_ = true; } } @@ -1630,9 +1632,8 @@ void P2PTransportChannel::MaybeStartPinging() { RTC_LOG(LS_INFO) << ToString() << ": Have a pingable connection for the first time; " "starting to ping."; - invoker_.AsyncInvoke( - RTC_FROM_HERE, thread(), - rtc::Bind(&P2PTransportChannel::CheckAndPing, this)); + network_thread_->PostTask( + ToQueuedTask(task_safety_, [this]() { CheckAndPing(); })); regathering_controller_->Start(); started_pinging_ = true; } @@ -1949,9 +1950,8 @@ void P2PTransportChannel::CheckAndPing() { MarkConnectionPinged(conn); } - invoker_.AsyncInvokeDelayed( - RTC_FROM_HERE, thread(), - rtc::Bind(&P2PTransportChannel::CheckAndPing, this), delay); + network_thread_->PostDelayedTask( + ToQueuedTask(task_safety_, [this]() { CheckAndPing(); }), delay); } // This method is only for unit testing. diff --git a/p2p/base/p2p_transport_channel.h b/p2p/base/p2p_transport_channel.h index 69a32e462c..1e93942fe9 100644 --- a/p2p/base/p2p_transport_channel.h +++ b/p2p/base/p2p_transport_channel.h @@ -41,11 +41,11 @@ #include "p2p/base/port_allocator.h" #include "p2p/base/port_interface.h" #include "p2p/base/regathering_controller.h" -#include "rtc_base/async_invoker.h" #include "rtc_base/async_packet_socket.h" #include "rtc_base/constructor_magic.h" #include "rtc_base/strings/string_builder.h" #include "rtc_base/system/rtc_export.h" +#include "rtc_base/task_utils/pending_task_safety_flag.h" #include "rtc_base/third_party/sigslot/sigslot.h" #include "rtc_base/thread_annotations.h" @@ -209,8 +209,6 @@ class RTC_EXPORT P2PTransportChannel : public IceTransportInternal { } private: - rtc::Thread* thread() const { return network_thread_; } - bool IsGettingPorts() { RTC_DCHECK_RUN_ON(network_thread_); return allocator_session()->IsGettingPorts(); @@ -361,12 +359,13 @@ class RTC_EXPORT P2PTransportChannel : public IceTransportInternal { int64_t ComputeEstimatedDisconnectedTimeMs(int64_t now, Connection* old_connection); + webrtc::ScopedTaskSafety task_safety_; std::string transport_name_ RTC_GUARDED_BY(network_thread_); int component_ RTC_GUARDED_BY(network_thread_); PortAllocator* allocator_ RTC_GUARDED_BY(network_thread_); webrtc::AsyncResolverFactory* async_resolver_factory_ RTC_GUARDED_BY(network_thread_); - rtc::Thread* network_thread_; + rtc::Thread* const network_thread_; bool incoming_only_ RTC_GUARDED_BY(network_thread_); int error_ RTC_GUARDED_BY(network_thread_); std::vector> allocator_sessions_ @@ -419,7 +418,6 @@ class RTC_EXPORT P2PTransportChannel : public IceTransportInternal { bool has_been_writable_ RTC_GUARDED_BY(network_thread_) = false; // if writable_ has ever been true - rtc::AsyncInvoker invoker_ RTC_GUARDED_BY(network_thread_); absl::optional network_route_ RTC_GUARDED_BY(network_thread_); webrtc::IceEventLog ice_event_log_ RTC_GUARDED_BY(network_thread_);