Change ObjCNetworkMonitor::OnPathUpdate to use PostTask
Removes use of AsyncInvoker, replaced with PendingTaskSafetyFlag. The
latter is extended to support creation on a different thread than
where it will be used, and to support stop and restart.
Bug: webrtc:12339
Change-Id: I28b6e09b1542f50037e842ef5fe3a47d15704b46
Reviewed-on: https://webrtc-review.googlesource.com/c/src/+/211002
Commit-Queue: Niels Moller <nisse@webrtc.org>
Reviewed-by: Tommi <tommi@webrtc.org>
Reviewed-by: Kári Helgason <kthelgason@webrtc.org>
Cr-Commit-Position: refs/heads/master@{#33432}
diff --git a/rtc_base/task_utils/pending_task_safety_flag.cc b/rtc_base/task_utils/pending_task_safety_flag.cc
index 4be2131..acdbc00 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 @@
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 1a805f3..4c9d348 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 @@
~PendingTaskSafetyFlag() = default;
void SetNotAlive();
+ void SetAlive();
bool alive() const;
protected:
diff --git a/sdk/BUILD.gn b/sdk/BUILD.gn
index 7a630a9..942202e 100644
--- a/sdk/BUILD.gn
+++ b/sdk/BUILD.gn
@@ -1560,6 +1560,8 @@
"../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 221f912..df4774e 100644
--- a/sdk/objc/native/src/objc_network_monitor.h
+++ b/sdk/objc/native/src/objc_network_monitor.h
@@ -14,9 +14,9 @@
#include <vector>
#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 ObjCNetworkMonitor : public rtc::NetworkMonitorInterface,
public NetworkMonitorObserver {
public:
- ObjCNetworkMonitor() = default;
+ ObjCNetworkMonitor();
~ObjCNetworkMonitor() override;
void Start() override;
@@ -58,7 +58,7 @@
bool started_ = false;
std::map<std::string, rtc::AdapterType> adapter_type_by_name_
RTC_GUARDED_BY(thread_);
- rtc::AsyncInvoker invoker_;
+ rtc::scoped_refptr<PendingTaskSafetyFlag> 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 e0e50ed..e85bb8b 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 <algorithm>
#include "rtc_base/logging.h"
@@ -20,6 +22,10 @@
return new ObjCNetworkMonitor();
}
+ObjCNetworkMonitor::ObjCNetworkMonitor() {
+ safety_flag_ = PendingTaskSafetyFlag::Create();
+}
+
ObjCNetworkMonitor::~ObjCNetworkMonitor() {
network_monitor_ = nil;
}
@@ -30,6 +36,7 @@
}
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 @@
if (!started_) {
return;
}
+ safety_flag_->SetNotAlive();
network_monitor_ = nil;
started_ = false;
}
@@ -76,11 +84,11 @@
void ObjCNetworkMonitor::OnPathUpdate(
std::map<std::string, rtc::AdapterType> adapter_type_by_name) {
RTC_DCHECK(network_monitor_ != nil);
- invoker_.AsyncInvoke<void>(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