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