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",
":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",
]
}
}

View File

@ -19,9 +19,10 @@
#include <memory>
#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<QueuedTask> task) override;
void PostDelayedTask(std::unique_ptr<QueuedTask> task,
uint32_t milliseconds) override;
void PostTask(absl::AnyInvocable<void() &&> task) override;
void PostDelayedTask(absl::AnyInvocable<void() &&> task,
TimeDelta delay) override;
void PostDelayedHighPrecisionTask(absl::AnyInvocable<void() &&> task,
TimeDelta delay) override;
private:
struct TaskContext {
TaskContext(TaskQueueGcd* queue, std::unique_ptr<QueuedTask> task)
TaskContext(TaskQueueGcd* queue, absl::AnyInvocable<void() &&> task)
: queue(queue), task(std::move(task)) {}
TaskQueueGcd* const queue;
std::unique_ptr<QueuedTask> task;
absl::AnyInvocable<void() &&> task;
};
~TaskQueueGcd() override;
@ -97,17 +100,22 @@ void TaskQueueGcd::Delete() {
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));
dispatch_async_f(queue_, context, &RunTask);
}
void TaskQueueGcd::PostDelayedTask(std::unique_ptr<QueuedTask> task,
uint32_t milliseconds) {
void TaskQueueGcd::PostDelayedTask(absl::AnyInvocable<void() &&> 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<void() &&> 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