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:
committed by
WebRTC LUCI CQ
parent
a494e4b517
commit
d0b3e4beb4
@ -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) {
|
||||
|
||||
@ -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_;
|
||||
};
|
||||
|
||||
|
||||
@ -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
|
||||
|
||||
Reference in New Issue
Block a user