From fcfa80fe917028d25446185edac53eefbcf82785 Mon Sep 17 00:00:00 2001 From: Danil Chapovalov Date: Thu, 7 Jul 2022 11:26:48 +0200 Subject: [PATCH] Update TaskQueueGcd implementation to absl::AnyInvocable Bug: webrtc:14245 Change-Id: Ie9bd6d218147f002772820e20972ba8eabdd581f Reviewed-on: https://webrtc-review.googlesource.com/c/src/+/268181 Commit-Queue: Danil Chapovalov Reviewed-by: Tomas Gunnarsson Cr-Commit-Position: refs/heads/main@{#37493} --- rtc_base/BUILD.gn | 6 +++++- rtc_base/task_queue_gcd.cc | 44 ++++++++++++++++++++++---------------- 2 files changed, 30 insertions(+), 20 deletions(-) diff --git a/rtc_base/BUILD.gn b/rtc_base/BUILD.gn index e259fc872c..3ee88f4c4a 100644 --- a/rtc_base/BUILD.gn +++ b/rtc_base/BUILD.gn @@ -668,10 +668,14 @@ if (is_mac || is_ios) { ":checks", ":logging", "../api/task_queue", + "../api/units:time_delta", "synchronization:mutex", "system:gcd_helpers", ] - absl_deps = [ "//third_party/abseil-cpp/absl/strings" ] + absl_deps = [ + "//third_party/abseil-cpp/absl/functional:any_invocable", + "//third_party/abseil-cpp/absl/strings", + ] } } diff --git a/rtc_base/task_queue_gcd.cc b/rtc_base/task_queue_gcd.cc index 2276f635c5..e498ba3017 100644 --- a/rtc_base/task_queue_gcd.cc +++ b/rtc_base/task_queue_gcd.cc @@ -19,9 +19,10 @@ #include +#include "absl/functional/any_invocable.h" #include "absl/strings/string_view.h" -#include "api/task_queue/queued_task.h" #include "api/task_queue/task_queue_base.h" +#include "api/units/time_delta.h" #include "rtc_base/checks.h" #include "rtc_base/logging.h" #include "rtc_base/system/gcd_helpers.h" @@ -40,22 +41,24 @@ int TaskQueuePriorityToGCD(TaskQueueFactory::Priority priority) { } } -class TaskQueueGcd : public TaskQueueBase { +class TaskQueueGcd final : public TaskQueueBase { public: TaskQueueGcd(absl::string_view queue_name, int gcd_priority); void Delete() override; - void PostTask(std::unique_ptr task) override; - void PostDelayedTask(std::unique_ptr task, - uint32_t milliseconds) override; + void PostTask(absl::AnyInvocable task) override; + void PostDelayedTask(absl::AnyInvocable task, + TimeDelta delay) override; + void PostDelayedHighPrecisionTask(absl::AnyInvocable task, + TimeDelta delay) override; private: struct TaskContext { - TaskContext(TaskQueueGcd* queue, std::unique_ptr task) + TaskContext(TaskQueueGcd* queue, absl::AnyInvocable task) : queue(queue), task(std::move(task)) {} TaskQueueGcd* const queue; - std::unique_ptr task; + absl::AnyInvocable task; }; ~TaskQueueGcd() override; @@ -97,17 +100,22 @@ void TaskQueueGcd::Delete() { dispatch_release(queue_); } -void TaskQueueGcd::PostTask(std::unique_ptr task) { +void TaskQueueGcd::PostTask(absl::AnyInvocable task) { auto* context = new TaskContext(this, std::move(task)); dispatch_async_f(queue_, context, &RunTask); } -void TaskQueueGcd::PostDelayedTask(std::unique_ptr task, - uint32_t milliseconds) { +void TaskQueueGcd::PostDelayedTask(absl::AnyInvocable task, + TimeDelta delay) { auto* context = new TaskContext(this, std::move(task)); - dispatch_after_f( - dispatch_time(DISPATCH_TIME_NOW, milliseconds * NSEC_PER_MSEC), queue_, - context, &RunTask); + dispatch_after_f(dispatch_time(DISPATCH_TIME_NOW, delay.us() * NSEC_PER_USEC), + queue_, context, &RunTask); +} + +void TaskQueueGcd::PostDelayedHighPrecisionTask( + absl::AnyInvocable task, + TimeDelta delay) { + PostDelayedTask(std::move(task), delay); } // static @@ -117,12 +125,10 @@ void TaskQueueGcd::RunTask(void* task_context) { return; CurrentTaskQueueSetter set_current(tc->queue); - auto* task = tc->task.release(); - if (task->Run()) { - // Delete the task before CurrentTaskQueueSetter clears state that this code - // is running on the task queue. - delete task; - } + std::move(tc->task)(); + // Delete the task before CurrentTaskQueueSetter clears state that this code + // is running on the task queue. + tc = nullptr; } // static