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 <danilchap@webrtc.org>
Reviewed-by: Tomas Gunnarsson <tommi@webrtc.org>
Cr-Commit-Position: refs/heads/main@{#37493}
This commit is contained in:
Danil Chapovalov
2022-07-07 11:26:48 +02:00
committed by WebRTC LUCI CQ
parent 9799fe036a
commit fcfa80fe91
2 changed files with 30 additions and 20 deletions

View File

@ -668,10 +668,14 @@ if (is_mac || is_ios) {
":checks", ":checks",
":logging", ":logging",
"../api/task_queue", "../api/task_queue",
"../api/units:time_delta",
"synchronization:mutex", "synchronization:mutex",
"system:gcd_helpers", "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",
]
} }
} }

View File

@ -19,9 +19,10 @@
#include <memory> #include <memory>
#include "absl/functional/any_invocable.h"
#include "absl/strings/string_view.h" #include "absl/strings/string_view.h"
#include "api/task_queue/queued_task.h"
#include "api/task_queue/task_queue_base.h" #include "api/task_queue/task_queue_base.h"
#include "api/units/time_delta.h"
#include "rtc_base/checks.h" #include "rtc_base/checks.h"
#include "rtc_base/logging.h" #include "rtc_base/logging.h"
#include "rtc_base/system/gcd_helpers.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: public:
TaskQueueGcd(absl::string_view queue_name, int gcd_priority); TaskQueueGcd(absl::string_view queue_name, int gcd_priority);
void Delete() override; void Delete() override;
void PostTask(std::unique_ptr<QueuedTask> task) override; void PostTask(absl::AnyInvocable<void() &&> task) override;
void PostDelayedTask(std::unique_ptr<QueuedTask> task, void PostDelayedTask(absl::AnyInvocable<void() &&> task,
uint32_t milliseconds) override; TimeDelta delay) override;
void PostDelayedHighPrecisionTask(absl::AnyInvocable<void() &&> task,
TimeDelta delay) override;
private: private:
struct TaskContext { struct TaskContext {
TaskContext(TaskQueueGcd* queue, std::unique_ptr<QueuedTask> task) TaskContext(TaskQueueGcd* queue, absl::AnyInvocable<void() &&> task)
: queue(queue), task(std::move(task)) {} : queue(queue), task(std::move(task)) {}
TaskQueueGcd* const queue; TaskQueueGcd* const queue;
std::unique_ptr<QueuedTask> task; absl::AnyInvocable<void() &&> task;
}; };
~TaskQueueGcd() override; ~TaskQueueGcd() override;
@ -97,17 +100,22 @@ void TaskQueueGcd::Delete() {
dispatch_release(queue_); dispatch_release(queue_);
} }
void TaskQueueGcd::PostTask(std::unique_ptr<QueuedTask> task) { void TaskQueueGcd::PostTask(absl::AnyInvocable<void() &&> task) {
auto* context = new TaskContext(this, std::move(task)); auto* context = new TaskContext(this, std::move(task));
dispatch_async_f(queue_, context, &RunTask); dispatch_async_f(queue_, context, &RunTask);
} }
void TaskQueueGcd::PostDelayedTask(std::unique_ptr<QueuedTask> task, void TaskQueueGcd::PostDelayedTask(absl::AnyInvocable<void() &&> task,
uint32_t milliseconds) { TimeDelta delay) {
auto* context = new TaskContext(this, std::move(task)); auto* context = new TaskContext(this, std::move(task));
dispatch_after_f( dispatch_after_f(dispatch_time(DISPATCH_TIME_NOW, delay.us() * NSEC_PER_USEC),
dispatch_time(DISPATCH_TIME_NOW, milliseconds * NSEC_PER_MSEC), queue_, queue_, context, &RunTask);
context, &RunTask); }
void TaskQueueGcd::PostDelayedHighPrecisionTask(
absl::AnyInvocable<void() &&> task,
TimeDelta delay) {
PostDelayedTask(std::move(task), delay);
} }
// static // static
@ -117,12 +125,10 @@ void TaskQueueGcd::RunTask(void* task_context) {
return; return;
CurrentTaskQueueSetter set_current(tc->queue); CurrentTaskQueueSetter set_current(tc->queue);
auto* task = tc->task.release(); std::move(tc->task)();
if (task->Run()) {
// Delete the task before CurrentTaskQueueSetter clears state that this code // Delete the task before CurrentTaskQueueSetter clears state that this code
// is running on the task queue. // is running on the task queue.
delete task; tc = nullptr;
}
} }
// static // static