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:

committed by
WebRTC LUCI CQ

parent
9799fe036a
commit
fcfa80fe91
@ -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",
|
||||
]
|
||||
}
|
||||
}
|
||||
|
||||
|
@ -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
|
||||
|
Reference in New Issue
Block a user