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}
This commit is contained in:
Niels Möller
2021-08-13 14:00:44 +02:00
committed by WebRTC LUCI CQ
parent 95f6e8bebb
commit 05a9e5abd3
2 changed files with 8 additions and 3 deletions

View File

@ -535,9 +535,9 @@ if (rtc_include_tests) {
"../rtc_base:checks", "../rtc_base:checks",
"../rtc_base:rtc_base_approved", "../rtc_base:rtc_base_approved",
"../rtc_base:task_queue_for_test", "../rtc_base:task_queue_for_test",
"../rtc_base:task_queue_for_test",
"../rtc_base:threading", "../rtc_base:threading",
"../rtc_base/synchronization:mutex", "../rtc_base/synchronization:mutex",
"../rtc_base/task_utils:pending_task_safety_flag",
"../rtc_base/task_utils:repeating_task", "../rtc_base/task_utils:repeating_task",
"../system_wrappers", "../system_wrappers",
"../system_wrappers:metrics", "../system_wrappers:metrics",

View File

@ -31,6 +31,7 @@
#include "rtc_base/checks.h" #include "rtc_base/checks.h"
#include "rtc_base/synchronization/mutex.h" #include "rtc_base/synchronization/mutex.h"
#include "rtc_base/task_queue_for_test.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.h"
#include "rtc_base/thread_annotations.h" #include "rtc_base/thread_annotations.h"
#include "system_wrappers/include/metrics.h" #include "system_wrappers/include/metrics.h"
@ -668,12 +669,13 @@ void CallPerfTest::TestMinTransmitBitrate(bool pad_to_min_bitrate) {
: (kMaxEncodeBitrateKbps + : (kMaxEncodeBitrateKbps +
kAcceptableBitrateErrorMargin / 2)), kAcceptableBitrateErrorMargin / 2)),
num_bitrate_observations_in_range_(0), num_bitrate_observations_in_range_(0),
task_queue_(task_queue) {} task_queue_(task_queue),
task_safety_flag_(PendingTaskSafetyFlag::CreateDetached()) {}
private: private:
// TODO(holmer): Run this with a timer instead of once per packet. // TODO(holmer): Run this with a timer instead of once per packet.
Action OnSendRtp(const uint8_t* packet, size_t length) override { 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(); VideoSendStream::Stats stats = send_stream_->GetStats();
if (!stats.substreams.empty()) { if (!stats.substreams.empty()) {
@ -701,6 +703,8 @@ void CallPerfTest::TestMinTransmitBitrate(bool pad_to_min_bitrate) {
send_stream_ = send_stream; send_stream_ = send_stream;
} }
void OnStreamsStopped() override { task_safety_flag_->SetNotAlive(); }
void ModifyVideoConfigs( void ModifyVideoConfigs(
VideoSendStream::Config* send_config, VideoSendStream::Config* send_config,
std::vector<VideoReceiveStream::Config>* receive_configs, std::vector<VideoReceiveStream::Config>* receive_configs,
@ -729,6 +733,7 @@ void CallPerfTest::TestMinTransmitBitrate(bool pad_to_min_bitrate) {
int num_bitrate_observations_in_range_; int num_bitrate_observations_in_range_;
std::vector<double> bitrate_kbps_list_; std::vector<double> bitrate_kbps_list_;
TaskQueueBase* task_queue_; TaskQueueBase* task_queue_;
rtc::scoped_refptr<PendingTaskSafetyFlag> task_safety_flag_;
} test(pad_to_min_bitrate, task_queue()); } test(pad_to_min_bitrate, task_queue());
fake_encoder_max_bitrate_ = kMaxEncodeBitrateKbps; fake_encoder_max_bitrate_ = kMaxEncodeBitrateKbps;