diff --git a/api/task_queue/task_queue.cc b/api/task_queue/task_queue.cc index 06358502a3..ed489eb826 100644 --- a/api/task_queue/task_queue.cc +++ b/api/task_queue/task_queue.cc @@ -14,14 +14,21 @@ namespace rtc { -TaskQueue::TaskQueue(const char* queue_name, Priority priority) - : impl_(webrtc::GlobalTaskQueueFactory() - .CreateTaskQueue(queue_name, priority) - .release()) { +TaskQueue::TaskQueue( + std::unique_ptr task_queue) + : impl_(task_queue.release()) { impl_->task_queue_ = this; } +TaskQueue::TaskQueue(const char* queue_name, Priority priority) + : TaskQueue(webrtc::GlobalTaskQueueFactory().CreateTaskQueue(queue_name, + priority)) {} + TaskQueue::~TaskQueue() { + // There might running task that tries to rescheduler itself to the TaskQueue + // and not yet aware TaskQueue destructor is called. + // Calling back to TaskQueue::PostTask need impl_ pointer still be valid, so + // do not invalidate impl_ pointer until Delete returns. impl_->Delete(); } diff --git a/rtc_base/task_queue.h b/rtc_base/task_queue.h index d5be38b214..3bc1e1fdc3 100644 --- a/rtc_base/task_queue.h +++ b/rtc_base/task_queue.h @@ -145,6 +145,8 @@ class RTC_LOCKABLE RTC_EXPORT TaskQueue { // priorities, on others such as Mac and iOS, GCD queue priorities. using Priority = ::webrtc::TaskQueueFactory::Priority; + explicit TaskQueue(std::unique_ptr task_queue); explicit TaskQueue(const char* queue_name, Priority priority = Priority::NORMAL); ~TaskQueue(); @@ -154,6 +156,9 @@ class RTC_LOCKABLE RTC_EXPORT TaskQueue { // Used for DCHECKing the current queue. bool IsCurrent() const; + // Returns non-owning pointer to the task queue implementation. + webrtc::TaskQueueBase* Get() { return impl_; } + // TODO(tommi): For better debuggability, implement RTC_FROM_HERE. // Ownership of the task is passed to PostTask.