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