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}
diff --git a/rtc_base/BUILD.gn b/rtc_base/BUILD.gn
index e259fc8..3ee88f4 100644
--- a/rtc_base/BUILD.gn
+++ b/rtc_base/BUILD.gn
@@ -668,10 +668,14 @@
":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 2276f63..e498ba3 100644
--- a/rtc_base/task_queue_gcd.cc
+++ b/rtc_base/task_queue_gcd.cc
@@ -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 @@
}
}
-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 @@
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 @@
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