diff --git a/modules/utility/maybe_worker_thread.cc b/modules/utility/maybe_worker_thread.cc index 3d761c5334..c3497a1b4b 100644 --- a/modules/utility/maybe_worker_thread.cc +++ b/modules/utility/maybe_worker_thread.cc @@ -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 task) { diff --git a/modules/utility/maybe_worker_thread.h b/modules/utility/maybe_worker_thread.h index 6d41ad5189..a93a173bf6 100644 --- a/modules/utility/maybe_worker_thread.h +++ b/modules/utility/maybe_worker_thread.h @@ -77,7 +77,7 @@ class RTC_LOCKABLE MaybeWorkerThread { private: SequenceChecker sequence_checker_; - const std::unique_ptr owned_task_queue_; + std::unique_ptr owned_task_queue_; TaskQueueBase* const worker_thread_; }; diff --git a/modules/utility/maybe_worker_thread_unittests.cc b/modules/utility/maybe_worker_thread_unittests.cc index ec051242e7..f6a981f90a 100644 --- a/modules/utility/maybe_worker_thread_unittests.cc +++ b/modules/utility/maybe_worker_thread_unittests.cc @@ -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