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:

committed by
WebRTC LUCI CQ

parent
95f6e8bebb
commit
05a9e5abd3
@ -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",
|
||||||
|
@ -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;
|
||||||
|
Reference in New Issue
Block a user