From f3280e99b09f455d2302cb8c8b602b9c77790e82 Mon Sep 17 00:00:00 2001 From: Danil Chapovalov Date: Thu, 28 Feb 2019 10:39:04 +0100 Subject: [PATCH] Create conversions between webrtc::TaskQueueBase and rtc::TaskQueue Bug: webrtc:10191 Change-Id: Ia6642081ac758e31c14780bdd83dbc88279cce6d Reviewed-on: https://webrtc-review.googlesource.com/c/124826 Commit-Queue: Danil Chapovalov Reviewed-by: Karl Wiberg Reviewed-by: Sebastian Jansson Cr-Commit-Position: refs/heads/master@{#26890} --- api/task_queue/task_queue.cc | 15 +++++++++++---- rtc_base/task_queue.h | 5 +++++ 2 files changed, 16 insertions(+), 4 deletions(-) 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.