Cleanup in NetworkEmulationManager

This prepares for an upcoming CL removing cross traffic processing
when it's not used.

Bug: webrtc:10365
Change-Id: I7f1f3998f7f38c2a627b888c3db6b0c459d8271d
Reviewed-on: https://webrtc-review.googlesource.com/c/src/+/133485
Reviewed-by: Artem Titov <titovartem@webrtc.org>
Commit-Queue: Sebastian Jansson <srte@webrtc.org>
Cr-Commit-Position: refs/heads/master@{#27682}
diff --git a/test/scenario/network/BUILD.gn b/test/scenario/network/BUILD.gn
index 0bcd65d..1f690c5 100644
--- a/test/scenario/network/BUILD.gn
+++ b/test/scenario/network/BUILD.gn
@@ -46,6 +46,7 @@
     "../../../rtc_base:rtc_task_queue",
     "../../../rtc_base:safe_minmax",
     "../../../rtc_base:task_queue_for_test",
+    "../../../rtc_base/synchronization:sequence_checker",
     "../../../rtc_base/task_utils:repeating_task",
     "../../../rtc_base/third_party/sigslot",
     "../../../system_wrappers",
diff --git a/test/scenario/network/cross_traffic.cc b/test/scenario/network/cross_traffic.cc
index bd63a08..1d4efef 100644
--- a/test/scenario/network/cross_traffic.cc
+++ b/test/scenario/network/cross_traffic.cc
@@ -25,10 +25,13 @@
                                                TrafficRoute* traffic_route)
     : config_(config),
       traffic_route_(traffic_route),
-      random_(config_.random_seed) {}
+      random_(config_.random_seed) {
+  sequence_checker_.Detach();
+}
 RandomWalkCrossTraffic::~RandomWalkCrossTraffic() = default;
 
 void RandomWalkCrossTraffic::Process(Timestamp at_time) {
+  RTC_DCHECK_RUN_ON(&sequence_checker_);
   if (last_process_time_.IsMinusInfinity()) {
     last_process_time_ = at_time;
   }
@@ -52,6 +55,7 @@
 }
 
 DataRate RandomWalkCrossTraffic::TrafficRate() const {
+  RTC_DCHECK_RUN_ON(&sequence_checker_);
   return config_.peak_rate * intensity_;
 }
 
@@ -66,10 +70,13 @@
 
 PulsedPeaksCrossTraffic::PulsedPeaksCrossTraffic(PulsedPeaksConfig config,
                                                  TrafficRoute* traffic_route)
-    : config_(config), traffic_route_(traffic_route) {}
+    : config_(config), traffic_route_(traffic_route) {
+  sequence_checker_.Detach();
+}
 PulsedPeaksCrossTraffic::~PulsedPeaksCrossTraffic() = default;
 
 void PulsedPeaksCrossTraffic::Process(Timestamp at_time) {
+  RTC_DCHECK_RUN_ON(&sequence_checker_);
   TimeDelta time_since_toggle = at_time - last_update_time_;
   if (time_since_toggle.IsInfinite() ||
       (sending_ && time_since_toggle >= config_.send_duration)) {
@@ -94,6 +101,7 @@
 }
 
 DataRate PulsedPeaksCrossTraffic::TrafficRate() const {
+  RTC_DCHECK_RUN_ON(&sequence_checker_);
   return sending_ ? config_.peak_rate : DataRate::Zero();
 }
 
diff --git a/test/scenario/network/cross_traffic.h b/test/scenario/network/cross_traffic.h
index b5a65fb..e888274 100644
--- a/test/scenario/network/cross_traffic.h
+++ b/test/scenario/network/cross_traffic.h
@@ -18,6 +18,7 @@
 #include "api/units/time_delta.h"
 #include "api/units/timestamp.h"
 #include "rtc_base/random.h"
+#include "rtc_base/synchronization/sequence_checker.h"
 #include "test/scenario/column_printer.h"
 #include "test/scenario/network/traffic_route.h"
 
@@ -44,15 +45,19 @@
   ColumnPrinter StatsPrinter();
 
  private:
-  RandomWalkConfig config_;
-  TrafficRoute* const traffic_route_;
-  webrtc::Random random_;
+  SequenceChecker sequence_checker_;
+  const RandomWalkConfig config_;
+  TrafficRoute* const traffic_route_ RTC_PT_GUARDED_BY(sequence_checker_);
+  webrtc::Random random_ RTC_GUARDED_BY(sequence_checker_);
 
-  Timestamp last_process_time_ = Timestamp::MinusInfinity();
-  Timestamp last_update_time_ = Timestamp::MinusInfinity();
-  Timestamp last_send_time_ = Timestamp::MinusInfinity();
-  double intensity_ = 0;
-  DataSize pending_size_ = DataSize::Zero();
+  Timestamp last_process_time_ RTC_GUARDED_BY(sequence_checker_) =
+      Timestamp::MinusInfinity();
+  Timestamp last_update_time_ RTC_GUARDED_BY(sequence_checker_) =
+      Timestamp::MinusInfinity();
+  Timestamp last_send_time_ RTC_GUARDED_BY(sequence_checker_) =
+      Timestamp::MinusInfinity();
+  double intensity_ RTC_GUARDED_BY(sequence_checker_) = 0;
+  DataSize pending_size_ RTC_GUARDED_BY(sequence_checker_) = DataSize::Zero();
 };
 
 struct PulsedPeaksConfig {
@@ -74,12 +79,15 @@
   ColumnPrinter StatsPrinter();
 
  private:
-  PulsedPeaksConfig config_;
-  TrafficRoute* const traffic_route_;
+  SequenceChecker sequence_checker_;
+  const PulsedPeaksConfig config_;
+  TrafficRoute* const traffic_route_ RTC_PT_GUARDED_BY(sequence_checker_);
 
-  Timestamp last_update_time_ = Timestamp::MinusInfinity();
-  Timestamp last_send_time_ = Timestamp::MinusInfinity();
-  bool sending_ = false;
+  Timestamp last_update_time_ RTC_GUARDED_BY(sequence_checker_) =
+      Timestamp::MinusInfinity();
+  Timestamp last_send_time_ RTC_GUARDED_BY(sequence_checker_) =
+      Timestamp::MinusInfinity();
+  bool sending_ RTC_GUARDED_BY(sequence_checker_) = false;
 };
 
 }  // namespace test
diff --git a/test/scenario/network/network_emulation_manager.cc b/test/scenario/network/network_emulation_manager.cc
index ae67f6f..8451c97 100644
--- a/test/scenario/network/network_emulation_manager.cc
+++ b/test/scenario/network/network_emulation_manager.cc
@@ -29,6 +29,28 @@
 // uint32_t representation of 192.168.255.255 address
 constexpr uint32_t kMaxIPv4Address = 0xC0A8FFFF;
 
+template <typename T, typename Closure>
+class ResourceOwningTask final : public QueuedTask {
+ public:
+  ResourceOwningTask(T&& resource, Closure&& handler)
+      : resource_(std::move(resource)),
+        handler_(std::forward<Closure>(handler)) {}
+
+  bool Run() override {
+    handler_(std::move(resource_));
+    return true;
+  }
+
+ private:
+  T resource_;
+  Closure handler_;
+};
+template <typename T, typename Closure>
+std::unique_ptr<QueuedTask> CreateResourceOwningTask(T resource,
+                                                     Closure&& closure) {
+  return absl::make_unique<ResourceOwningTask<T, Closure>>(
+      std::forward<T>(resource), std::forward<Closure>(closure));
+}
 }  // namespace
 
 NetworkEmulationManagerImpl::NetworkEmulationManagerImpl()
@@ -58,13 +80,10 @@
   auto node = absl::make_unique<EmulatedNetworkNode>(
       clock_, &task_queue_, std::move(network_behavior));
   EmulatedNetworkNode* out = node.get();
-
-  struct Closure {
-    void operator()() { manager->network_nodes_.push_back(std::move(node)); }
-    NetworkEmulationManagerImpl* manager;
-    std::unique_ptr<EmulatedNetworkNode> node;
-  };
-  task_queue_.PostTask(Closure{this, std::move(node)});
+  task_queue_.PostTask(CreateResourceOwningTask(
+      std::move(node), [this](std::unique_ptr<EmulatedNetworkNode> node) {
+        network_nodes_.push_back(std::move(node));
+      }));
   return out;
 }
 
@@ -170,17 +189,15 @@
 NetworkEmulationManagerImpl::CreateRandomWalkCrossTraffic(
     TrafficRoute* traffic_route,
     RandomWalkConfig config) {
-  auto traffic = absl::make_unique<RandomWalkCrossTraffic>(std::move(config),
-                                                           traffic_route);
+  auto traffic =
+      absl::make_unique<RandomWalkCrossTraffic>(config, traffic_route);
   RandomWalkCrossTraffic* out = traffic.get();
-  struct Closure {
-    void operator()() {
-      manager->random_cross_traffics_.push_back(std::move(traffic));
-    }
-    NetworkEmulationManagerImpl* manager;
-    std::unique_ptr<RandomWalkCrossTraffic> traffic;
-  };
-  task_queue_.PostTask(Closure{this, std::move(traffic)});
+
+  task_queue_.PostTask(CreateResourceOwningTask(
+      std::move(traffic),
+      [this](std::unique_ptr<RandomWalkCrossTraffic> traffic) {
+        random_cross_traffics_.push_back(std::move(traffic));
+      }));
   return out;
 }
 
@@ -188,17 +205,14 @@
 NetworkEmulationManagerImpl::CreatePulsedPeaksCrossTraffic(
     TrafficRoute* traffic_route,
     PulsedPeaksConfig config) {
-  auto traffic = absl::make_unique<PulsedPeaksCrossTraffic>(std::move(config),
-                                                            traffic_route);
+  auto traffic =
+      absl::make_unique<PulsedPeaksCrossTraffic>(config, traffic_route);
   PulsedPeaksCrossTraffic* out = traffic.get();
-  struct Closure {
-    void operator()() {
-      manager->pulsed_cross_traffics_.push_back(std::move(traffic));
-    }
-    NetworkEmulationManagerImpl* manager;
-    std::unique_ptr<PulsedPeaksCrossTraffic> traffic;
-  };
-  task_queue_.PostTask(Closure{this, std::move(traffic)});
+  task_queue_.PostTask(CreateResourceOwningTask(
+      std::move(traffic),
+      [this](std::unique_ptr<PulsedPeaksCrossTraffic> traffic) {
+        pulsed_cross_traffics_.push_back(std::move(traffic));
+      }));
   return out;
 }
 
diff --git a/test/scenario/network/network_emulation_manager.h b/test/scenario/network/network_emulation_manager.h
index b3fd2a5..c164514 100644
--- a/test/scenario/network/network_emulation_manager.h
+++ b/test/scenario/network/network_emulation_manager.h
@@ -66,8 +66,6 @@
       const std::vector<EmulatedEndpoint*>& endpoints) override;
 
  private:
-  FakeNetworkSocketServer* CreateSocketServer(
-      const std::vector<EmulatedEndpoint*>& endpoints);
   absl::optional<rtc::IPAddress> GetNextIPv4Address();
   void ProcessNetworkPackets();
   Timestamp Now() const;