diff --git a/static_core/libpandabase/taskmanager/task_queue.h b/static_core/libpandabase/taskmanager/task_queue.h index d718bb28a4774c738f8e0294776285a6e02c44a6..c59eab9f452b33a63fd1bca8ce2d4f4f9f36f83b 100644 --- a/static_core/libpandabase/taskmanager/task_queue.h +++ b/static_core/libpandabase/taskmanager/task_queue.h @@ -50,8 +50,8 @@ public: PANDA_PUBLIC_API size_t AddForegroundTask(RunnerCallback runner) override; PANDA_PUBLIC_API size_t AddBackgroundTask(RunnerCallback runner) override; - PANDA_PUBLIC_API WaiterId AddForegroundTaskInWaitList(RunnerCallback runtime, uint64_t timeToWait) override; - PANDA_PUBLIC_API WaiterId AddBackgroundTaskInWaitList(RunnerCallback runtime, uint64_t timeToWait) override; + PANDA_PUBLIC_API WaiterId AddForegroundTaskInWaitList(uint64_t timeToWait, RunnerCallback runtime) override; + PANDA_PUBLIC_API WaiterId AddBackgroundTaskInWaitList(uint64_t timeToWait, RunnerCallback runtime) override; PANDA_PUBLIC_API WaiterId AddForegroundTaskInWaitList(RunnerCallback runtime) override; PANDA_PUBLIC_API WaiterId AddBackgroundTaskInWaitList(RunnerCallback runtime) override; @@ -188,8 +188,8 @@ inline size_t TaskQueue::AddBackgroundTask(RunnerCallback runner) } template -inline PANDA_PUBLIC_API WaiterId TaskQueue::AddForegroundTaskInWaitList(RunnerCallback runner, - uint64_t timeToWait) +inline PANDA_PUBLIC_API WaiterId TaskQueue::AddForegroundTaskInWaitList(uint64_t timeToWait, + RunnerCallback runner) { IncrementCountOfLiveForegroundTasks(); auto waitListCallback = [this](RunnerCallback &&irunner) { AddForegroundTaskImpl(std::move(irunner)); }; @@ -197,8 +197,8 @@ inline PANDA_PUBLIC_API WaiterId TaskQueue::AddForegroundTaskInWaitLi } template -inline PANDA_PUBLIC_API WaiterId TaskQueue::AddBackgroundTaskInWaitList(RunnerCallback runner, - uint64_t timeToWait) +inline PANDA_PUBLIC_API WaiterId TaskQueue::AddBackgroundTaskInWaitList(uint64_t timeToWait, + RunnerCallback runner) { IncrementCountOfLiveBackgroundTasks(); auto waitListCallback = [this](RunnerCallback &&irunner) { AddBackgroundTaskImpl(std::move(irunner)); }; diff --git a/static_core/libpandabase/taskmanager/task_queue_interface.h b/static_core/libpandabase/taskmanager/task_queue_interface.h index 2b3ee66101da8fb4708f5b8e30df4796f3ee17e5..6b4f62804cef56db4e8450365ef7c029d06bc083 100644 --- a/static_core/libpandabase/taskmanager/task_queue_interface.h +++ b/static_core/libpandabase/taskmanager/task_queue_interface.h @@ -38,11 +38,26 @@ public: } PANDA_PUBLIC_API virtual ~TaskQueueInterface() = default; + template + PANDA_PUBLIC_API size_t AddForegroundTask(Callback callback, Args &&...args); + template + PANDA_PUBLIC_API size_t AddBackgroundTask(Callback callback, Args &&...args); + + template + PANDA_PUBLIC_API WaiterId AddForegroundTaskInWaitList(uint64_t timeToWait, Callback callback, Args &&...args); + template + PANDA_PUBLIC_API WaiterId AddBackgroundTaskInWaitList(uint64_t timeToWait, Callback callback, Args &&...args); + + template + PANDA_PUBLIC_API WaiterId AddForegroundTaskInWaitList(Callback callback, Args &&...args); + template + PANDA_PUBLIC_API WaiterId AddBackgroundTaskInWaitList(Callback callback, Args &&...args); + PANDA_PUBLIC_API virtual size_t AddForegroundTask(RunnerCallback runner) = 0; PANDA_PUBLIC_API virtual size_t AddBackgroundTask(RunnerCallback runner) = 0; - PANDA_PUBLIC_API virtual WaiterId AddForegroundTaskInWaitList(RunnerCallback runtime, uint64_t timeToWait) = 0; - PANDA_PUBLIC_API virtual WaiterId AddBackgroundTaskInWaitList(RunnerCallback runtime, uint64_t timeToWait) = 0; + PANDA_PUBLIC_API virtual WaiterId AddForegroundTaskInWaitList(uint64_t timeToWait, RunnerCallback runner) = 0; + PANDA_PUBLIC_API virtual WaiterId AddBackgroundTaskInWaitList(uint64_t timeToWait, RunnerCallback runner) = 0; PANDA_PUBLIC_API virtual WaiterId AddForegroundTaskInWaitList(RunnerCallback runtime) = 0; PANDA_PUBLIC_API virtual WaiterId AddBackgroundTaskInWaitList(RunnerCallback runtime) = 0; @@ -100,6 +115,48 @@ inline void TaskQueueInterface::Register(QueueId id) id_ = id; } +template +inline size_t TaskQueueInterface::AddForegroundTask(Callback callback, Args &&...args) +{ + RunnerCallback icallback = [callback = std::move(callback), args...] { callback(std::forward(args)...); }; + return AddForegroundTask(std::move(icallback)); +} + +template +inline size_t TaskQueueInterface::AddBackgroundTask(Callback callback, Args &&...args) +{ + RunnerCallback icallback = [callback = std::move(callback), args...] { callback(std::forward(args)...); }; + return AddBackgroundTask(std::move(icallback)); +} + +template +inline WaiterId AddForegroundTaskInWaitList(uint64_t timeToWait, Callback callback, Args &&...args) +{ + RunnerCallback icallback = [callback = std::move(callback), args...] { callback(std::forward(args)...); }; + return AddForegroundTaskInWaitList(timeToWait, std::move(icallback)); +} + +template +inline WaiterId AddBackgroundTaskInWaitList(uint64_t timeToWait, Callback callback, Args &&...args) +{ + RunnerCallback icallback = [callback = std::move(callback), args...] { callback(std::forward(args)...); }; + return AddBackgroundTaskInWaitList(timeToWait, std::move(icallback)); +} + +template +PANDA_PUBLIC_API WaiterId AddForegroundTaskInWaitList(Callback callback, Args &&...args) +{ + RunnerCallback icallback = [callback = std::move(callback), args...] { callback(std::forward(args)...); }; + return AddForegroundTaskInWaitList(std::move(icallback)); +} + +template +PANDA_PUBLIC_API WaiterId AddBackgroundTaskInWaitList(Callback callback, Args &&...args) +{ + RunnerCallback icallback = [callback = std::move(callback), args...] { callback(std::forward(args)...); }; + return AddBackgroundTaskInWaitList(std::move(icallback)); +} + } // namespace ark::taskmanager #endif // PANDA_LIBPANDABASE_TASKMANAGER_TASK_QUEUE_INTERFACE_H diff --git a/static_core/libpandabase/tests/taskmanager/task_scheduler_test.cpp b/static_core/libpandabase/tests/taskmanager/task_scheduler_test.cpp index 98b4e6d4df06e89736cc3f8549f12f5e1e595a3c..625e6bce81cb67abe474d88ec7a81ded55b579ed 100644 --- a/static_core/libpandabase/tests/taskmanager/task_scheduler_test.cpp +++ b/static_core/libpandabase/tests/taskmanager/task_scheduler_test.cpp @@ -422,7 +422,7 @@ TEST_F(TaskSchedulerTest, TaskSchedulerAddTaskToWaitListWithTimeTest) taskRunner = [gcQueue, &sleepCount, &taskRunner]() { if (sleepCount < WAIT_LIST_USAGE_COUNT) { sleepCount++; - [[maybe_unused]] auto id = gcQueue->AddForegroundTaskInWaitList(taskRunner, 1U); + [[maybe_unused]] auto id = gcQueue->AddForegroundTaskInWaitList(1U, taskRunner); ASSERT(id != INVALID_WAITER_ID); } }; diff --git a/static_core/runtime/mem/gc/g1/update_remset_task_queue.cpp b/static_core/runtime/mem/gc/g1/update_remset_task_queue.cpp index e25960967e0ec3542c6ea0a6b9685fb5879be7c1..bad99424b1053a192e3f8f276d55b7567d88cb51 100644 --- a/static_core/runtime/mem/gc/g1/update_remset_task_queue.cpp +++ b/static_core/runtime/mem/gc/g1/update_remset_task_queue.cpp @@ -114,7 +114,7 @@ void UpdateRemsetTaskQueue::AddToWaitListWithTimeout() { ASSERT(taskRunner_); static constexpr uint64_t TIMEOUT_MS = 1U; - taskRunnerWaiterId_ = this->GetGC()->GetWorkersTaskQueue()->AddForegroundTaskInWaitList(taskRunner_, TIMEOUT_MS); + taskRunnerWaiterId_ = this->GetGC()->GetWorkersTaskQueue()->AddForegroundTaskInWaitList(TIMEOUT_MS, taskRunner_); } TEMPLATE_CLASS_LANGUAGE_CONFIG(UpdateRemsetTaskQueue);