diff --git a/js_concurrent_module/taskpool/sequence_runner.cpp b/js_concurrent_module/taskpool/sequence_runner.cpp index f54c44c31a89da888e156d3ace92bcc43e40fbb5..25dc418be2803261d764be4a886c8ed5b9dc1e0e 100644 --- a/js_concurrent_module/taskpool/sequence_runner.cpp +++ b/js_concurrent_module/taskpool/sequence_runner.cpp @@ -174,11 +174,17 @@ bool SequenceRunner::RemoveWaitingTask(Task* task) { std::unique_lock lock(seqRunnerMutex_); if (seqRunnerTasks_.empty()) { + if (runnerCount_ >= refCount_) { + currentTaskId_ = 0; + } return false; } auto iter = std::find(seqRunnerTasks_.begin(), seqRunnerTasks_.end(), task); if (iter != seqRunnerTasks_.end()) { seqRunnerTasks_.erase(iter); + if (seqRunnerTasks_.empty() && runnerCount_ >= refCount_) { + currentTaskId_ = 0; + } return true; } return false; @@ -240,4 +246,14 @@ void SequenceRunner::TriggerTask(napi_env env) TaskManager::GetInstance().EnqueueTaskId(task->taskId_, priority_); } } + +void SequenceRunner::DecreaseRunnerCount() +{ + runnerCount_--; +} + +void SequenceRunner::IncreaseRunnerCount() +{ + runnerCount_++; +} } // namespace Commonlibrary::Concurrent::TaskPoolModule \ No newline at end of file diff --git a/js_concurrent_module/taskpool/sequence_runner.h b/js_concurrent_module/taskpool/sequence_runner.h index 9f5e7ddbc378142f20622c8b246c5e31539a9252..8464e6795feb14ab0afe38e01e991ffa9340f954 100644 --- a/js_concurrent_module/taskpool/sequence_runner.h +++ b/js_concurrent_module/taskpool/sequence_runner.h @@ -35,6 +35,8 @@ public: void IncreaseSeqCount(); uint64_t DecreaseSeqCount(); void TriggerTask(napi_env env); + void IncreaseRunnerCount(); + void DecreaseRunnerCount(); private: SequenceRunner(const SequenceRunner &) = delete; @@ -58,6 +60,7 @@ public: std::string seqName_ {}; bool isGlobalRunner_ {false}; std::atomic refCount_ {1}; + std::atomic runnerCount_ {1}; }; } // namespace Commonlibrary::Concurrent::TaskPoolModule #endif // JS_CONCURRENT_MODULE_TASKPOOL_RUNNER_H \ No newline at end of file diff --git a/js_concurrent_module/taskpool/sequence_runner_manager.cpp b/js_concurrent_module/taskpool/sequence_runner_manager.cpp index f970fc709218a0573773dd173cbe39372d79c91a..843671296dd8808436bf003ac90c2d6e878add03 100644 --- a/js_concurrent_module/taskpool/sequence_runner_manager.cpp +++ b/js_concurrent_module/taskpool/sequence_runner_manager.cpp @@ -52,6 +52,7 @@ SequenceRunner* SequenceRunnerManager::CreateOrGetGlobalRunner(napi_env env, nap return nullptr; } seqRunner->IncreaseSeqCount(); + seqRunner->IncreaseRunnerCount(); return seqRunner; } @@ -70,6 +71,10 @@ void SequenceRunnerManager::SequenceRunnerDestructor(SequenceRunner* seqRunner) if (runner == nullptr) { return; } + { + std::unique_lock lock(seqRunnersMutex_); + seqRunner->DecreaseRunnerCount(); + } UnrefAndDestroyRunner(seqRunner); }