diff --git a/js_concurrent_module/taskpool/task_manager.cpp b/js_concurrent_module/taskpool/task_manager.cpp index e000d82cfa73d364578cf92fcc38457e4c41dc89..15d7fd632988b9cb200ea0e8581872170e608d41 100644 --- a/js_concurrent_module/taskpool/task_manager.cpp +++ b/js_concurrent_module/taskpool/task_manager.cpp @@ -137,6 +137,11 @@ TaskManager::~TaskManager() void TaskManager::CountTraceForWorker() { std::lock_guard lock(workersMutex_); + CountTraceForWorkerWithoutLock(); +} + +void TaskManager::CountTraceForWorkerWithoutLock() +{ int64_t threadNum = static_cast(workers_.size()); int64_t idleWorkers = static_cast(idleWorkers_.size()); int64_t timeoutWorkers = static_cast(timeoutWorkers_.size()); @@ -744,7 +749,7 @@ void TaskManager::NotifyWorkerRunning(Worker* worker) { std::lock_guard lock(workersMutex_); idleWorkers_.erase(worker); - CountTraceForWorker(); + CountTraceForWorkerWithoutLock(); } uint32_t TaskManager::GetRunningWorkers() diff --git a/js_concurrent_module/taskpool/task_manager.h b/js_concurrent_module/taskpool/task_manager.h index 97f9524c9b10d0313a235add312689da11c0569a..d76b4ed371b3f0306b95300c353572e47809b2d5 100644 --- a/js_concurrent_module/taskpool/task_manager.h +++ b/js_concurrent_module/taskpool/task_manager.h @@ -98,6 +98,7 @@ public: // for countTrace for worker void CountTraceForWorker(); + void CountTraceForWorkerWithoutLock(); void RegisterCallback(napi_env env, uint32_t taskId, std::shared_ptr callbackInfo); void IncreaseSendDataRefCount(uint32_t taskId); diff --git a/js_concurrent_module/taskpool/test/test.cpp b/js_concurrent_module/taskpool/test/test.cpp index cd2aeffb35ebb6fea4a3935cf8de398dbd72603d..0370dc106de309d69da1d839fb2fee6af934ad9f 100755 --- a/js_concurrent_module/taskpool/test/test.cpp +++ b/js_concurrent_module/taskpool/test/test.cpp @@ -990,4 +990,32 @@ bool NativeEngineTest::FindTaskId(Worker* worker, uint32_t taskId) auto& container = worker->currentTaskId_; return std::find(container.begin(), container.end(), taskId) != container.end(); } + +void NativeEngineTest::PerformTask(napi_env env, void* data) +{ + ExceptionScope scope(env); + TaskManager& taskManager = TaskManager::GetInstance(); + uint32_t id = 0; + for (size_t i = 0; i < taskManager.taskQueues_.size(); i++) { + id = taskManager.taskQueues_[i]->DequeueTaskId(); + while (id != 0) { + id = taskManager.taskQueues_[i]->DequeueTaskId(); + } + } + Worker* worker = reinterpret_cast(WorkerConstructor(env)); + napi_env workerEnv = nullptr; + napi_create_runtime(env, &workerEnv); + worker->workerEnv_ = workerEnv; + + Task* task = reinterpret_cast(data); + taskManager.StoreTask(task); + Priority priority = Priority::DEFAULT; + auto& mediumTaskQueue = taskManager.taskQueues_[priority]; + mediumTaskQueue->EnqueueTaskId(task->taskId_); + + uv_async_t* req = new uv_async_t; + req->data = worker; + Worker::PerformTask(req); + usleep(100000); // 100000: is sleep 100ms +} } // namespace Commonlibrary::Concurrent::TaskPoolModule \ No newline at end of file diff --git a/js_concurrent_module/taskpool/test/test.h b/js_concurrent_module/taskpool/test/test.h index dc25e230b9a359e8199d35cad9fd0735a4faaeae..d4a1313570dda87310b4aebccb69c52985dc649b 100644 --- a/js_concurrent_module/taskpool/test/test.h +++ b/js_concurrent_module/taskpool/test/test.h @@ -75,6 +75,7 @@ public: static void ReleaseWorkerHandles(napi_env env); static void DebuggerOnPostTask(napi_env env); static void PerformTask(napi_env env); + static void PerformTask(napi_env env, void* data); static void NotifyHandleTaskResult(napi_env env); static void TaskResultCallback(napi_env env); static void HandleFunctionResult(napi_env env); diff --git a/js_concurrent_module/taskpool/test/test_taskpool.cpp b/js_concurrent_module/taskpool/test/test_taskpool.cpp index 6f7c8d3252b1fac67aae3aa081a562e7a0446ecf..75c8cb368490e5fd2dd5d7232bb4184186506fa0 100644 --- a/js_concurrent_module/taskpool/test/test_taskpool.cpp +++ b/js_concurrent_module/taskpool/test/test_taskpool.cpp @@ -579,6 +579,7 @@ HWTEST_F(NativeEngineTest, TaskpoolTest037, testing::ext::TestSize.Level0) auto callbackInfo = std::make_shared(env, 1, nullptr); taskManager.RegisterCallback(env, taskId, callbackInfo); auto res = callbackInfo->refCount; + taskManager.DecreaseSendDataRefCount(env, taskId); ASSERT_EQ(res, 1); } @@ -2043,6 +2044,7 @@ HWTEST_F(NativeEngineTest, TaskpoolTest131, testing::ext::TestSize.Level0) TaskManager &taskManager = TaskManager::GetInstance(); taskManager.RegisterCallback(env, taskId, nullptr); + taskManager.DecreaseSendDataRefCount(env, taskId); ASSERT_TRUE(true); } @@ -2074,6 +2076,7 @@ HWTEST_F(NativeEngineTest, TaskpoolTest132, testing::ext::TestSize.Level0) napi_ref callbackRef = NapiHelper::CreateReference(env, argv[0], 1); std::shared_ptr callbackInfo = std::make_shared(env, 1, callbackRef); taskManager.RegisterCallback(env, taskId, callbackInfo); + taskManager.DecreaseSendDataRefCount(env, taskId, task); ASSERT_TRUE(true); } @@ -2115,6 +2118,7 @@ HWTEST_F(NativeEngineTest, TaskpoolTest133, testing::ext::TestSize.Level0) napi_ref callbackRef = NapiHelper::CreateReference(env, argv1[0], 1); std::shared_ptr callbackInfo = std::make_shared(env, 1, callbackRef); taskManager.RegisterCallback(env, taskId, callbackInfo); + taskManager.DecreaseSendDataRefCount(env, taskId, task); ASSERT_TRUE(true); } @@ -6373,4 +6377,18 @@ HWTEST_F(NativeEngineTest, TaskpoolTest313, testing::ext::TestSize.Level0) napi_set_named_property(env, obj, "error", result2); error = TaskManager::GetInstance().CancelError(env, 0, nullptr, obj); ASSERT_TRUE(NapiHelper::IsNotUndefined(env, error)); +} + +HWTEST_F(NativeEngineTest, TaskpoolTest314, testing::ext::TestSize.Level0) +{ + napi_env env = (napi_env)engine_; + ExceptionScope scope(env); + TaskManager &taskManager = TaskManager::GetInstance(); + Task* task = new Task(); + uint32_t taskId = taskManager.CalculateTaskId(reinterpret_cast(task)); + task->taskId_ = taskId; + task->isValid_ = false; + void* data = reinterpret_cast(task); + NativeEngineTest::PerformTask(env, data); + ASSERT_TRUE(true); } \ No newline at end of file diff --git a/js_concurrent_module/taskpool/worker.cpp b/js_concurrent_module/taskpool/worker.cpp index c2274a4e6dc07f08e4e7df1c17a4c4bce124171e..82184bdb6b4e0a7759207328cd8a0982ad049d19 100644 --- a/js_concurrent_module/taskpool/worker.cpp +++ b/js_concurrent_module/taskpool/worker.cpp @@ -412,16 +412,15 @@ bool Worker::UpdateWorkerState(WorkerState expect, WorkerState desired) void Worker::PerformTask(const uv_async_t* req) { + auto taskInfo = TaskManager::GetInstance().DequeueTaskId(); + if (taskInfo.first == 0) { + return; + } uint64_t startTime = ConcurrentHelper::GetMilliseconds(); auto worker = static_cast(req->data); worker->UpdateWorkerWakeUpTime(); napi_env env = worker->workerEnv_; TaskManager::GetInstance().NotifyWorkerRunning(worker); - auto taskInfo = TaskManager::GetInstance().DequeueTaskId(); - if (taskInfo.first == 0) { - worker->NotifyIdle(); - return; - } RunningScope runningScope(worker); WorkerRunningScope workerRunningScope(env); PriorityScope priorityScope(worker, taskInfo.second);