diff --git a/rtc_base/task_utils/pending_task_safety_flag.cc b/rtc_base/task_utils/pending_task_safety_flag.cc index 4be2131f3f..acdbc006bb 100644 --- a/rtc_base/task_utils/pending_task_safety_flag.cc +++ b/rtc_base/task_utils/pending_task_safety_flag.cc @@ -24,6 +24,11 @@ void PendingTaskSafetyFlag::SetNotAlive() { alive_ = false; } +void PendingTaskSafetyFlag::SetAlive() { + RTC_DCHECK_RUN_ON(&main_sequence_); + alive_ = true; +} + bool PendingTaskSafetyFlag::alive() const { RTC_DCHECK_RUN_ON(&main_sequence_); return alive_; diff --git a/rtc_base/task_utils/pending_task_safety_flag.h b/rtc_base/task_utils/pending_task_safety_flag.h index 1a805f33e2..4c9d3482af 100644 --- a/rtc_base/task_utils/pending_task_safety_flag.h +++ b/rtc_base/task_utils/pending_task_safety_flag.h @@ -62,6 +62,7 @@ class PendingTaskSafetyFlag : public rtc::RefCountInterface { ~PendingTaskSafetyFlag() = default; void SetNotAlive(); + void SetAlive(); bool alive() const; protected: diff --git a/sdk/BUILD.gn b/sdk/BUILD.gn index 7a630a9e66..942202e533 100644 --- a/sdk/BUILD.gn +++ b/sdk/BUILD.gn @@ -1560,6 +1560,8 @@ if (is_ios || is_mac) { "../api:sequence_checker", "../rtc_base", "../rtc_base:threading", + "../rtc_base/task_utils:pending_task_safety_flag", + "../rtc_base/task_utils:to_queued_task", ] } } diff --git a/sdk/objc/native/src/objc_network_monitor.h b/sdk/objc/native/src/objc_network_monitor.h index 221f912af2..df4774efe2 100644 --- a/sdk/objc/native/src/objc_network_monitor.h +++ b/sdk/objc/native/src/objc_network_monitor.h @@ -14,9 +14,9 @@ #include #include "api/sequence_checker.h" -#include "rtc_base/async_invoker.h" #include "rtc_base/network_monitor.h" #include "rtc_base/network_monitor_factory.h" +#include "rtc_base/task_utils/pending_task_safety_flag.h" #include "rtc_base/thread.h" #include "rtc_base/thread_annotations.h" #include "sdk/objc/components/network/RTCNetworkMonitor+Private.h" @@ -35,7 +35,7 @@ class ObjCNetworkMonitorFactory : public rtc::NetworkMonitorFactory { class ObjCNetworkMonitor : public rtc::NetworkMonitorInterface, public NetworkMonitorObserver { public: - ObjCNetworkMonitor() = default; + ObjCNetworkMonitor(); ~ObjCNetworkMonitor() override; void Start() override; @@ -58,7 +58,7 @@ class ObjCNetworkMonitor : public rtc::NetworkMonitorInterface, bool started_ = false; std::map adapter_type_by_name_ RTC_GUARDED_BY(thread_); - rtc::AsyncInvoker invoker_; + rtc::scoped_refptr safety_flag_; RTCNetworkMonitor* network_monitor_ = nil; }; diff --git a/sdk/objc/native/src/objc_network_monitor.mm b/sdk/objc/native/src/objc_network_monitor.mm index e0e50ed1c8..e85bb8b6a4 100644 --- a/sdk/objc/native/src/objc_network_monitor.mm +++ b/sdk/objc/native/src/objc_network_monitor.mm @@ -10,6 +10,8 @@ #include "sdk/objc/native/src/objc_network_monitor.h" +#include "rtc_base/task_utils/to_queued_task.h" + #include #include "rtc_base/logging.h" @@ -20,6 +22,10 @@ rtc::NetworkMonitorInterface* ObjCNetworkMonitorFactory::CreateNetworkMonitor() return new ObjCNetworkMonitor(); } +ObjCNetworkMonitor::ObjCNetworkMonitor() { + safety_flag_ = PendingTaskSafetyFlag::Create(); +} + ObjCNetworkMonitor::~ObjCNetworkMonitor() { network_monitor_ = nil; } @@ -30,6 +36,7 @@ void ObjCNetworkMonitor::Start() { } thread_ = rtc::Thread::Current(); RTC_DCHECK_RUN_ON(thread_); + safety_flag_->SetAlive(); network_monitor_ = [[RTCNetworkMonitor alloc] initWithObserver:this]; if (network_monitor_ == nil) { RTC_LOG(LS_WARNING) << "Failed to create RTCNetworkMonitor; not available on this OS?"; @@ -42,6 +49,7 @@ void ObjCNetworkMonitor::Stop() { if (!started_) { return; } + safety_flag_->SetNotAlive(); network_monitor_ = nil; started_ = false; } @@ -76,11 +84,11 @@ bool ObjCNetworkMonitor::IsAdapterAvailable(const std::string& interface_name) { void ObjCNetworkMonitor::OnPathUpdate( std::map adapter_type_by_name) { RTC_DCHECK(network_monitor_ != nil); - invoker_.AsyncInvoke(RTC_FROM_HERE, thread_, [this, adapter_type_by_name] { + thread_->PostTask(ToQueuedTask(safety_flag_, [this, adapter_type_by_name] { RTC_DCHECK_RUN_ON(thread_); adapter_type_by_name_ = adapter_type_by_name; SignalNetworksChanged(); - }); + })); } } // namespace webrtc