From ee9b624bd61aa1ee009f576d89f48ec1d073292d Mon Sep 17 00:00:00 2001 From: zhuruigan Date: Tue, 29 Jul 2025 11:11:06 +0800 Subject: [PATCH] modify cancel for seqRunner and periodicTask Signed-off-by: zhuruigan Change-Id: Ie6def008a31a43f6db48009cb1a64de2253b95af --- .../taskpool/sequence_runner.cpp | 68 ++++++++----------- js_concurrent_module/taskpool/task.cpp | 8 ++- .../taskpool/test/test_taskpool.cpp | 57 ++++++++++++++++ 3 files changed, 92 insertions(+), 41 deletions(-) diff --git a/js_concurrent_module/taskpool/sequence_runner.cpp b/js_concurrent_module/taskpool/sequence_runner.cpp index 1ef2040d..c3a832a5 100644 --- a/js_concurrent_module/taskpool/sequence_runner.cpp +++ b/js_concurrent_module/taskpool/sequence_runner.cpp @@ -205,49 +205,39 @@ void SequenceRunner::AddTask(Task* task) void SequenceRunner::TriggerTask(napi_env env) { - std::list deferreds {}; - { - std::unique_lock lock(seqRunnerMutex_); + std::unique_lock lock(seqRunnerMutex_); + if (seqRunnerTasks_.empty()) { + currentTaskId_ = 0; + return; + } + Task* task = seqRunnerTasks_.front(); + seqRunnerTasks_.pop_front(); + bool isEmpty = false; + while (task->taskState_ == ExecuteState::CANCELED) { + if (refCount_ > 0) { + refCount_--; + } + + CancelTaskMessage* message = new CancelTaskMessage(ExecuteState::CANCELED, task->taskId_); + task->TriggerCancel(message); + if (seqRunnerTasks_.empty()) { + HILOG_DEBUG("seqRunner:: seqRunner %{public}s empty in cancel loop.", + std::to_string(seqRunnerId_).c_str()); currentTaskId_ = 0; - return; + isEmpty = true; + break; } - Task* task = seqRunnerTasks_.front(); + task = seqRunnerTasks_.front(); seqRunnerTasks_.pop_front(); - bool isEmpty = false; - while (task->taskState_ == ExecuteState::CANCELED) { - if (refCount_ > 0) { - refCount_--; - } - if (task->currentTaskInfo_ != nullptr) { - deferreds.push_back(task->currentTaskInfo_->deferred); - } - if (task->IsSameEnv(env)) { - task->CancelInner(ExecuteState::CANCELED); - } else { - CancelTaskMessage* message = new CancelTaskMessage(ExecuteState::CANCELED, task->taskId_); - task->TriggerCancel(message); - } - - if (seqRunnerTasks_.empty()) { - HILOG_DEBUG("seqRunner:: seqRunner %{public}s empty in cancel loop.", - std::to_string(seqRunnerId_).c_str()); - currentTaskId_ = 0; - isEmpty = true; - break; - } - task = seqRunnerTasks_.front(); - seqRunnerTasks_.pop_front(); - } - if (!isEmpty) { - currentTaskId_ = task->taskId_; - task->IncreaseRefCount(); - task->taskState_ = ExecuteState::WAITING; - HILOG_DEBUG("seqRunner:: Trigger task %{public}s in seqRunner %{public}s.", - std::to_string(task->taskId_).c_str(), std::to_string(seqRunnerId_).c_str()); - TaskManager::GetInstance().EnqueueTaskId(task->taskId_, priority_); - } } - TaskManager::GetInstance().BatchRejectDeferred(env, deferreds, "taskpool:: sequenceRunner task has been canceled"); + if (!isEmpty) { + currentTaskId_ = task->taskId_; + task->IncreaseRefCount(); + task->taskState_ = ExecuteState::WAITING; + HILOG_DEBUG("seqRunner:: Trigger task %{public}s in seqRunner %{public}s.", + std::to_string(task->taskId_).c_str(), std::to_string(seqRunnerId_).c_str()); + TaskManager::GetInstance().EnqueueTaskId(task->taskId_, priority_); + } } } // namespace Commonlibrary::Concurrent::TaskPoolModule \ No newline at end of file diff --git a/js_concurrent_module/taskpool/task.cpp b/js_concurrent_module/taskpool/task.cpp index 2b184551..ce0597f4 100644 --- a/js_concurrent_module/taskpool/task.cpp +++ b/js_concurrent_module/taskpool/task.cpp @@ -1696,6 +1696,7 @@ void Task::CancelInner(ExecuteState state) TaskManager::GetInstance().ClearDependentTask(taskId_); } std::list deferreds {}; + std::string error = "taskpool:: task has been canceled"; { std::lock_guard lock(taskMutex_); if (state == ExecuteState::WAITING && currentTaskInfo_ != nullptr && @@ -1710,14 +1711,17 @@ void Task::CancelInner(ExecuteState state) isCancelToFinish_ = true; } if (IsSeqRunnerTask() && state == ExecuteState::CANCELED) { + if (currentTaskInfo_ != nullptr) { + deferreds.push_back(currentTaskInfo_->deferred); + error = "taskpool:: sequenceRunner task has been canceled"; + } DisposeCanceledTask(); - return; } if (state == ExecuteState::DELAYED) { isCancelToFinish_ = true; } } - std::string error = "taskpool:: task has been canceled"; + TaskManager::GetInstance().BatchRejectDeferred(env_, deferreds, error); } diff --git a/js_concurrent_module/taskpool/test/test_taskpool.cpp b/js_concurrent_module/taskpool/test/test_taskpool.cpp index 1e7bff49..3e1b1b69 100644 --- a/js_concurrent_module/taskpool/test/test_taskpool.cpp +++ b/js_concurrent_module/taskpool/test/test_taskpool.cpp @@ -6633,4 +6633,61 @@ HWTEST_F(NativeEngineTest, TaskpoolTest326, testing::ext::TestSize.Level0) napi_value exception = nullptr; napi_get_and_clear_last_exception(env, &exception); ASSERT_TRUE(exception == nullptr); +} + +HWTEST_F(NativeEngineTest, TaskpoolTest327, testing::ext::TestSize.Level0) +{ + napi_env env = (napi_env)engine_; + ExceptionScope scope(env); + Task* task = new Task(); + task->taskId_ = 327; + task->env_ = env; + task->taskType_ = TaskType::SEQRUNNER_TASK; + napi_value obj = NapiHelper::CreateObject(env); + task->taskRef_ = NapiHelper::CreateReference(env, obj, 1); + task->CancelInner(ExecuteState::CANCELED); + napi_value exception = nullptr; + napi_get_and_clear_last_exception(env, &exception); + ASSERT_TRUE(exception == nullptr); + delete task; +} + +HWTEST_F(NativeEngineTest, TaskpoolTest328, testing::ext::TestSize.Level0) +{ + napi_env env = (napi_env)engine_; + ExceptionScope scope(env); + Task* task = new Task(); + task->taskId_ = 328; + task->env_ = env; + task->taskType_ = TaskType::SEQRUNNER_TASK; + napi_value obj = NapiHelper::CreateObject(env); + task->taskRef_ = NapiHelper::CreateReference(env, obj, 1); + TaskInfo* taskInfo = new TaskInfo(); + NapiHelper::CreatePromise(env, &taskInfo->deferred); + task->currentTaskInfo_ = taskInfo; + task->CancelInner(ExecuteState::CANCELED); + napi_value exception = nullptr; + napi_get_and_clear_last_exception(env, &exception); + ASSERT_TRUE(exception == nullptr); +} + +HWTEST_F(NativeEngineTest, TaskpoolTest329, testing::ext::TestSize.Level0) +{ + napi_env env = (napi_env)engine_; + ExceptionScope scope(env); + Task* task = new Task(); + task->taskId_ = TaskManager::GetInstance().CalculateTaskId(reinterpret_cast(task)); + task->env_ = env; + task->taskState_ = ExecuteState::CANCELED; + TaskInfo* taskInfo = new TaskInfo(); + task->currentTaskInfo_ = taskInfo; + SequenceRunner* seqRunner = new SequenceRunner(); + uint64_t seqRunnerId = reinterpret_cast(seqRunner); + task->seqRunnerId_ = seqRunnerId; + seqRunner->seqRunnerTasks_.push_back(task); + seqRunner->DecreaseSeqCount(); + seqRunner->TriggerTask(env); + napi_value exception = nullptr; + napi_get_and_clear_last_exception(env, &exception); + ASSERT_TRUE(exception == nullptr); } \ No newline at end of file -- Gitee