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",
|
":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",
|
||||||
|
]
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -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
|
||||||
|
Reference in New Issue
Block a user