Ensure pointers in MaybeWorkerThread is valid until after task queue is

deleted.

Bug: webrtc:14502
Change-Id: Ic3be7a4b04f9c3f559695eb4439d376750beed9c
Reviewed-on: https://webrtc-review.googlesource.com/c/src/+/277447
Reviewed-by: Evan Shrubsole <eshr@webrtc.org>
Commit-Queue: Per Kjellander <perkj@webrtc.org>
Cr-Commit-Position: refs/heads/main@{#38298}
This commit is contained in:
Per Kjellander
2022-10-04 17:36:44 +02:00
committed by WebRTC LUCI CQ
parent a494e4b517
commit d0b3e4beb4
3 changed files with 29 additions and 1 deletions

View File

@ -36,6 +36,14 @@ MaybeWorkerThread::MaybeWorkerThread(const FieldTrialsView& field_trials,
MaybeWorkerThread::~MaybeWorkerThread() {
RTC_DCHECK_RUN_ON(&sequence_checker_);
if (owned_task_queue_) {
// owned_task_queue_ must be a valid pointer when the task queue is
// destroyed since there may be tasks that use this object that run when the
// task queue is deleted.
owned_task_queue_->Delete();
owned_task_queue_.release();
}
}
void MaybeWorkerThread::RunSynchronous(absl::AnyInvocable<void() &&> task) {

View File

@ -77,7 +77,7 @@ class RTC_LOCKABLE MaybeWorkerThread {
private:
SequenceChecker sequence_checker_;
const std::unique_ptr<TaskQueueBase, TaskQueueDeleter> owned_task_queue_;
std::unique_ptr<TaskQueueBase, TaskQueueDeleter> owned_task_queue_;
TaskQueueBase* const worker_thread_;
};

View File

@ -137,5 +137,25 @@ TEST(MaybeWorkerThreadTest, IsCurrentBehavesCorrectInExperiment) {
ASSERT_TRUE(event.Wait(TimeDelta::Seconds(10)));
}
TEST(MaybeWorkerThreadTest, IsCurrentCanBeCalledInDestructorPerDefault) {
test::ExplicitKeyValueConfig field_trial("");
RealTimeController controller;
{
MaybeWorkerThread m(field_trial, "test_tq",
controller.GetTaskQueueFactory());
m.RunOrPost([&] { EXPECT_TRUE(m.IsCurrent()); });
}
}
TEST(MaybeWorkerThreadTest, IsCurrentCanBeCalledInDestructorInExperiment) {
test::ExplicitKeyValueConfig field_trial(kFieldTrialString);
RealTimeController controller;
{
MaybeWorkerThread m(field_trial, "test_tq",
controller.GetTaskQueueFactory());
m.RunOrPost([&] { EXPECT_TRUE(m.IsCurrent()); });
}
}
} // namespace
} // namespace webrtc