Fix race in CallPerfTest.Bitrate_Kbps_PadsToMinTransmitBitrate
Task posted by OnSendRtp might be scheduled after `send_stream_` is
destroyed. Fix by using a PendingTaskSafetyFlag, killed from the
OnStreamsStopped callback.
Bug: webrtc:12726
Change-Id: I935917a3d80e82c3536261d72059448fb7aac00d
Reviewed-on: https://webrtc-review.googlesource.com/c/src/+/228643
Reviewed-by: Erik Språng <sprang@webrtc.org>
Commit-Queue: Niels Moller <nisse@webrtc.org>
Cr-Commit-Position: refs/heads/master@{#34754}
diff --git a/call/BUILD.gn b/call/BUILD.gn
index d542f4b..fc8fd34 100644
--- a/call/BUILD.gn
+++ b/call/BUILD.gn
@@ -535,9 +535,9 @@
"../rtc_base:checks",
"../rtc_base:rtc_base_approved",
"../rtc_base:task_queue_for_test",
- "../rtc_base:task_queue_for_test",
"../rtc_base:threading",
"../rtc_base/synchronization:mutex",
+ "../rtc_base/task_utils:pending_task_safety_flag",
"../rtc_base/task_utils:repeating_task",
"../system_wrappers",
"../system_wrappers:metrics",
diff --git a/call/call_perf_tests.cc b/call/call_perf_tests.cc
index 71bd490..9596323 100644
--- a/call/call_perf_tests.cc
+++ b/call/call_perf_tests.cc
@@ -31,6 +31,7 @@
#include "rtc_base/checks.h"
#include "rtc_base/synchronization/mutex.h"
#include "rtc_base/task_queue_for_test.h"
+#include "rtc_base/task_utils/pending_task_safety_flag.h"
#include "rtc_base/thread.h"
#include "rtc_base/thread_annotations.h"
#include "system_wrappers/include/metrics.h"
@@ -668,12 +669,13 @@
: (kMaxEncodeBitrateKbps +
kAcceptableBitrateErrorMargin / 2)),
num_bitrate_observations_in_range_(0),
- task_queue_(task_queue) {}
+ task_queue_(task_queue),
+ task_safety_flag_(PendingTaskSafetyFlag::CreateDetached()) {}
private:
// TODO(holmer): Run this with a timer instead of once per packet.
Action OnSendRtp(const uint8_t* packet, size_t length) override {
- task_queue_->PostTask(ToQueuedTask([this]() {
+ task_queue_->PostTask(ToQueuedTask(task_safety_flag_, [this]() {
VideoSendStream::Stats stats = send_stream_->GetStats();
if (!stats.substreams.empty()) {
@@ -701,6 +703,8 @@
send_stream_ = send_stream;
}
+ void OnStreamsStopped() override { task_safety_flag_->SetNotAlive(); }
+
void ModifyVideoConfigs(
VideoSendStream::Config* send_config,
std::vector<VideoReceiveStream::Config>* receive_configs,
@@ -729,6 +733,7 @@
int num_bitrate_observations_in_range_;
std::vector<double> bitrate_kbps_list_;
TaskQueueBase* task_queue_;
+ rtc::scoped_refptr<PendingTaskSafetyFlag> task_safety_flag_;
} test(pad_to_min_bitrate, task_queue());
fake_encoder_max_bitrate_ = kMaxEncodeBitrateKbps;