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