Add safety flag to DataChannelController for PostTask.

Bug: none
Change-Id: If70c1cd9fb4e6fefefa96df819deac052655c49a
Reviewed-on: https://webrtc-review.googlesource.com/c/src/+/296140
Reviewed-by: Markus Handell <handellm@webrtc.org>
Commit-Queue: Tomas Gunnarsson <tommi@webrtc.org>
Cr-Commit-Position: refs/heads/main@{#39485}
diff --git a/pc/BUILD.gn b/pc/BUILD.gn
index b071145..2bcf9d3 100644
--- a/pc/BUILD.gn
+++ b/pc/BUILD.gn
@@ -956,6 +956,7 @@
     "../api:rtc_error",
     "../api:scoped_refptr",
     "../api:sequence_checker",
+    "../api/task_queue:pending_task_safety_flag",
     "../api/transport:datagram_transport_interface",
     "../media:media_channel",
     "../media:rtc_media_base",
diff --git a/pc/data_channel_controller.cc b/pc/data_channel_controller.cc
index 6338c55..d0b39fc 100644
--- a/pc/data_channel_controller.cc
+++ b/pc/data_channel_controller.cc
@@ -119,58 +119,50 @@
     return;
 
   signaling_thread()->PostTask(
-      [self = weak_factory_.GetWeakPtr(), params, buffer] {
-        if (self) {
-          RTC_DCHECK_RUN_ON(self->signaling_thread());
-          // TODO(bugs.webrtc.org/11547): The data being received should be
-          // delivered on the network thread (change
-          // SignalDataChannelTransportReceivedData_s to
-          // SignalDataChannelTransportReceivedData_n).
-          self->SignalDataChannelTransportReceivedData_s(params, buffer);
-        }
-      });
+      SafeTask(signaling_safety_.flag(), [this, params, buffer] {
+        RTC_DCHECK_RUN_ON(signaling_thread());
+        // TODO(bugs.webrtc.org/11547): The data being received should be
+        // delivered on the network thread (change
+        // SignalDataChannelTransportReceivedData_s to
+        // SignalDataChannelTransportReceivedData_n).
+        SignalDataChannelTransportReceivedData_s(params, buffer);
+      }));
 }
 
 void DataChannelController::OnChannelClosing(int channel_id) {
   RTC_DCHECK_RUN_ON(network_thread());
-  signaling_thread()->PostTask([self = weak_factory_.GetWeakPtr(), channel_id] {
-    if (self) {
-      RTC_DCHECK_RUN_ON(self->signaling_thread());
-      self->SignalDataChannelTransportChannelClosing_s(channel_id);
-    }
-  });
+  signaling_thread()->PostTask(
+      SafeTask(signaling_safety_.flag(), [this, channel_id] {
+        RTC_DCHECK_RUN_ON(signaling_thread());
+        SignalDataChannelTransportChannelClosing_s(channel_id);
+      }));
 }
 
 void DataChannelController::OnChannelClosed(int channel_id) {
   RTC_DCHECK_RUN_ON(network_thread());
-  signaling_thread()->PostTask([self = weak_factory_.GetWeakPtr(), channel_id] {
-    if (self) {
-      RTC_DCHECK_RUN_ON(self->signaling_thread());
-      self->SignalDataChannelTransportChannelClosed_s(channel_id);
-    }
-  });
+  signaling_thread()->PostTask(
+      SafeTask(signaling_safety_.flag(), [this, channel_id] {
+        RTC_DCHECK_RUN_ON(signaling_thread());
+        SignalDataChannelTransportChannelClosed_s(channel_id);
+      }));
 }
 
 void DataChannelController::OnReadyToSend() {
   RTC_DCHECK_RUN_ON(network_thread());
-  signaling_thread()->PostTask([self = weak_factory_.GetWeakPtr()] {
-    if (self) {
-      RTC_DCHECK_RUN_ON(self->signaling_thread());
-      self->data_channel_transport_ready_to_send_ = true;
-      self->SignalDataChannelTransportWritable_s(
-          self->data_channel_transport_ready_to_send_);
-    }
-  });
+  signaling_thread()->PostTask(SafeTask(signaling_safety_.flag(), [this] {
+    RTC_DCHECK_RUN_ON(signaling_thread());
+    data_channel_transport_ready_to_send_ = true;
+    SignalDataChannelTransportWritable_s(data_channel_transport_ready_to_send_);
+  }));
 }
 
 void DataChannelController::OnTransportClosed(RTCError error) {
   RTC_DCHECK_RUN_ON(network_thread());
-  signaling_thread()->PostTask([self = weak_factory_.GetWeakPtr(), error] {
-    if (self) {
-      RTC_DCHECK_RUN_ON(self->signaling_thread());
-      self->OnTransportChannelClosed(error);
-    }
-  });
+  signaling_thread()->PostTask(
+      SafeTask(signaling_safety_.flag(), [this, error] {
+        RTC_DCHECK_RUN_ON(signaling_thread());
+        OnTransportChannelClosed(error);
+      }));
 }
 
 void DataChannelController::SetupDataChannelTransport_n() {
@@ -236,14 +228,12 @@
                         << params.sid;
   } else {
     config.open_handshake_role = InternalDataChannelInit::kAcker;
-    signaling_thread()->PostTask([self = weak_factory_.GetWeakPtr(),
-                                  label = std::move(label),
-                                  config = std::move(config)] {
-      if (self) {
-        RTC_DCHECK_RUN_ON(self->signaling_thread());
-        self->OnDataChannelOpenMessage(label, config);
-      }
-    });
+    signaling_thread()->PostTask(
+        SafeTask(signaling_safety_.flag(),
+                 [this, label = std::move(label), config = std::move(config)] {
+                   RTC_DCHECK_RUN_ON(signaling_thread());
+                   OnDataChannelOpenMessage(label, config);
+                 }));
   }
   return true;
 }
@@ -345,12 +335,10 @@
       // we can't free it directly here; we need to free it asynchronously.
       sctp_data_channels_to_free_.push_back(*it);
       sctp_data_channels_.erase(it);
-      signaling_thread()->PostTask([self = weak_factory_.GetWeakPtr()] {
-        if (self) {
-          RTC_DCHECK_RUN_ON(self->signaling_thread());
-          self->sctp_data_channels_to_free_.clear();
-        }
-      });
+      signaling_thread()->PostTask(SafeTask(signaling_safety_.flag(), [this] {
+        RTC_DCHECK_RUN_ON(signaling_thread());
+        sctp_data_channels_to_free_.clear();
+      }));
       return;
     }
   }
@@ -411,14 +399,12 @@
 
 void DataChannelController::NotifyDataChannelsOfTransportCreated() {
   RTC_DCHECK_RUN_ON(network_thread());
-  signaling_thread()->PostTask([self = weak_factory_.GetWeakPtr()] {
-    if (self) {
-      RTC_DCHECK_RUN_ON(self->signaling_thread());
-      for (const auto& channel : self->sctp_data_channels_) {
-        channel->OnTransportChannelCreated();
-      }
+  signaling_thread()->PostTask(SafeTask(signaling_safety_.flag(), [this] {
+    RTC_DCHECK_RUN_ON(signaling_thread());
+    for (const auto& channel : sctp_data_channels_) {
+      channel->OnTransportChannelCreated();
     }
-  });
+  }));
 }
 
 rtc::Thread* DataChannelController::network_thread() const {
diff --git a/pc/data_channel_controller.h b/pc/data_channel_controller.h
index aa3f54f..691f2cd 100644
--- a/pc/data_channel_controller.h
+++ b/pc/data_channel_controller.h
@@ -18,6 +18,7 @@
 #include "api/rtc_error.h"
 #include "api/scoped_refptr.h"
 #include "api/sequence_checker.h"
+#include "api/task_queue/pending_task_safety_flag.h"
 #include "api/transport/data_channel_transport_interface.h"
 #include "media/base/media_channel.h"
 #include "pc/data_channel_utils.h"
@@ -172,6 +173,7 @@
   // The weak pointers must be dereferenced and invalidated on the signalling
   // thread only.
   rtc::WeakPtrFactory<DataChannelController> weak_factory_{this};
+  ScopedTaskSafety signaling_safety_;
 };
 
 }  // namespace webrtc