From 296c1fe3ab3fb3258597d609da87226ce57e1a58 Mon Sep 17 00:00:00 2001 From: wangzhaoyong Date: Tue, 26 Aug 2025 21:25:42 +0800 Subject: [PATCH] fix runner task onEnqueue Issue: [Bug]: fix runner task onenqueue https://gitee.com/openharmony/commonlibrary_ets_utils/issues/ICUXL5 Signed-off-by: wangzhaoyong Change-Id: Iab733f9e124a808fa924cd3835ad5c877eb7bde2 --- js_concurrent_module/taskpool/task.cpp | 14 +++++ js_concurrent_module/taskpool/task.h | 2 + .../taskpool/task_manager.cpp | 24 +++++---- .../taskpool/test/test_taskpool.cpp | 52 +++++++++++++++++++ 4 files changed, 83 insertions(+), 9 deletions(-) diff --git a/js_concurrent_module/taskpool/task.cpp b/js_concurrent_module/taskpool/task.cpp index e272a012..333040f1 100644 --- a/js_concurrent_module/taskpool/task.cpp +++ b/js_concurrent_module/taskpool/task.cpp @@ -1988,4 +1988,18 @@ std::tuple Task::GetSerializeResult(napi_env env, napi_value func, } return {serializationFunction, serializationArguments}; } + +void Task::TriggerEnqueueCallback() +{ + ListenerCallBackInfo *info = nullptr; + { + std::lock_guard lock(taskMutex_); + info = onEnqueuedCallBackInfo_; + } + if (info != nullptr) { + ExecuteListenerCallback(info, taskId_); + } else { // LOCV_EXCL_BR_LINE + HILOG_WARN("taskpool:: onEnqueuedCallBackInfo is null"); + } +} } // namespace Commonlibrary::Concurrent::TaskPoolModule \ No newline at end of file diff --git a/js_concurrent_module/taskpool/task.h b/js_concurrent_module/taskpool/task.h index c4807403..b415d772 100644 --- a/js_concurrent_module/taskpool/task.h +++ b/js_concurrent_module/taskpool/task.h @@ -208,6 +208,8 @@ public: bool UpdateTaskStateToFinished(); bool UpdateTaskStateToDelayed(); bool UpdateTaskStateToEnding(); + void TriggerEnqueueCallback(); + static std::tuple GetSerializeParams(napi_env env, napi_value napiTask); static std::tuple GetSerializeResult(napi_env env, napi_value func, napi_value args, diff --git a/js_concurrent_module/taskpool/task_manager.cpp b/js_concurrent_module/taskpool/task_manager.cpp index 362a9bd9..f1e40caf 100644 --- a/js_concurrent_module/taskpool/task_manager.cpp +++ b/js_concurrent_module/taskpool/task_manager.cpp @@ -55,6 +55,7 @@ static constexpr uint32_t MAX_UINT32_T = 0xFFFFFFFF; // 0xFFFFFFFF: max uint32_t static constexpr uint32_t TRIGGER_EXPAND_INTERVAL = 10; // 10: ms, trigger recheck expansion interval [[maybe_unused]] static constexpr uint32_t IDLE_THRESHOLD = 2; // 2: 2 intervals later will release the thread static constexpr char ON_CALLBACK_STR[] = "TaskPoolOnCallbackTask"; +static constexpr char ON_ENQUEUE_STR[] = "TaskPoolOnEnqueueTask"; static constexpr uint32_t UNEXECUTE_TASK_TIME = 60000; // 60000: 1min #if defined(ENABLE_TASKPOOL_EVENTHANDLER) @@ -834,15 +835,20 @@ void TaskManager::EnqueueTaskId(uint32_t taskId, Priority priority) return; } task->IncreaseTaskLifecycleCount(); - ListenerCallBackInfo* info = nullptr; - { - std::lock_guard lock(task->taskMutex_); - info = task->onEnqueuedCallBackInfo_; - } - if (info != nullptr) { - task->ExecuteListenerCallback(info, taskId); - } else { // LOCV_EXCL_BR_LINE - HILOG_WARN("taskpool:: onEnqueuedCallBackInfo is null"); + if (task->IsSeqRunnerTask() || task->IsAsyncRunnerTask()) { + auto onEnqueueTask = [taskId]([[maybe_unused]] void *data) { + Task *task = TaskManager::GetInstance().GetTask(taskId); + if (task == nullptr) { + HILOG_WARN("taskpool:: task is null"); + return; + } + task->TriggerEnqueueCallback(); + }; + auto napiPrio = g_napiPriorityMap.at(priority); + uint64_t handleId = 0; + napi_send_cancelable_event(task->GetEnv(), onEnqueueTask, nullptr, napiPrio, &handleId, ON_ENQUEUE_STR); + } else { + task->TriggerEnqueueCallback(); } } diff --git a/js_concurrent_module/taskpool/test/test_taskpool.cpp b/js_concurrent_module/taskpool/test/test_taskpool.cpp index 31c0762e..865954f9 100644 --- a/js_concurrent_module/taskpool/test/test_taskpool.cpp +++ b/js_concurrent_module/taskpool/test/test_taskpool.cpp @@ -6910,4 +6910,56 @@ HWTEST_F(NativeEngineTest, TaskpoolTest336, testing::ext::TestSize.Level0) napi_value exception = nullptr; napi_get_and_clear_last_exception(env, &exception); ASSERT_TRUE(exception == nullptr); +} + +HWTEST_F(NativeEngineTest, TaskpoolTest337, testing::ext::TestSize.Level0) +{ + napi_env env = (napi_env)engine_; + ExceptionScope scope(env); + TaskManager &taskManager = TaskManager::GetInstance(); + + Task *task1 = new Task(); + TaskInfo *taskInfo1 = new TaskInfo(); + task1->currentTaskInfo_ = taskInfo1; + task1->taskType_ = TaskType::SEQRUNNER_TASK; + task1->taskState_ = ExecuteState::WAITING; + taskManager.StoreTask(task1); + NativeEngineTest::EnqueueTaskIdToQueue(reinterpret_cast(task1)); + napi_value exception = nullptr; + napi_get_and_clear_last_exception(env, &exception); + ASSERT_TRUE(exception == nullptr); + taskManager.RemoveTask(task1->taskId_); + delete task1; + + Task *task2 = new Task(); + TaskInfo *taskInfo2 = new TaskInfo(); + task2->currentTaskInfo_ = taskInfo2; + task2->taskType_ = TaskType::COMMON_TASK; + task2->taskState_ = ExecuteState::WAITING; + taskManager.StoreTask(task2); + NativeEngineTest::EnqueueTaskIdToQueue(reinterpret_cast(task2)); + napi_get_and_clear_last_exception(env, &exception); + ASSERT_TRUE(exception == nullptr); + taskManager.RemoveTask(task2->taskId_); + delete task2; + + Task *task3 = new Task(); + TaskInfo *taskInfo3 = new TaskInfo(); + task3->currentTaskInfo_ = taskInfo3; + task3->taskType_ = TaskType::SEQRUNNER_TASK; + task3->taskState_ = ExecuteState::WAITING; + taskManager.StoreTask(task3); + taskManager.EnqueueTaskId(task3->taskId_); + napi_get_and_clear_last_exception(env, &exception); + ASSERT_TRUE(exception == nullptr); + + Task *task4 = new Task(); + TaskInfo *taskInfo4 = new TaskInfo(); + task4->currentTaskInfo_ = taskInfo4; + task4->taskType_ = TaskType::ASYNCRUNNER_TASK; + task4->taskState_ = ExecuteState::WAITING; + taskManager.StoreTask(task4); + taskManager.EnqueueTaskId(task4->taskId_); + napi_get_and_clear_last_exception(env, &exception); + ASSERT_TRUE(exception == nullptr); } \ No newline at end of file -- Gitee