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: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",
|
||||
|
@ -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 @@ void CallPerfTest::TestMinTransmitBitrate(bool pad_to_min_bitrate) {
|
||||
: (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 @@ void CallPerfTest::TestMinTransmitBitrate(bool pad_to_min_bitrate) {
|
||||
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 @@ void CallPerfTest::TestMinTransmitBitrate(bool pad_to_min_bitrate) {
|
||||
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;
|
||||
|
Reference in New Issue
Block a user