• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
1 /*
2  * Copyright (c) 2024 Huawei Device Co., Ltd.
3  * Licensed under the Apache License, Version 2.0 (the "License");
4  * you may not use this file except in compliance with the License.
5  * You may obtain a copy of the License at
6  *
7  *     http://www.apache.org/licenses/LICENSE-2.0
8  *
9  * Unless required by applicable law or agreed to in writing, software
10  * distributed under the License is distributed on an "AS IS" BASIS,
11  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
12  * See the License for the specific language governing permissions and
13  * limitations under the License.
14  */
15 
16 #include "test.h"
17 
18 #include "async_runner.h"
19 #include "napi/native_api.h"
20 #include "napi/native_node_api.h"
21 #include "sequence_runner.h"
22 #include "sequence_runner_manager.h"
23 #include "task.h"
24 #include "task_group.h"
25 #include "task_group_manager.h"
26 #include "task_manager.h"
27 #include "taskpool.h"
28 #include "utils.h"
29 #include "uv.h"
30 #include "worker.h"
31 
32 namespace Commonlibrary::Concurrent::TaskPoolModule {
33 
34 static constexpr uint32_t MAX_TIMEOUT_TIME = 600000;
35 static constexpr uint32_t FINSHED_TASK = 5;
36 static constexpr uint32_t TASK_NUMS = 7;
37 static constexpr uint64_t UINT64_ZERO = 0;
38 static constexpr uint32_t UINT32_ZERO = 0;
39 static constexpr uint32_t UINT32_ONE = 1;
40 static constexpr size_t SIZE_TWO = 2;
41 static constexpr size_t SIZE_THREE = 3;
42 
CreateReference(napi_env env)43 napi_ref CreateReference(napi_env env)
44 {
45     napi_value obj = NapiHelper::CreateObject(env);
46     return NapiHelper::CreateReference(env, obj, 1);
47 }
48 
CreateSendableClass(napi_env env)49 napi_value SendableUtils::CreateSendableClass(napi_env env)
50 {
51     auto constructor = [](napi_env env, napi_callback_info info) -> napi_value {
52         napi_value thisVar = nullptr;
53         napi_get_cb_info(env, info, nullptr, nullptr, &thisVar, nullptr);
54         return thisVar;
55     };
56 
57     napi_property_descriptor props[] = {
58         DECLARE_NAPI_FUNCTION("foo", Foo),
59         DECLARE_NAPI_FUNCTION("bar", Bar),
60     };
61 
62     napi_value sendableClass = nullptr;
63     napi_define_sendable_class(env, "SendableClass", NAPI_AUTO_LENGTH, constructor, nullptr,
64                                sizeof(props) / sizeof(props[0]), props, nullptr, &sendableClass);
65     return sendableClass;
66 }
67 
CreateSendableInstance(napi_env env)68 napi_value SendableUtils::CreateSendableInstance(napi_env env)
69 {
70     napi_value cls = SendableUtils::CreateSendableClass(env);
71     napi_value instance = nullptr;
72     napi_new_instance(env, cls, 0, nullptr, &instance);
73     return instance;
74 }
75 
Foo(napi_env env,napi_callback_info info)76 napi_value SendableUtils::Foo(napi_env env, napi_callback_info info)
77 {
78     return nullptr;
79 }
80 
Bar(napi_env env,napi_callback_info info)81 napi_value SendableUtils::Bar(napi_env env, napi_callback_info info)
82 {
83     return nullptr;
84 }
85 
IsConcurrent(napi_env env,napi_value argv[],size_t argc)86 napi_value NativeEngineTest::IsConcurrent(napi_env env, napi_value argv[], size_t argc)
87 {
88     std::string funcName = "IsConcurrent";
89     napi_value cb = nullptr;
90     napi_value result = nullptr;
91     napi_create_function(env, funcName.c_str(), funcName.size(), TaskPool::IsConcurrent, nullptr, &cb);
92     napi_call_function(env, nullptr, cb, argc, argv, &result);
93     return result;
94 }
95 
GetTaskPoolInfo(napi_env env,napi_value argv[],size_t argc)96 napi_value NativeEngineTest::GetTaskPoolInfo(napi_env env, napi_value argv[], size_t argc)
97 {
98     std::string funcName = "GetTaskPoolInfo";
99     napi_value cb = nullptr;
100     napi_value result = nullptr;
101     napi_create_function(env, funcName.c_str(), funcName.size(), TaskPool::GetTaskPoolInfo, nullptr, &cb);
102     napi_call_function(env, nullptr, cb, argc, argv, &result);
103     return result;
104 }
105 
TerminateTask(napi_env env,napi_value argv[],size_t argc)106 napi_value NativeEngineTest::TerminateTask(napi_env env, napi_value argv[], size_t argc)
107 {
108     std::string funcName = "TerminateTask";
109     napi_value cb = nullptr;
110     napi_value result = nullptr;
111     napi_create_function(env, funcName.c_str(), funcName.size(), TaskPool::TerminateTask, nullptr, &cb);
112     napi_call_function(env, nullptr, cb, argc, argv, &result);
113     return result;
114 }
115 
Execute(napi_env env,napi_value argv[],size_t argc)116 napi_value NativeEngineTest::Execute(napi_env env, napi_value argv[], size_t argc)
117 {
118     std::string funcName = "Execute";
119     napi_value cb = nullptr;
120     napi_value result = nullptr;
121     napi_create_function(env, funcName.c_str(), funcName.size(), TaskPool::Execute, nullptr, &cb);
122     napi_call_function(env, nullptr, cb, argc, argv, &result);
123     return result;
124 }
125 
ExecuteDelayed(napi_env env,napi_value argv[],size_t argc)126 napi_value NativeEngineTest::ExecuteDelayed(napi_env env, napi_value argv[], size_t argc)
127 {
128     std::string funcName = "ExecuteDelayed";
129     napi_value cb = nullptr;
130     napi_value result = nullptr;
131     napi_create_function(env, funcName.c_str(), funcName.size(), TaskPool::ExecuteDelayed, nullptr, &cb);
132     napi_call_function(env, nullptr, cb, argc, argv, &result);
133     return result;
134 }
135 
Cancel(napi_env env,napi_value argv[],size_t argc)136 napi_value NativeEngineTest::Cancel(napi_env env, napi_value argv[], size_t argc)
137 {
138     std::string funcName = "Cancel";
139     napi_value cb = nullptr;
140     napi_value result = nullptr;
141     napi_create_function(env, funcName.c_str(), funcName.size(), TaskPool::Cancel, nullptr, &cb);
142     napi_call_function(env, nullptr, cb, argc, argv, &result);
143     return result;
144 }
145 
TaskGroupDestructor(napi_env env,void * data)146 void NativeEngineTest::TaskGroupDestructor(napi_env env, void* data)
147 {
148     void* hint = nullptr;
149     TaskGroup::TaskGroupDestructor(env, data, hint);
150 }
151 
SequenceRunnerDestructor(napi_env env,void * data)152 void NativeEngineTest::SequenceRunnerDestructor(napi_env env, void* data)
153 {
154     void* hint = nullptr;
155     SequenceRunner::SequenceRunnerDestructor(env, data, hint);
156 }
157 
ExecutePeriodically(napi_env env,napi_value argv[],size_t argc)158 napi_value NativeEngineTest::ExecutePeriodically(napi_env env, napi_value argv[], size_t argc)
159 {
160     std::string funcName = "ExecutePeriodically";
161     napi_value cb = nullptr;
162     napi_value result = nullptr;
163     napi_create_function(env, funcName.c_str(), funcName.size(), TaskPool::ExecutePeriodically, nullptr, &cb);
164     napi_call_function(env, nullptr, cb, argc, argv, &result);
165     return result;
166 }
167 
ExecuteGroup(napi_env env,napi_value taskGroup)168 napi_value NativeEngineTest::ExecuteGroup(napi_env env, napi_value taskGroup)
169 {
170     return TaskPool::ExecuteGroup(env, taskGroup, Priority::DEFAULT);
171 }
172 
DelayTask(uv_timer_t * handle)173 void NativeEngineTest::DelayTask(uv_timer_t* handle)
174 {
175     TaskPool::DelayTask(handle);
176 }
177 
PeriodicTaskCallback(uv_timer_t * handle)178 void NativeEngineTest::PeriodicTaskCallback(uv_timer_t* handle)
179 {
180     TaskPool::PeriodicTaskCallback(handle);
181 }
182 
UpdateGroupInfoByResult(napi_env env,uv_timer_t * handle,napi_value res,bool success)183 void NativeEngineTest::UpdateGroupInfoByResult(napi_env env, uv_timer_t* handle, napi_value res, bool success)
184 {
185     Task* task = reinterpret_cast<Task*>(handle->data);
186     TaskPool::UpdateGroupInfoByResult(env, task, res, success);
187 }
188 
TryTriggerExpand()189 void NativeEngineTest::TryTriggerExpand()
190 {
191     TaskManager& taskManager = TaskManager::GetInstance();
192     taskManager.isHandleInited_ = false;
193     taskManager.TryTriggerExpand();
194     taskManager.isHandleInited_ = true;
195     taskManager.needChecking_ = false;
196 }
197 
CheckForBlockedWorkers(napi_env env)198 void NativeEngineTest::CheckForBlockedWorkers(napi_env env)
199 {
200     Worker* worker = reinterpret_cast<Worker*>(WorkerConstructor(env));
201     worker->workerEnv_ = nullptr;
202     TaskManager& taskManager = TaskManager::GetInstance();
203     taskManager.workers_.clear();
204     taskManager.workers_.insert(worker);
205     taskManager.GetThreadInfos(env);
206 
207     worker->workerEnv_ = env;
208     worker->state_ = WorkerState::RUNNING;
209     worker->startTime_ = ConcurrentHelper::GetMilliseconds() - MAX_TIMEOUT_TIME;
210     worker->idleState_ = true;
211     taskManager.CheckForBlockedWorkers();
212 
213     worker->state_ = WorkerState::RUNNING;
214     worker->startTime_ = ConcurrentHelper::GetMilliseconds() - MAX_TIMEOUT_TIME;
215     worker->idleState_ = false;
216     worker->hasLongTask_ = true;
217     taskManager.CheckForBlockedWorkers();
218 
219     worker->state_ = WorkerState::RUNNING;
220     worker->startTime_ = ConcurrentHelper::GetMilliseconds() - MAX_TIMEOUT_TIME;
221     worker->idleState_ = false;
222     worker->hasLongTask_ = false;
223     taskManager.idleWorkers_.insert(worker);
224     taskManager.CheckForBlockedWorkers();
225     taskManager.timeoutWorkers_.clear();
226 }
227 
foo(const uv_async_t * req)228 void NativeEngineTest::foo(const uv_async_t* req)
229 {
230     return;
231 }
232 
TriggerShrink(napi_env env)233 void NativeEngineTest::TriggerShrink(napi_env env)
234 {
235     uint32_t step = 1;
236     TaskManager& taskManager = TaskManager::GetInstance();
237     taskManager.idleWorkers_.clear();
238     Worker* worker = reinterpret_cast<Worker*>(WorkerConstructor(env));
239     worker->workerEnv_ = env;
240     taskManager.idleWorkers_.insert(worker);
241 
242     taskManager.freeList_.emplace_back(worker);
243     worker->state_ = WorkerState::RUNNING;
244     taskManager.TriggerShrink(step);
245 
246     taskManager.idleWorkers_.clear();
247     taskManager.idleWorkers_.insert(worker);
248     taskManager.freeList_.emplace_back(worker);
249     worker->idlePoint_ = ConcurrentHelper::GetMilliseconds();
250     worker->state_ = WorkerState::IDLE;
251     worker->hasLongTask_ = false;
252     taskManager.TriggerShrink(step);
253 
254     taskManager.idleWorkers_.clear();
255     taskManager.idleWorkers_.insert(worker);
256     taskManager.freeList_.emplace_back(worker);
257     worker->idlePoint_ = ConcurrentHelper::GetMilliseconds() - MAX_TIMEOUT_TIME;
258     worker->state_ = WorkerState::IDLE;
259     worker->hasLongTask_ = false;
260     uv_loop_t* loop = worker->GetWorkerLoop();
261     ConcurrentHelper::UvHandleInit(loop, worker->clearWorkerSignal_, NativeEngineTest::foo, worker);
262     taskManager.TriggerShrink(step);
263     taskManager.idleWorkers_.clear();
264     taskManager.globalEnableFfrtFlag_ = false;
265 }
266 
NotifyShrink(napi_env env)267 void NativeEngineTest::NotifyShrink(napi_env env)
268 {
269     uint32_t step = 1;
270     TaskManager& taskManager = TaskManager::GetInstance();
271     taskManager.workers_.clear();
272     taskManager.timeoutWorkers_.clear();
273 
274     Worker* worker1 = reinterpret_cast<Worker*>(WorkerConstructor(env));
275     Worker* worker2 = reinterpret_cast<Worker*>(WorkerConstructor(env));
276     worker1->workerEnv_ = env;
277     worker2->workerEnv_ = env;
278     uv_loop_t* loop1 = worker1->GetWorkerLoop();
279     ConcurrentHelper::UvHandleInit(loop1, worker1->clearWorkerSignal_, NativeEngineTest::foo, worker1);
280     uv_loop_t* loop2 = worker2->GetWorkerLoop();
281     ConcurrentHelper::UvHandleInit(loop2, worker2->clearWorkerSignal_, NativeEngineTest::foo, worker2);
282     taskManager.workers_.insert(worker1);
283     taskManager.workers_.insert(worker2);
284     taskManager.timeoutWorkers_.insert(worker1);
285     taskManager.timeoutWorkers_.insert(worker2);
286     taskManager.NotifyShrink(step);
287 
288     taskManager.workers_.clear();
289     taskManager.timeoutWorkers_.clear();
290     taskManager.workers_.insert(worker1);
291     taskManager.idleWorkers_.insert(nullptr);
292     taskManager.NotifyShrink(step);
293 
294     taskManager.idleWorkers_.clear();
295     taskManager.idleWorkers_.insert(worker2);
296     worker2->hasLongTask_ = true;
297     taskManager.NotifyShrink(step);
298 
299     worker2->hasLongTask_ = false;
300     worker2->hasExecuted_ = true;
301     taskManager.NotifyShrink(step);
302 
303     worker2->hasExecuted_ = false;
304     taskManager.workers_.clear();
305     taskManager.NotifyShrink(step);
306 }
307 
TryExpand(napi_env env)308 void NativeEngineTest::TryExpand(napi_env env)
309 {
310     TaskManager& taskManager = TaskManager::GetInstance();
311     taskManager.workers_.clear();
312     taskManager.timeoutWorkers_.clear();
313     taskManager.idleWorkers_.clear();
314     Worker* worker = reinterpret_cast<Worker*>(WorkerConstructor(env));
315     worker->workerEnv_ = env;
316     uv_loop_t* loop = worker->GetWorkerLoop();
317     ConcurrentHelper::UvHandleInit(loop, worker->performTaskSignal_, NativeEngineTest::foo, worker);
318     taskManager.idleWorkers_.insert(worker);
319     taskManager.TryExpand();
320     taskManager.nonIdleTaskNum_ = 1;
321     taskManager.TryExpand();
322     taskManager.nonIdleTaskNum_ = 0;
323     taskManager.TryExpand();
324     taskManager.idleWorkers_.clear();
325     taskManager.suspend_ = true;
326     taskManager.TryExpand();
327 }
328 
CancelTask(napi_env env)329 void NativeEngineTest::CancelTask(napi_env env)
330 {
331     TaskManager& taskManager = TaskManager::GetInstance();
332     Task* task = new Task();
333     task->taskType_ = TaskType::COMMON_TASK;
334     taskManager.StoreTask(task);
335     napi_value val = NapiHelper::CreateObject(env);
336     napi_ref ref = NapiHelper::CreateReference(env, val, 0);
337     task->taskRef_ = ref;
338     task->taskState_ = ExecuteState::CANCELED;
339     taskManager.CancelTask(env, task->taskId_);
340 
341     task->taskState_ = ExecuteState::RUNNING;
342     task->isPeriodicTask_ = true;
343     taskManager.CancelTask(env, task->taskId_);
344 
345     task->isPeriodicTask_ = false;
346     task->taskType_ = TaskType::SEQRUNNER_TASK;
347     taskManager.CancelTask(env, task->taskId_);
348 
349     task->taskState_ = ExecuteState::FINISHED;
350     taskManager.CancelTask(env, task->taskId_);
351 
352     TaskInfo* taskInfo = new TaskInfo();
353     task->taskState_ = ExecuteState::WAITING;
354     task->currentTaskInfo_ = taskInfo;
355     taskManager.CancelTask(env, task->taskId_);
356     taskManager.tasks_.clear();
357     delete task;
358 }
359 
NotifyWorkerIdle(napi_env env)360 void NativeEngineTest::NotifyWorkerIdle(napi_env env)
361 {
362     TaskManager& taskManager = TaskManager::GetInstance();
363     Task* task = new Task();
364     task->taskId_ = TaskManager::GetInstance().CalculateTaskId(reinterpret_cast<uint64_t>(task));
365     taskManager.taskQueues_[Priority::DEFAULT]->EnqueueTaskId(task->taskId_);
366     Worker* worker = reinterpret_cast<Worker*>(WorkerConstructor(env));
367     worker->workerEnv_ = env;
368     uv_loop_t* loop = worker->GetWorkerLoop();
369     ConcurrentHelper::UvHandleInit(loop, worker->performTaskSignal_, NativeEngineTest::foo, worker);
370     worker->state_ = WorkerState::BLOCKED;
371     taskManager.NotifyWorkerIdle(worker);
372     worker->state_ = WorkerState::IDLE;
373     taskManager.NotifyWorkerIdle(worker);
374     delete task;
375 }
376 
EnqueueTaskId(napi_env env)377 void NativeEngineTest::EnqueueTaskId(napi_env env)
378 {
379     TaskManager& taskManager = TaskManager::GetInstance();
380     Task* task = new Task();
381     taskManager.StoreTask(task);
382     napi_value obj = Helper::NapiHelper::CreateObject(env);
383     napi_ref callbackRef = Helper::NapiHelper::CreateReference(env, obj, 1);
384     task->onEnqueuedCallBackInfo_ = new ListenerCallBackInfo(env, callbackRef, nullptr);
385     taskManager.EnqueueTaskId(task->taskId_);
386 
387     taskManager.workers_.clear();
388     Worker* worker = reinterpret_cast<Worker*>(WorkerConstructor(env));
389     worker->state_ = WorkerState::RUNNING;
390     taskManager.workers_.insert(worker);
391     taskManager.IsChooseIdle();
392     taskManager.workers_.clear();
393     Helper::NapiHelper::DeleteReference(env, callbackRef);
394     delete task;
395 }
396 
GetTaskByPriority(napi_env env)397 void NativeEngineTest::GetTaskByPriority(napi_env env)
398 {
399     TaskManager& taskManager = TaskManager::GetInstance();
400     Task* task = new Task();
401     taskManager.StoreTask(task);
402     auto& mediumTaskQueue = taskManager.taskQueues_[Priority::DEFAULT];
403     uint32_t id = mediumTaskQueue->DequeueTaskId();
404     while (id != 0) {
405         id = mediumTaskQueue->DequeueTaskId();
406     }
407     taskManager.EnqueueTaskId(task->taskId_);
408     std::set<uint32_t> set{task->taskId_};
409     taskManager.dependTaskInfos_.emplace(task->taskId_, std::move(set));
410     taskManager.GetTaskByPriority(mediumTaskQueue, Priority::DEFAULT);
411     taskManager.dependTaskInfos_.clear();
412     taskManager.tasks_.clear();
413     delete task;
414 }
415 
RestoreWorker(napi_env env)416 void NativeEngineTest::RestoreWorker(napi_env env)
417 {
418     TaskManager& taskManager = TaskManager::GetInstance();
419     Worker* worker = reinterpret_cast<Worker*>(WorkerConstructor(env));
420     taskManager.suspend_ = false;
421     worker->state_ = WorkerState::BLOCKED;
422     taskManager.RestoreWorker(worker);
423 
424     Task* task = new Task();
425     task->taskId_ = TaskManager::GetInstance().CalculateTaskId(reinterpret_cast<uint64_t>(task));
426     taskManager.EnqueueTaskId(task->taskId_);
427     worker->state_ = WorkerState::IDLE;
428     worker->workerEnv_ = env;
429     uv_loop_t* loop = worker->GetWorkerLoop();
430     ConcurrentHelper::UvHandleInit(loop, worker->performTaskSignal_, NativeEngineTest::foo, worker);
431     taskManager.RestoreWorker(worker);
432 }
433 
StoreDependentId(uint32_t taskId,uint32_t dependentId)434 void NativeEngineTest::StoreDependentId(uint32_t taskId, uint32_t dependentId)
435 {
436     TaskManager& taskManager = TaskManager::GetInstance();
437     std::set<uint32_t> set{ dependentId };
438     taskManager.dependTaskInfos_.emplace(taskId, std::move(set));
439 }
440 
StoreDependentTaskId(uint32_t taskId,uint32_t dependentId)441 void NativeEngineTest::StoreDependentTaskId(uint32_t taskId, uint32_t dependentId)
442 {
443     TaskManager& taskManager = TaskManager::GetInstance();
444     std::set<uint32_t> set{ dependentId };
445     taskManager.dependentTaskInfos_.emplace(taskId, std::move(set));
446 }
447 
StoreTaskDuration(uint32_t taskId)448 void NativeEngineTest::StoreTaskDuration(uint32_t taskId)
449 {
450     TaskManager& taskManager = TaskManager::GetInstance();
451     uint64_t durationId = taskId + MAX_TIMEOUT_TIME;
452     std::pair<uint64_t, uint64_t> durationData = std::make_pair(taskId, durationId);
453     taskManager.taskDurationInfos_.emplace(taskId, std::move(durationData));
454 }
455 
InitTaskManager(napi_env env)456 void NativeEngineTest::InitTaskManager(napi_env env)
457 {
458     napi_env taskEnv = nullptr;
459     napi_create_runtime(env, &taskEnv);
460     NativeEngine* taskEngine = reinterpret_cast<NativeEngine*>(taskEnv);
461     taskEngine->MarkTaskPoolThread();
462     TaskManager& taskManager = TaskManager::GetInstance();
463     taskManager.globalEnableFfrtFlag_ = true;
464     taskManager.InitTaskManager(taskEnv);
465     taskManager.DecreaseRefCount(env, 0);
466     napi_value exception = nullptr;
467     napi_get_and_clear_last_exception(env, &exception);
468 }
469 
NotifyDependencyTaskInfo(napi_env env)470 void NativeEngineTest::NotifyDependencyTaskInfo(napi_env env)
471 {
472     TaskManager& taskManager = TaskManager::GetInstance();
473     Task* task = new Task();
474     task->taskId_ = TaskManager::GetInstance().CalculateTaskId(reinterpret_cast<uint64_t>(task));
475     task->env_ = env;
476     Worker* worker = reinterpret_cast<Worker*>(WorkerConstructor(env));
477     worker->workerEnv_ = env;
478     task->worker_ = worker;
479     uint32_t id = task->taskId_ + MAX_TIMEOUT_TIME;
480     std::set<uint32_t> set{ task->taskId_, id };
481     taskManager.dependentTaskInfos_.emplace(task->taskId_, std::move(set));
482     taskManager.NotifyDependencyTaskInfo(task->taskId_);
483     std::set<uint32_t> set1{ task->taskId_, id };
484     taskManager.dependentTaskInfos_.emplace(task->taskId_, std::move(set1));
485     taskManager.EnqueuePendingTaskInfo(0, Priority::DEFAULT);
486     taskManager.EnqueuePendingTaskInfo(id, Priority::DEFAULT);
487     taskManager.EnqueuePendingTaskInfo(task->taskId_, Priority::DEFAULT);
488     taskManager.NotifyDependencyTaskInfo(task->taskId_);
489     std::set<uint32_t> set2{ task->taskId_, id };
490     taskManager.dependentTaskInfos_.emplace(task->taskId_, std::move(set2));
491     taskManager.IsDependentByTaskId(task->taskId_);
492 }
493 
StoreTaskDependency(napi_env env)494 void NativeEngineTest::StoreTaskDependency(napi_env env)
495 {
496     TaskManager& taskManager = TaskManager::GetInstance();
497     Task* task = new Task();
498     task->taskId_ = TaskManager::GetInstance().CalculateTaskId(reinterpret_cast<uint64_t>(task));
499     task->env_ = env;
500     Task* task1 = new Task();
501     task1->taskId_ = TaskManager::GetInstance().CalculateTaskId(reinterpret_cast<uint64_t>(task1));
502     task1->env_ = env;
503     Task* task2 = new Task();
504     task2->taskId_ = TaskManager::GetInstance().CalculateTaskId(reinterpret_cast<uint64_t>(task2));
505     task2->env_ = env;
506     taskManager.dependTaskInfos_.clear();
507     uint32_t id1 = task->taskId_;
508     uint32_t id2 = task->taskId_ + MAX_TIMEOUT_TIME;
509     uint32_t id3 = task1->taskId_;
510     uint32_t id4 = task1->taskId_ + MAX_TIMEOUT_TIME;
511     uint32_t id5 = task2->taskId_;
512     uint32_t id6 = task2->taskId_ + MAX_TIMEOUT_TIME;
513     std::set<uint32_t> set{ id2, id3 };
514     taskManager.dependTaskInfos_.emplace(id1, std::move(set));
515     std::set<uint32_t> taskId{ id1, id2 };
516     taskManager.StoreTaskDependency(id3, taskId);
517     taskManager.StoreTaskDependency(id5, taskId);
518     std::set<uint32_t> set1{ id4, id5 };
519     taskManager.dependTaskInfos_.emplace(id3, std::move(set1));
520     taskManager.StoreTaskDependency(id1, taskId);
521     std::set<uint32_t> set2{ id6 };
522     std::set<uint32_t> set3{ id1 };
523     taskManager.dependTaskInfos_.emplace(id5, std::move(set3));
524     taskManager.StoreTaskDependency(id1, taskId);
525     taskManager.dependTaskInfos_.emplace(id5, std::move(set2));
526     taskManager.StoreTaskDependency(id1, taskId);
527     taskManager.dependTaskInfos_.clear();
528     napi_value exception = nullptr;
529     napi_get_and_clear_last_exception(env, &exception);
530 }
531 
RemoveTaskDependency(napi_env env)532 void NativeEngineTest::RemoveTaskDependency(napi_env env)
533 {
534     TaskManager& taskManager = TaskManager::GetInstance();
535     Task* task = new Task();
536     task->taskId_ = TaskManager::GetInstance().CalculateTaskId(reinterpret_cast<uint64_t>(task));
537     uint32_t id = task->taskId_ + MAX_TIMEOUT_TIME;
538     Task* task1 = new Task();
539     task1->taskId_ = TaskManager::GetInstance().CalculateTaskId(reinterpret_cast<uint64_t>(task1));
540     uint32_t id2 = task1->taskId_ + MAX_TIMEOUT_TIME;
541     taskManager.dependTaskInfos_.clear();
542     std::set<uint32_t> set{ id };
543     taskManager.dependTaskInfos_.emplace(task->taskId_, std::move(set));
544     taskManager.RemoveTaskDependency(task->taskId_, task1->taskId_);
545     taskManager.RemoveTaskDependency(task->taskId_, id);
546     std::set<uint32_t> set2{ id };
547     taskManager.dependentTaskInfos_.emplace(task->taskId_, std::move(set2));
548     std::set<uint32_t> dependentTaskIdSet{ task->taskId_ };
549     taskManager.StoreDependentTaskInfo(dependentTaskIdSet, task1->taskId_);
550     taskManager.RemoveDependentTaskInfo(task->taskId_, id2);
551     taskManager.RemoveDependentTaskInfo(task->taskId_, id);
552     taskManager.GetTaskDependInfoToString(task1->taskId_);
553     taskManager.taskDurationInfos_.emplace(task->taskId_, std::make_pair(UINT64_ZERO, task1->taskId_));
554     taskManager.StoreTaskDuration(task->taskId_, UINT64_ZERO, UINT64_ZERO);
555     taskManager.GetTaskDuration(task->taskId_, "");
556     taskManager.RemoveTaskDuration(task->taskId_);
557 }
558 
ReleaseTaskData(napi_env env)559 void NativeEngineTest::ReleaseTaskData(napi_env env)
560 {
561     TaskManager& taskManager = TaskManager::GetInstance();
562     Task* task = new Task();
563     task->onResultSignal_ = nullptr;
564     task->taskType_ = TaskType::FUNCTION_TASK;
565     taskManager.StoreTask(task);
566     taskManager.ReleaseTaskData(env, task);
567     task->taskType_ = TaskType::GROUP_FUNCTION_TASK;
568     taskManager.StoreTask(task);
569     taskManager.ReleaseTaskData(env, task);
570     std::set<uint32_t> set{ task->taskId_ };
571     taskManager.dependTaskInfos_.emplace(task->taskId_, std::move(set));
572     task->taskType_ = TaskType::COMMON_TASK;
573     taskManager.StoreTask(task);
574     taskManager.ReleaseTaskData(env, task);
575     Task* task1 = new Task();
576     task1->taskId_ = TaskManager::GetInstance().CalculateTaskId(reinterpret_cast<uint64_t>(task1));
577     task1->onEnqueuedCallBackInfo_ = new ListenerCallBackInfo(env, nullptr, nullptr);
578     task1->onStartExecutionCallBackInfo_ = new ListenerCallBackInfo(env, nullptr, nullptr);
579     task1->onExecutionFailedCallBackInfo_ = new ListenerCallBackInfo(env, nullptr, nullptr);
580     task1->onExecutionSucceededCallBackInfo_ = new ListenerCallBackInfo(env, nullptr, nullptr);
581     taskManager.ReleaseCallBackInfo(task1);
582     Task* task2 = new Task();
583     task2->taskId_ = TaskManager::GetInstance().CalculateTaskId(reinterpret_cast<uint64_t>(task2));
584     task2->isMainThreadTask_ = true;
585     taskManager.ReleaseCallBackInfo(task2);
586     task2->isMainThreadTask_ = false;
587     taskManager.ReleaseCallBackInfo(task2);
588     auto loop = NapiHelper::GetLibUV(env);
589     ConcurrentHelper::UvHandleInit(loop, task->onStartExecutionSignal_, NativeEngineTest::foo, task2);
590     taskManager.ReleaseCallBackInfo(task2);
591 }
592 
CheckTask(napi_env env)593 void NativeEngineTest::CheckTask(napi_env env)
594 {
595     TaskManager& taskManager = TaskManager::GetInstance();
596     Task* task = new Task();
597     taskManager.StoreTask(task);
598     Task* task1 = new Task();
599     taskManager.StoreTask(task1);
600     taskManager.RemoveTask(task1->taskId_);
601     taskManager.CheckTask(task1->taskId_);
602 
603     TaskGroupManager& groupManager = TaskGroupManager::GetInstance();
604     TaskGroup* group = new TaskGroup();
605     napi_value obj = NapiHelper::CreateObject(env);
606     napi_ref ref = NapiHelper::CreateReference(env, obj, 1);
607     group->groupRef_ = ref;
608     uint64_t groupId = reinterpret_cast<uint64_t>(group);
609     groupManager.StoreTaskGroup(groupId, nullptr);
610     groupManager.AddTask(groupId, nullptr, task->taskId_);
611     groupManager.taskGroups_.clear();
612     groupManager.StoreTaskGroup(groupId, group);
613     group->groupState_ = ExecuteState::CANCELED;
614     groupManager.CancelGroup(env, groupId);
615 
616     group->groupState_ = ExecuteState::WAITING;
617     groupManager.CancelGroup(env, groupId);
618 
619     GroupInfo* groupInfo = new GroupInfo();
620     groupInfo->finishedTaskNum = FINSHED_TASK;
621     group->currentGroupInfo_ = groupInfo;
622     group->groupState_ = ExecuteState::NOT_FOUND;
623     groupManager.CancelGroup(env, groupId);
624 
625     group->groupState_ = ExecuteState::FINISHED;
626     groupManager.CancelGroup(env, groupId);
627 
628     group->groupState_ = ExecuteState::RUNNING;
629     group->taskNum_ = FINSHED_TASK;
630     group->taskIds_.push_back(task->taskId_);
631     groupManager.CancelGroup(env, groupId);
632 
633     group->taskNum_ = TASK_NUMS;
634     group->groupState_ = ExecuteState::WAITING;
635     napi_value resArr;
636     napi_create_array_with_length(env, group->taskIds_.size(), &resArr);
637     napi_ref arrRef = NapiHelper::CreateReference(env, resArr, 1);
638     groupInfo->resArr = arrRef;
639     napi_value promise = NapiHelper::CreatePromise(env, &groupInfo->deferred);
640     groupManager.CancelGroup(env, groupId);
641 }
642 
CancelGroupTask(napi_env env)643 void NativeEngineTest::CancelGroupTask(napi_env env)
644 {
645     TaskGroupManager& groupManager = TaskGroupManager::GetInstance();
646     SequenceRunnerManager& sequenceRunnerManager = SequenceRunnerManager::GetInstance();
647     TaskManager& taskManager = TaskManager::GetInstance();
648     TaskGroup* group = new TaskGroup();
649     group->currentGroupInfo_ = new GroupInfo();
650     Task* task = new Task();
651     taskManager.StoreTask(task);
652     task->taskState_ = ExecuteState::RUNNING;
653     groupManager.CancelGroupTask(env, task->taskId_, group);
654     task->taskState_ = ExecuteState::WAITING;
655     groupManager.CancelGroupTask(env, task->taskId_, group);
656     task->taskState_ = ExecuteState::WAITING;
657     TaskInfo* taskInfo = new TaskInfo();
658     task->currentTaskInfo_ = taskInfo;
659     groupManager.CancelGroupTask(env, task->taskId_, group);
660 
661     Task* task1 = new Task();
662     task1->taskId_ = TaskManager::GetInstance().CalculateTaskId(reinterpret_cast<uint64_t>(task1));
663     SequenceRunner* seqRunner = new SequenceRunner();
664     uint64_t seqRunnerId = reinterpret_cast<uint64_t>(seqRunner);
665     sequenceRunnerManager.StoreSequenceRunner(seqRunnerId, seqRunner);
666     sequenceRunnerManager.AddTaskToSeqRunner(seqRunnerId, task1);
667 }
668 
TriggerSeqRunner(napi_env env)669 void NativeEngineTest::TriggerSeqRunner(napi_env env)
670 {
671     TaskGroupManager& groupManager = TaskGroupManager::GetInstance();
672     SequenceRunnerManager& sequenceRunnerManager = SequenceRunnerManager::GetInstance();
673     Task* task = new Task();
674     task->taskId_ = TaskManager::GetInstance().CalculateTaskId(reinterpret_cast<uint64_t>(task));
675     Task* task1 = new Task();
676     task1->taskId_ = TaskManager::GetInstance().CalculateTaskId(reinterpret_cast<uint64_t>(task1));
677     SequenceRunner* seqRunner = new SequenceRunner();
678     uint64_t seqRunnerId = reinterpret_cast<uint64_t>(seqRunner);
679     seqRunner->priority_ = Priority::DEFAULT;
680     task->seqRunnerId_ = seqRunnerId;
681     sequenceRunnerManager.StoreSequenceRunner(seqRunnerId, seqRunner);
682     seqRunner->isGlobalRunner_ = true;
683     seqRunner->IncreaseSeqCount();
684     bool res = sequenceRunnerManager.TriggerSeqRunner(env, task);
685     ASSERT_FALSE(res);
686     seqRunner->currentTaskId_ = task1->taskId_;
687     seqRunner->IncreaseSeqCount();
688     sequenceRunnerManager.TriggerSeqRunner(env, task);
689     seqRunner->isGlobalRunner_ = false;
690     seqRunner->currentTaskId_ = task->taskId_;
691     seqRunner->IncreaseSeqCount();
692     sequenceRunnerManager.TriggerSeqRunner(env, task);
693     seqRunner->IncreaseSeqCount();
694     task1->taskState_ = ExecuteState::CANCELED;
695     task1->env_ = env;
696     seqRunner->seqRunnerTasks_.push_back(task1);
697     TaskInfo* taskInfo = new TaskInfo();
698     task1->currentTaskInfo_ = taskInfo;
699     seqRunner->currentTaskId_ = task->taskId_;
700     sequenceRunnerManager.TriggerSeqRunner(env, task);
701     seqRunner->refCount_ = SIZE_TWO;
702     TaskInfo* taskInfo1 = new TaskInfo();
703     task1->currentTaskInfo_ = taskInfo1;
704     seqRunner->seqRunnerTasks_.push_back(task1);
705     seqRunner->seqRunnerTasks_.push_back(task);
706     task->taskState_ = ExecuteState::RUNNING;
707     seqRunner->currentTaskId_ = task->taskId_;
708     sequenceRunnerManager.TriggerSeqRunner(env, task);
709 }
710 
UpdateGroupState(napi_env env)711 void NativeEngineTest::UpdateGroupState(napi_env env)
712 {
713     TaskGroupManager& groupManager = TaskGroupManager::GetInstance();
714     TaskGroup* group = new TaskGroup();
715     uint64_t groupId = reinterpret_cast<uint64_t>(group);
716     Task* task = new Task();
717     task->taskId_ = TaskManager::GetInstance().CalculateTaskId(reinterpret_cast<uint64_t>(task));
718     groupManager.StoreTaskGroup(groupId, group);
719     groupManager.UpdateGroupState(task->taskId_);
720     group->groupState_ = ExecuteState::CANCELED;
721     groupManager.UpdateGroupState(groupId);
722     group->groupState_ = ExecuteState::WAITING;
723     groupManager.UpdateGroupState(groupId);
724 
725     SequenceRunnerManager& runnerManager = SequenceRunnerManager::GetInstance();
726     napi_value obj = NapiHelper::CreateObject(env);
727     SequenceRunner* seqRunner = runnerManager.CreateOrGetGlobalRunner(env, obj, SIZE_THREE, "test", UINT32_ONE);
728     seqRunner->priority_ = Priority::MEDIUM;
729     runnerManager.CreateOrGetGlobalRunner(env, obj, SIZE_TWO, "test", UINT32_ZERO);
730     runnerManager.CreateOrGetGlobalRunner(env, obj, SIZE_TWO, "test", UINT32_ONE);
731     NativeEngineTest::RemoveSequenceRunnerByName("func");
732     NativeEngineTest::RemoveSequenceRunnerByName("test");
733 }
734 
ReleaseWorkerHandles(napi_env env)735 void NativeEngineTest::ReleaseWorkerHandles(napi_env env)
736 {
737     ExceptionScope scope(env);
738     Worker* worker = reinterpret_cast<Worker*>(WorkerConstructor(env));
739     napi_env workerEnv = nullptr;
740     napi_create_runtime(env, &workerEnv);
741     worker->workerEnv_ = workerEnv;
742     NativeEngine* workerEngine = reinterpret_cast<NativeEngine*>(workerEnv);
743     uv_loop_t* loop = worker->GetWorkerLoop();
744     ConcurrentHelper::UvHandleInit(loop, worker->performTaskSignal_,
745                                    NativeEngineTest::foo, worker);
746     ConcurrentHelper::UvHandleInit(loop, worker->debuggerOnPostTaskSignal_,
747                                    NativeEngineTest::foo, worker);
748     ConcurrentHelper::UvHandleInit(loop, worker->clearWorkerSignal_,
749                                    NativeEngineTest::foo, worker);
750     uv_async_t* req = new uv_async_t;
751     req->data = worker;
752     Worker::ReleaseWorkerHandles(req);
753 }
754 
DebuggerOnPostTask(napi_env env)755 void NativeEngineTest::DebuggerOnPostTask(napi_env env)
756 {
757     ExceptionScope scope(env);
758     Worker* worker = reinterpret_cast<Worker*>(WorkerConstructor(env));
759     uv_loop_t* loop = worker->GetWorkerLoop();
760     ConcurrentHelper::UvHandleInit(loop, worker->debuggerOnPostTaskSignal_,
761                                    NativeEngineTest::foo, worker);
762     std::function<void()> myTask = []() {
763         return;
764     };
765     worker->DebuggerOnPostTask(std::move(myTask));
766     uv_async_t* req = new uv_async_t;
767     std::function<void()> myTask1 = []() {
768         return;
769     };
770     worker->debuggerQueue_.push(myTask1);
771     req->data = worker;
772     worker->debuggerMutex_.unlock();
773     Worker::HandleDebuggerTask(req);
774     worker->workerEnv_ = nullptr;
775     worker->ReleaseWorkerThreadContent();
776     napi_env workerEnv = nullptr;
777     napi_create_runtime(env, &workerEnv);
778     worker->workerEnv_ = workerEnv;
779     worker->hostEnv_ = nullptr;
780     worker->state_ = WorkerState::BLOCKED;
781     worker->ReleaseWorkerThreadContent();
782     napi_env workerEnv1 = nullptr;
783     napi_create_runtime(env, &workerEnv1);
784     worker->hostEnv_ = env;
785     worker->workerEnv_ = workerEnv1;
786     worker->state_ = WorkerState::IDLE;
787     worker->ReleaseWorkerThreadContent();
788 }
789 
PerformTask(napi_env env)790 void NativeEngineTest::PerformTask(napi_env env)
791 {
792     ExceptionScope scope(env);
793     TaskManager& taskManager = TaskManager::GetInstance();
794     Worker* worker = reinterpret_cast<Worker*>(WorkerConstructor(env));
795     napi_env workerEnv = nullptr;
796     napi_create_runtime(env, &workerEnv);
797     worker->workerEnv_ = workerEnv;
798 
799     TaskGroup* group = new TaskGroup();
800     uint64_t groupId = reinterpret_cast<uint64_t>(group);
801     group->groupState_ = ExecuteState::WAITING;
802     TaskGroupManager& groupManager = TaskGroupManager::GetInstance();
803     groupManager.StoreTaskGroup(groupId, group);
804 
805     Task* task = new Task();
806     taskManager.StoreTask(task);
807     Priority priority = Priority::DEFAULT;
808     auto& mediumTaskQueue = taskManager.taskQueues_[priority];
809     uint32_t id = mediumTaskQueue->DequeueTaskId();
810     while (id != 0) {
811         id = mediumTaskQueue->DequeueTaskId();
812     }
813     mediumTaskQueue->EnqueueTaskId(task->taskId_);
814 
815     uv_async_t* req = new uv_async_t;
816     req->data = worker;
817     task->taskState_ = ExecuteState::WAITING;
818     task->taskType_ = TaskType::GROUP_COMMON_TASK;
819     task->groupId_ = groupId;
820     Worker::PerformTask(req);
821     usleep(100000); // 100000: is sleep 100ms
822 }
823 
NotifyHandleTaskResult(napi_env env)824 void NativeEngineTest::NotifyHandleTaskResult(napi_env env)
825 {
826     ExceptionScope scope(env);
827     Worker* worker = reinterpret_cast<Worker*>(WorkerConstructor(env));
828     Task* task = new Task();
829     task->taskId_ = TaskManager::GetInstance().CalculateTaskId(reinterpret_cast<uint64_t>(task));
830     task->env_ = worker->workerEnv_;
831     uv_loop_t* loop = worker->GetWorkerLoop();
832     ConcurrentHelper::UvHandleInit(loop, task->onResultSignal_, NativeEngineTest::foo, task);
833     Task* task1 = new Task();
834     task1->taskId_ = TaskManager::GetInstance().CalculateTaskId(reinterpret_cast<uint64_t>(task1));
835     worker->currentTaskId_.push_back(task1->taskId_);
836     task->worker_ = worker;
837     task->isMainThreadTask_ = true;
838     task->taskRefCount_.fetch_add(1);
839     TaskManager::GetInstance().StoreTask(task);
840     Worker::NotifyHandleTaskResult(task);
841 }
842 
TaskResultCallback(napi_env env)843 void NativeEngineTest::TaskResultCallback(napi_env env)
844 {
845     ExceptionScope scope(env);
846     Worker* worker = reinterpret_cast<Worker*>(WorkerConstructor(env));
847     Task* task = new Task();
848     task->taskId_ = TaskManager::GetInstance().CalculateTaskId(reinterpret_cast<uint64_t>(task));
849     task->env_ = worker->workerEnv_;
850     task->taskRefCount_.fetch_add(1);
851     task->worker_ = worker;
852     task->cpuTime_ = UINT64_ZERO;
853     Worker::TaskResultCallback(worker->workerEnv_, nullptr, false, reinterpret_cast<void*>(task));
854     task->taskRefCount_.fetch_add(1);
855     task->cpuTime_ = task->taskId_;
856     Worker::TaskResultCallback(worker->workerEnv_, nullptr, true, reinterpret_cast<void*>(task));
857 
858     worker->priority_ = Priority::LOW;
859     worker->ResetWorkerPriority();
860     TaskManager& taskManager = TaskManager::GetInstance();
861     taskManager.globalEnableFfrtFlag_ = true;
862     worker->priority_ = Priority::HIGH;
863     worker->ResetWorkerPriority();
864     taskManager.globalEnableFfrtFlag_ = false;
865     worker->state_ = WorkerState::BLOCKED;
866     worker->UpdateExecutedInfo();
867     worker->state_ = WorkerState::IDLE;
868     worker->UpdateExecutedInfo();
869 
870     uint32_t id = task->taskId_ + MAX_TIMEOUT_TIME;
871     std::unordered_set<uint32_t> set{ task->taskId_, id };
872     worker->longTasksSet_ = std::move(set);
873     worker->TerminateTask(task->taskId_);
874 }
875 
HandleFunctionException(napi_env env)876 void NativeEngineTest::HandleFunctionException(napi_env env)
877 {
878     ExceptionScope scope(env);
879     Worker* worker = reinterpret_cast<Worker*>(WorkerConstructor(env));
880     napi_env workerEnv = nullptr;
881     napi_create_runtime(env, &workerEnv);
882     worker->workerEnv_ = workerEnv;
883     Task* task = new Task();
884     task->taskId_ = TaskManager::GetInstance().CalculateTaskId(reinterpret_cast<uint64_t>(task));
885     task->env_ = workerEnv;
886     TaskResultInfo* resultInfo = new TaskResultInfo(env, workerEnv, task->taskId_, nullptr);
887     TaskManager::GetInstance().NotifyCallbackExecute(env, resultInfo, task);
888     task->IncreaseRefCount();
889     uv_loop_t* loop = NapiHelper::GetLibUV(env);
890     ConcurrentHelper::UvHandleInit(loop, task->onResultSignal_, NativeEngineTest::foo, task);
891     task->worker_ = worker;
892     Worker::HandleFunctionException(env, task);
893     task->IncreaseRefCount();
894     Worker::HandleFunctionException(env, task);
895 }
896 
WorkerConstructor(napi_env env)897 void* NativeEngineTest::WorkerConstructor(napi_env env)
898 {
899     uint32_t sleepTime = 50000; // 50000: is sleep 50ms
900     Worker* worker = Worker::WorkerConstructor(env);
901     usleep(sleepTime);
902     uv_loop_t* loop = worker->GetWorkerLoop();
903     int num = 0;
904     while (loop == nullptr && num < 10) { // 10: is loop 10 times
905         usleep(sleepTime);
906         loop = worker->GetWorkerLoop();
907         num++;
908     }
909     ConcurrentHelper::UvHandleInit(loop, worker->performTaskSignal_, NativeEngineTest::foo, worker);
910     return worker;
911 }
912 
GetWorkerTid(uv_timer_t * handle)913 pid_t NativeEngineTest::GetWorkerTid(uv_timer_t* handle)
914 {
915     Worker* worker = reinterpret_cast<Worker*>(handle->data);
916     return worker->tid_;
917 }
918 
WorkerPostTask(napi_env env)919 void NativeEngineTest::WorkerPostTask(napi_env env)
920 {
921     ExceptionScope scope(env);
922     Worker* worker = reinterpret_cast<Worker*>(WorkerConstructor(env));
923     std::function<void()> myTask = []() {
924         return;
925     };
926     usleep(100000); // 100000: is sleep 100ms
927     worker->CloseHandles();
928     usleep(100000); // 100000: is sleep 100ms
929     worker->debuggerOnPostTaskSignal_ = nullptr;
930     worker->DebuggerOnPostTask(std::move(myTask));
931     uv_async_t* req = new uv_async_t;
932     req->data = nullptr;
933     Worker::HandleDebuggerTask(req);
934     worker->IsLoopActive();
935     worker->NotifyExecuteTask();
936     Worker::TriggerGCCheck(nullptr);
937     Worker::TriggerGCCheck(req);
938     worker->NotifyTaskFinished();
939     worker->PostReleaseSignal();
940 }
941 
ResetTaskManager()942 void NativeEngineTest::ResetTaskManager()
943 {
944     TaskManager& taskManager = TaskManager::GetInstance();
945     taskManager.workers_.clear();
946     taskManager.idleWorkers_.clear();
947     taskManager.timeoutWorkers_.clear();
948     taskManager.highPrioExecuteCount_ = 0;
949     taskManager.mediumPrioExecuteCount_ = 0;
950 }
951 
CheckAndCreateAsyncRunner(napi_env env,napi_value name,napi_value runningCapacity,napi_value waitingCapacity)952 void NativeEngineTest::CheckAndCreateAsyncRunner(napi_env env, napi_value name, napi_value runningCapacity,
953                                                  napi_value waitingCapacity)
954 {
955     napi_value thisVar = nullptr;
956     AsyncRunner::CheckAndCreateAsyncRunner(env, thisVar, name, runningCapacity, waitingCapacity);
957 }
958 
AsyncRunnerDestructor(napi_env env,void * data)959 void NativeEngineTest::AsyncRunnerDestructor(napi_env env, void* data)
960 {
961     void* hint = nullptr;
962     AsyncRunner::AsyncRunnerDestructor(env, data, hint);
963 }
964 
AddTasksToAsyncRunner(void * asyncData,void * taskData)965 void NativeEngineTest::AddTasksToAsyncRunner(void* asyncData, void* taskData)
966 {
967     AsyncRunner* async = reinterpret_cast<AsyncRunner*>(asyncData);
968     Task* task = reinterpret_cast<Task*>(taskData);
969     AsyncRunner::AddTasksToAsyncRunner(async, task);
970 }
971 
RemoveSequenceRunnerByName(std::string name)972 void NativeEngineTest::RemoveSequenceRunnerByName(std::string name)
973 {
974     SequenceRunnerManager::GetInstance().RemoveSequenceRunnerByName(name);
975 }
976 
RemoveSequenceRunner(uint64_t seqId)977 void NativeEngineTest::RemoveSequenceRunner(uint64_t seqId)
978 {
979     SequenceRunnerManager::GetInstance().RemoveSequenceRunner(seqId);
980 }
981 } // namespace Commonlibrary::Concurrent::TaskPoolModule