1 /*
2 * Copyright (c) 2021 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 #include "napi/native_api.h"
16 #include "hilog/log.h"
17 #include "ffrt/task.h"
18 #include "ffrt/type_def.h"
19 #include "ffrt/condition_variable.h"
20 #include "ffrt/mutex.h"
21 #include "ffrt/shared_mutex.h"
22 #include "ffrt/queue.h"
23 #include "ffrt/sleep.h"
24 #include "ffrt/loop.h"
25 #include "ffrt/timer.h"
26 #include "fiber_utils.h"
27 #include <mutex>
28 #include <thread>
29 #include <string>
30 #include <unistd.h>
31 #include <pthread.h>
32 #include <sys/eventfd.h>
33 #define FAIL (-1)
34 #define SUCCESS 0
35 #define PARAM_100 100
36
37 using namespace std;
38 using namespace std::chrono;
39
40 const int ERR_CODE_1 = 1;
41 const int ERR_CODE_2 = 2;
42 const int ERR_CODE_3 = 3;
43 const int ERR_CODE_4 = 4;
44 const int ERR_CODE_5 = 5;
45 const int ERR_CODE_6 = 6;
46 const int ERR_CODE_7 = 7;
47 const int ERR_CODE_8 = 8;
48 const int ERR_CODE_9 = 9;
49 const uint64_t UNIT_STACK_SIZE = 2 * 1024 * 1024;
50 const uint64_t UNIT_TASK_DELAY = 200000;
51 const uint32_t TASK_SUBMIT_REF = 2;
52 const uint32_t TASK_RELEASE_REF = 3;
53 const uint32_t TASK_DELAY_TIME = 1000;
54 const int MULTIPLE_RADIO = 10;
55 const uint64_t PLUS_SLEEP_TIME = 200000;
56 const uint64_t FUNC_SIGNAL_SLEEP = 30000;
57 const uint64_t SLEEP_TIME = 2000;
58 const uint64_t UNIT_TASK_DELAY_500 = 500000;
59 const uint64_t COST_TIME_200 = 200;
60 const uint64_t COST_TIME_300 = 300;
61 const uint64_t COST_TIME_500 = 500;
62 const uint64_t COST_TIME_600 = 600;
63
OnePlusForTest(void * arg)64 void OnePlusForTest(void* arg)
65 {
66 (*static_cast<int*>(arg)) += 1;
67 }
68
MultipleForTest(void * arg)69 void MultipleForTest(void* arg)
70 {
71 (*static_cast<int*>(arg)) *= MULTIPLE_RADIO;
72 }
73
SubForTest(void * arg)74 void SubForTest(void* arg)
75 {
76 (*static_cast<int*>(arg)) -= 1;
77 }
78
OnePlusSleepForTest(void * arg)79 void OnePlusSleepForTest(void* arg)
80 {
81 ffrt_usleep(PLUS_SLEEP_TIME);
82 (*static_cast<int*>(arg)) += 1;
83 }
84
85 typedef struct {
86 ffrt_cond_t* cond;
87 int* a;
88 int* b;
89 ffrt_mutex_t* lock_;
90 int* dur;
91 int* ret;
92 } CvMutex;
93
FuncWait1(void * arg)94 void FuncWait1(void* arg)
95 {
96 CvMutex* t = static_cast<CvMutex*>(arg);
97 int ret = ffrt_mutex_lock(t->lock_);
98 if (ret != ffrt_success) {
99 *t->ret = ERR_CODE_1;
100 }
101
102 while (*t->a != 1) {
103 ret = ffrt_cond_wait(t->cond, t->lock_);
104 if (ret != ffrt_success) {
105 *t->ret = ERR_CODE_2;
106 }
107 }
108 *t->b += 1;
109 ret = ffrt_mutex_unlock(t->lock_);
110 if (ret != ffrt_success) {
111 *t->ret = ERR_CODE_3;
112 }
113 }
114
FuncWait2(void * arg)115 void FuncWait2(void* arg)
116 {
117 CvMutex* t = static_cast<CvMutex*>(arg);
118 int ret = ffrt_mutex_lock(t->lock_);
119 if (ret != ffrt_success) {
120 *t->ret = ERR_CODE_1;
121 }
122
123 while (*t->a != 1) {
124 ret = ffrt_cond_wait(t->cond, t->lock_);
125 if (ret != ffrt_success) {
126 *t->ret = ERR_CODE_2;
127 }
128 }
129 *t->b += 1;
130 ret = ffrt_mutex_unlock(t->lock_);
131 if (ret != ffrt_success) {
132 *t->ret = ERR_CODE_3;
133 }
134 }
135
FuncWaitTimeout(void * arg)136 void FuncWaitTimeout(void* arg)
137 {
138 CvMutex* t = static_cast<CvMutex*>(arg);
139 int ret = ffrt_mutex_lock(t->lock_);
140 if (ret != ffrt_success) {
141 *t->ret = ERR_CODE_1;
142 }
143 timespec ts;
144 clock_gettime(CLOCK_MONOTONIC, &ts);
145 ts.tv_sec += ERR_CODE_2;
146
147 ret = ffrt_cond_timedwait(t->cond, t->lock_, &ts);
148 *t->ret = ret;
149 if (ret == ffrt_success) {
150 *(t->a) *= ERR_CODE_3;
151 }
152 ret = ffrt_mutex_unlock(t->lock_);
153 }
154
FuncSignal(void * arg)155 void FuncSignal(void* arg)
156 {
157 ffrt_usleep(FUNC_SIGNAL_SLEEP);
158 CvMutex* t = static_cast<CvMutex*>(arg);
159 int ret = ffrt_mutex_lock(t->lock_);
160 if (ret != ffrt_success) {
161 *t->ret = ERR_CODE_1;
162 }
163 *(t->a) = 1;
164 ret = ffrt_cond_signal(t->cond);
165 if (ret != ffrt_success) {
166 *t->ret = ERR_CODE_2;
167 }
168 ret = ffrt_mutex_unlock(t->lock_);
169 if (ret != ffrt_success) {
170 *t->ret = ERR_CODE_3;
171 }
172 }
173
FuncBroadcast(void * arg)174 void FuncBroadcast(void* arg)
175 {
176 ffrt_usleep(100000);
177 CvMutex* t = static_cast<CvMutex*>(arg);
178 int ret = ffrt_mutex_lock(t->lock_);
179 if (ret != ffrt_success) {
180 *t->ret = ERR_CODE_1;
181 }
182 *(t->a) = 1;
183 ret = ffrt_cond_broadcast(t->cond);
184 if (ret != ffrt_success) {
185 *t->ret = ERR_CODE_2;
186 }
187 ret = ffrt_mutex_unlock(t->lock_);
188 if (ret != ffrt_success) {
189 *t->ret = ERR_CODE_3;
190 }
191 }
192
FuncSignalApi(void * arg)193 void FuncSignalApi(void* arg)
194 {
195 ffrt_usleep(FUNC_SIGNAL_SLEEP);
196 CvMutex* t = static_cast<CvMutex*>(arg);
197 int ret = ffrt_mutex_lock(t->lock_);
198 if (ret != ffrt_success) {
199 *t->ret = ERR_CODE_1;
200 }
201 *(t->a) = 1;
202 ret = ffrt_cond_signal(nullptr);
203 if (ret != ffrt_error_inval) {
204 *t->ret = ERR_CODE_4;
205 }
206 ret = ffrt_cond_signal(t->cond);
207 if (ret != ffrt_success) {
208 *t->ret = ERR_CODE_2;
209 }
210 ret = ffrt_mutex_unlock(t->lock_);
211 if (ret != ffrt_success) {
212 *t->ret = ERR_CODE_3;
213 }
214 }
215
FuncBroadcastApi(void * arg)216 void FuncBroadcastApi(void* arg)
217 {
218 ffrt_usleep(100000);
219 CvMutex* t = static_cast<CvMutex*>(arg);
220 int ret = ffrt_mutex_lock(t->lock_);
221 if (ret != ffrt_success) {
222 *t->ret = 1;
223 }
224 *(t->a) = 1;
225 ret = ffrt_cond_broadcast(nullptr);
226 if (ret != ffrt_error_inval) {
227 *t->ret = 4;
228 }
229 ret = ffrt_cond_broadcast(t->cond);
230 if (ret != ffrt_success) {
231 *t->ret = 2;
232 }
233 ret = ffrt_mutex_unlock(t->lock_);
234 if (ret != ffrt_success) {
235 *t->ret = 3;
236 }
237 }
238
FuncWaitApi(void * arg)239 void FuncWaitApi(void* arg)
240 {
241 CvMutex* t = static_cast<CvMutex*>(arg);
242 int ret = ffrt_mutex_lock(t->lock_);
243 if (ret != ffrt_success) {
244 *t->ret = 1;
245 }
246
247 ret = ffrt_cond_wait(nullptr, t->lock_);
248 if (ret != ffrt_error_inval) {
249 *t->ret = 4;
250 }
251 ret = ffrt_cond_wait(t->cond, nullptr);
252 if (ret != ffrt_error_inval) {
253 *t->ret = 5;
254 }
255 while (*t->a != 1) {
256 ret = ffrt_cond_wait(t->cond, t->lock_);
257 if (ret != ffrt_success) {
258 *t->ret = 2;
259 }
260 }
261 *t->b += 1;
262 ret = ffrt_mutex_unlock(t->lock_);
263 if (ret != ffrt_success) {
264 *t->ret = 3;
265 }
266 }
267
FuncWaitTimeoutApi(void * arg)268 void FuncWaitTimeoutApi(void* arg)
269 {
270 CvMutex* t = static_cast<CvMutex*>(arg);
271 int ret = ffrt_mutex_lock(t->lock_);
272 if (ret != ffrt_success) {
273 *t->ret = 1;
274 }
275 timespec ts;
276 clock_gettime(CLOCK_MONOTONIC, &ts);
277 ts.tv_sec += *t->dur;
278
279 ret = ffrt_cond_timedwait(nullptr, t->lock_, &ts);
280 if (ret != ffrt_error_inval) {
281 *t->ret = 4;
282 }
283 ret = ffrt_cond_timedwait(t->cond, nullptr, &ts);
284 if (ret != ffrt_error_inval) {
285 *t->ret = 5;
286 }
287 ret = ffrt_cond_timedwait(t->cond, t->lock_, nullptr);
288 if (ret != ffrt_error_inval) {
289 *t->ret = 6;
290 }
291 clock_gettime(CLOCK_MONOTONIC, &ts);
292 ts.tv_sec += *t->dur;
293 ret = ffrt_cond_timedwait(t->cond, t->lock_, &ts);
294 *t->ret = ret;
295 if (ret == ffrt_success) {
296 *(t->a) *= 10;
297 }
298 ret = ffrt_mutex_unlock(t->lock_);
299 if (ret != ffrt_success) {
300 *t->ret = 3;
301 }
302 }
303
304 typedef struct {
305 ffrt_function_header_t header;
306 ffrt_function_t func;
307 ffrt_function_t after_func;
308 void* arg;
309 } CFunction;
310
FfrtExecFunctionWrapper(void * t)311 static void FfrtExecFunctionWrapper(void* t)
312 {
313 CFunction* f = static_cast<CFunction*>(t);
314 if (f->func) {
315 f->func(f->arg);
316 }
317 }
318
FfrtDestroyFunctionWrapper(void * t)319 static void FfrtDestroyFunctionWrapper(void* t)
320 {
321 CFunction* f = static_cast<CFunction*>(t);
322 if (f->after_func) {
323 f->after_func(f->arg);
324 }
325 }
326
327 #define FFRT_STATIC_ASSERT(cond, msg) int x(int static_assertion_##msg[(cond) ? 1 : -1])
ffrt_create_function_wrapper(const ffrt_function_t func,const ffrt_function_t after_func,void * arg,ffrt_function_kind_t kind_t=ffrt_function_kind_general)328 static inline ffrt_function_header_t* ffrt_create_function_wrapper(const ffrt_function_t func,
329 const ffrt_function_t after_func, void* arg, ffrt_function_kind_t kind_t = ffrt_function_kind_general)
330 {
331 FFRT_STATIC_ASSERT(sizeof(CFunction) <= ffrt_auto_managed_function_storage_size,
332 size_of_function_must_be_less_than_ffrt_auto_managed_function_storage_size);
333 CFunction* f = static_cast<CFunction*>(ffrt_alloc_auto_managed_function_storage_base(kind_t));
334 f->header.exec = FfrtExecFunctionWrapper;
335 f->header.destroy = FfrtDestroyFunctionWrapper;
336 f->func = func;
337 f->after_func = after_func;
338 f->arg = arg;
339 return reinterpret_cast<ffrt_function_header_t*>(f);
340 }
341
342 template<class T>
343 struct Function {
344 ffrt_function_header_t header;
345 T closure;
346 };
347
348 template<class T>
ExecFunctionWrapper(void * t)349 void ExecFunctionWrapper(void* t)
350 {
351 auto f = reinterpret_cast<Function<std::decay_t<T>>*>(t);
352 f->closure();
353 }
354
355 template<class T>
DestroyFunctionWrapper(void * t)356 void DestroyFunctionWrapper(void* t)
357 {
358 auto f = reinterpret_cast<Function<std::decay_t<T>>*>(t);
359 f->closure = nullptr;
360 }
361
362 template<class T>
create_function_wrapper(T && func,ffrt_function_kind_t kind=ffrt_function_kind_general)363 static inline ffrt_function_header_t* create_function_wrapper(T&& func,
364 ffrt_function_kind_t kind = ffrt_function_kind_general)
365 {
366 using function_type = Function<std::decay_t<T>>;
367 auto p = ffrt_alloc_auto_managed_function_storage_base(kind);
368 auto f = new (p)function_type;
369 f->header.exec = ExecFunctionWrapper<T>;
370 f->header.destroy = DestroyFunctionWrapper<T>;
371 f->closure = std::forward<T>(func);
372 return reinterpret_cast<ffrt_function_header_t*>(f);
373 }
374
ConditionVariableTest001(napi_env env,napi_callback_info info)375 static napi_value ConditionVariableTest001(napi_env env, napi_callback_info info)
376 {
377 int resultEnd = 0;
378 //验证ffrt_cond_signal唤醒一个wait功能是否正确
379 ffrt_cond_t cond;
380 int ret = ffrt_cond_init(&cond, nullptr);
381 if (ret != ffrt_success) {
382 resultEnd = 7;
383 }
384
385 int a = 0;
386 int b = 0;
387 ffrt_mutex_t lock_;
388 CvMutex t = {&cond, &a, &b, &lock_, nullptr, nullptr};
389 ret = ffrt_mutex_init(&lock_, nullptr);
390 if (ret != ffrt_success) {
391 resultEnd = 8;
392 }
393
394 std::function<void()>&& FfrtFunc1 = [&t]() { FuncWait1(static_cast<void*>(&t)); };
395 ffrt_function_header_t* ffrt_func1 = create_function_wrapper((FfrtFunc1));
396 ffrt_submit_base(ffrt_func1, nullptr, nullptr, nullptr);
397 std::function<void()>&& FfrtFunc2 = [&t]() { FuncSignal(static_cast<void*>(&t)); };
398 ffrt_function_header_t* ffrt_func2 = create_function_wrapper((FfrtFunc2));
399 ffrt_submit_base(ffrt_func2, nullptr, nullptr, nullptr);
400 ffrt_wait();
401 if (*(t.b) != 1) {
402 resultEnd = 9;
403 }
404 if (t.ret != nullptr) {
405 resultEnd = *(t.ret);
406 }
407 ffrt_cond_destroy(&cond);
408 ffrt_mutex_destroy(&lock_);
409 napi_value flag = nullptr;
410 napi_create_double(env, resultEnd, &flag);
411 return flag;
412 }
413
ConditionVariableTest002(napi_env env,napi_callback_info info)414 static napi_value ConditionVariableTest002(napi_env env, napi_callback_info info)
415 {
416 int resultEnd = 0;
417 // 验证ffrt_cond_broadcast唤醒一个wait功能是否正确
418 ffrt_cond_t cond;
419 int ret = ffrt_cond_init(&cond, nullptr);
420 if (ret != ffrt_success) {
421 resultEnd = 7;
422 }
423
424 int a = 0;
425 int b = 0;
426 ffrt_mutex_t lock_;
427 CvMutex t = {&cond, &a, &b, &lock_, nullptr, nullptr};
428 ret = ffrt_mutex_init(&lock_, nullptr);
429 if (ret != ffrt_success) {
430 resultEnd = 8;
431 }
432
433 std::function<void()>&& FfrtFunc1 = [&t]() { FuncWait1(static_cast<void*>(&t)); };
434 ffrt_function_header_t* ffrt_func1 = create_function_wrapper((FfrtFunc1));
435 ffrt_submit_base(ffrt_func1, nullptr, nullptr, nullptr);
436 std::function<void()>&& FfrtFunc3 = [&t]() { FuncBroadcast(static_cast<void*>(&t)); };
437 ffrt_function_header_t* ffrt_func3 = create_function_wrapper((FfrtFunc3));
438 ffrt_submit_base(ffrt_func3, nullptr, nullptr, nullptr);
439 ffrt_wait();
440 if (*(t.b) != 1) {
441 resultEnd = 9;
442 }
443 if (t.ret != nullptr) {
444 resultEnd = *(t.ret);
445 }
446 ffrt_cond_destroy(&cond);
447 ffrt_mutex_destroy(&lock_);
448 napi_value flag = nullptr;
449 napi_create_double(env, resultEnd, &flag);
450 return flag;
451 }
452
ConditionVariableTest003(napi_env env,napi_callback_info info)453 static napi_value ConditionVariableTest003(napi_env env, napi_callback_info info)
454 {
455 int resultEnd = 0;
456 // 验证ffrt_cond_broadcast唤醒多个wait功能是否正确
457 ffrt_cond_t cond;
458 int ret = ffrt_cond_init(&cond, nullptr);
459 if (ret != ffrt_success) {
460 resultEnd = 7;
461 }
462
463 int a = 0;
464 int b = 0;
465 ffrt_mutex_t lock_;
466 CvMutex t = {&cond, &a, &b, &lock_, nullptr, nullptr};
467 ret = ffrt_mutex_init(&lock_, nullptr);
468 if (ret != ffrt_success) {
469 resultEnd = 8;
470 }
471
472 std::function<void()>&& FfrtFunc1 = [&t]() { FuncWait1(static_cast<void*>(&t)); };
473 ffrt_function_header_t* ffrt_func1 = create_function_wrapper((FfrtFunc1));
474 ffrt_submit_base(ffrt_func1, nullptr, nullptr, nullptr);
475 std::function<void()>&& FfrtFunc2 = [&t]() { FuncWait2(static_cast<void*>(&t)); };
476 ffrt_function_header_t* ffrt_func2 = create_function_wrapper((FfrtFunc2));
477 ffrt_submit_base(ffrt_func2, nullptr, nullptr, nullptr);
478 std::function<void()>&& FfrtFunc3 = [&t]() { FuncBroadcast(static_cast<void*>(&t)); };
479 ffrt_function_header_t* ffrt_func3 = create_function_wrapper((FfrtFunc3));
480 ffrt_submit_base(ffrt_func3, nullptr, nullptr, nullptr);
481 ffrt_wait();
482 if (*(t.b) != 2) {
483 resultEnd = 9;
484 }
485 if (t.ret != nullptr) {
486 resultEnd = *(t.ret);
487 }
488 ffrt_cond_destroy(&cond);
489 ffrt_mutex_destroy(&lock_);
490 napi_value flag = nullptr;
491 napi_create_double(env, resultEnd, &flag);
492 return flag;
493 }
494
ConditionVariableTest004(napi_env env,napi_callback_info info)495 static napi_value ConditionVariableTest004(napi_env env, napi_callback_info info)
496 {
497 int resultEnd = 0;
498 // 验证ffrt_cond_signal只能唤醒一个wait功能正确
499 ffrt_cond_t cond;
500 int ret = ffrt_cond_init(&cond, nullptr);
501 if (ret != ffrt_success) {
502 resultEnd = 7;
503 }
504
505 int a = 0;
506 int b = 0;
507 ffrt_mutex_t lock_;
508 CvMutex t = {&cond, &a, &b, &lock_, nullptr, nullptr};
509 ret = ffrt_mutex_init(&lock_, nullptr);
510 if (ret != ffrt_success) {
511 resultEnd = 8;
512 }
513
514 std::function<void()>&& FfrtFunc1 = [&t]() { FuncWait1(static_cast<void*>(&t)); };
515 ffrt_function_header_t* ffrt_func1 = create_function_wrapper((FfrtFunc1));
516 ffrt_submit_base(ffrt_func1, nullptr, nullptr, nullptr);
517 std::function<void()>&& FfrtFunc2 = [&t]() { FuncWait2(static_cast<void*>(&t)); };
518 ffrt_function_header_t* ffrt_func2 = create_function_wrapper((FfrtFunc2));
519 ffrt_submit_base(ffrt_func2, nullptr, nullptr, nullptr);
520 std::function<void()>&& FfrtFunc3 = [&t]() { FuncSignal(static_cast<void*>(&t)); };
521 ffrt_function_header_t* ffrt_func3 = create_function_wrapper((FfrtFunc3));
522 ffrt_task_handle_t task3 = ffrt_submit_h_base(ffrt_func3, nullptr, nullptr, nullptr);
523 const std::vector<ffrt_dependence_t> wait_deps = {{ffrt_dependence_task, task3}};
524 ffrt_deps_t wait{static_cast<uint32_t>(wait_deps.size()), wait_deps.data()};
525 ffrt_wait_deps(&wait);
526 ffrt_usleep(100000);
527 if (*(t.b) != 1) {
528 resultEnd = 10;
529 }
530
531 ffrt_func3 = create_function_wrapper((FfrtFunc3));
532 ffrt_submit_base(ffrt_func3, nullptr, nullptr, nullptr);
533 ffrt_wait();
534 if (*(t.b) != 2) {
535 resultEnd = 9;
536 }
537 if (t.ret != nullptr) {
538 resultEnd = *(t.ret);
539 }
540
541 ffrt_cond_destroy(&cond);
542 ffrt_mutex_destroy(&lock_);
543 ffrt_task_handle_destroy(task3);
544 napi_value flag = nullptr;
545 napi_create_double(env, resultEnd, &flag);
546 return flag;
547 }
548
ConditionVariableApiTest001(napi_env env,napi_callback_info info)549 static napi_value ConditionVariableApiTest001(napi_env env, napi_callback_info info)
550 {
551 int resultEnd = 0;
552 //验证ffrt_cond_init接口异常参数
553 ffrt_cond_t cond;
554 int ret = ffrt_cond_init(nullptr, nullptr);
555 if (ret != ffrt_error_inval) {
556 resultEnd = 7;
557 }
558 ffrt_condattr_t attr;
559 ret = ffrt_cond_init(&cond, &attr);
560 if (ret != ffrt_success) {
561 resultEnd = 8;
562 }
563
564 int a = 0;
565 int b = 0;
566 ffrt_mutex_t lock_;
567 CvMutex t = {&cond, &a, &b, &lock_, nullptr, nullptr};
568 ret = ffrt_mutex_init(&lock_, nullptr);
569 if (ret != ffrt_success) {
570 resultEnd = 9;
571 }
572
573 std::function<void()>&& FfrtFunc1 = [&t]() { FuncWait1(static_cast<void*>(&t)); };
574 ffrt_function_header_t* ffrt_func1 = create_function_wrapper((FfrtFunc1));
575 ffrt_submit_base(ffrt_func1, nullptr, nullptr, nullptr);
576 std::function<void()>&& FfrtFunc2 = [&t]() { FuncSignal(static_cast<void*>(&t)); };
577 ffrt_function_header_t* ffrt_func2 = create_function_wrapper((FfrtFunc2));
578 ffrt_submit_base(ffrt_func2, nullptr, nullptr, nullptr);
579 ffrt_wait();
580 if (*(t.b) != 1) {
581 resultEnd = 10;
582 }
583 if (t.ret != nullptr) {
584 resultEnd = *(t.ret);
585 }
586 ffrt_cond_destroy(&cond);
587 ffrt_mutex_destroy(&lock_);
588 napi_value flag = nullptr;
589 napi_create_double(env, resultEnd, &flag);
590 return flag;
591 }
592
ConditionVariableApiTest002(napi_env env,napi_callback_info info)593 static napi_value ConditionVariableApiTest002(napi_env env, napi_callback_info info)
594 {
595 int resultEnd = 0;
596 //验证ffrt_cond_signal接口异常参数
597 ffrt_cond_t cond;
598 int ret = ffrt_cond_init(&cond, nullptr);
599 if (ret != ffrt_success) {
600 resultEnd = 7;
601 }
602
603 int a = 0;
604 int b = 0;
605 ffrt_mutex_t lock_;
606 CvMutex t = {&cond, &a, &b, &lock_, nullptr, nullptr};
607 ret = ffrt_mutex_init(&lock_, nullptr);
608 if (ret != ffrt_success) {
609 resultEnd = 8;
610 }
611
612 std::function<void()>&& FfrtFunc1 = [&t]() { FuncWait1(static_cast<void*>(&t)); };
613 ffrt_function_header_t* ffrt_func1 = create_function_wrapper((FfrtFunc1));
614 ffrt_submit_base(ffrt_func1, nullptr, nullptr, nullptr);
615 std::function<void()>&& FfrtFunc2 = [&t]() { FuncSignalApi(static_cast<void*>(&t)); };
616 ffrt_function_header_t* ffrt_func2 = create_function_wrapper((FfrtFunc2));
617 ffrt_submit_base(ffrt_func2, nullptr, nullptr, nullptr);
618 ffrt_wait();
619 if (*(t.b) != 1) {
620 resultEnd = 10;
621 }
622 if (t.ret != nullptr) {
623 resultEnd = *(t.ret);
624 }
625 ffrt_cond_destroy(&cond);
626 ffrt_mutex_destroy(&lock_);
627 napi_value flag = nullptr;
628 napi_create_double(env, resultEnd, &flag);
629 return flag;
630 }
631
ConditionVariableApiTest003(napi_env env,napi_callback_info info)632 static napi_value ConditionVariableApiTest003(napi_env env, napi_callback_info info)
633 {
634 int resultEnd = 0;
635 // 验证ffrt_cond_broadcast接口异常参数
636 ffrt_cond_t cond;
637 int ret = ffrt_cond_init(&cond, nullptr);
638 if (ret != ffrt_success) {
639 resultEnd = 7;
640 }
641
642 int a = 0;
643 int b = 0;
644 ffrt_mutex_t lock_;
645 CvMutex t = {&cond, &a, &b, &lock_, nullptr, nullptr};
646 ret = ffrt_mutex_init(&lock_, nullptr);
647 if (ret != ffrt_success) {
648 resultEnd = 8;
649 }
650
651 std::function<void()>&& FfrtFunc1 = [&t]() { FuncWait1(static_cast<void*>(&t)); };
652 ffrt_function_header_t* ffrt_func1 = create_function_wrapper((FfrtFunc1));
653 ffrt_submit_base(ffrt_func1, nullptr, nullptr, nullptr);
654 std::function<void()>&& FfrtFunc3 = [&t]() { FuncBroadcastApi(static_cast<void*>(&t)); };
655 ffrt_function_header_t* ffrt_func3 = create_function_wrapper((FfrtFunc3));
656 ffrt_submit_base(ffrt_func3, nullptr, nullptr, nullptr);
657 ffrt_wait();
658 if (*(t.b) != 1) {
659 resultEnd = 10;
660 }
661 if (t.ret != nullptr) {
662 resultEnd = *(t.ret);
663 }
664 ffrt_cond_destroy(&cond);
665 ffrt_mutex_destroy(&lock_);
666 napi_value flag = nullptr;
667 napi_create_double(env, resultEnd, &flag);
668 return flag;
669 }
670
ConditionVariableApiTest004(napi_env env,napi_callback_info info)671 static napi_value ConditionVariableApiTest004(napi_env env, napi_callback_info info)
672 {
673 int resultEnd = 0;
674 //验证ffrt_cond_wait接口异常参数
675 ffrt_cond_t cond;
676 int ret = ffrt_cond_init(&cond, nullptr);
677 if (ret != ffrt_success) {
678 resultEnd = 7;
679 }
680
681 int a = 0;
682 int b = 0;
683 ffrt_mutex_t lock_;
684 CvMutex t = {&cond, &a, &b, &lock_, nullptr, nullptr};
685 ret = ffrt_mutex_init(&lock_, nullptr);
686 if (ret != ffrt_success) {
687 resultEnd = 8;
688 }
689
690 std::function<void()>&& FfrtFunc1 = [&t]() { FuncWaitApi(static_cast<void*>(&t)); };
691 ffrt_function_header_t* ffrt_func1 = create_function_wrapper((FfrtFunc1));
692 ffrt_submit_base(ffrt_func1, nullptr, nullptr, nullptr);
693 std::function<void()>&& FfrtFunc2 = [&t]() { FuncSignal(static_cast<void*>(&t)); };
694 ffrt_function_header_t* ffrt_func2 = create_function_wrapper((FfrtFunc2));
695 ffrt_submit_base(ffrt_func2, nullptr, nullptr, nullptr);
696 ffrt_wait();
697 if (*(t.b) != 1) {
698 resultEnd = 10;
699 }
700 if (t.ret != nullptr) {
701 resultEnd = *(t.ret);
702 }
703 ffrt_cond_destroy(&cond);
704 ffrt_mutex_destroy(&lock_);
705 napi_value flag = nullptr;
706 napi_create_double(env, resultEnd, &flag);
707 return flag;
708 }
709
DelayCTest001(napi_env env,napi_callback_info info)710 static napi_value DelayCTest001(napi_env env, napi_callback_info info)
711 {
712 int result = 0;
713 // 验证delay的set和get c接口
714 int a = 0;
715 ffrt_task_attr_t task_attr;
716 (void)ffrt_task_attr_init(&task_attr);
717 ffrt_task_attr_set_delay(&task_attr, 5000);
718
719 double t;
720 auto start = std::chrono::high_resolution_clock::now();
721 std::function<void()>&& OnePlusFunc = [&a]() { a += 1; };
722 ffrt_task_handle_t task = ffrt_submit_h_base(create_function_wrapper(OnePlusFunc), {}, {}, &task_attr);
723 const std::vector<ffrt_dependence_t> wait_deps = {{ffrt_dependence_task, task}};
724 ffrt_deps_t wait{static_cast<uint32_t>(wait_deps.size()), wait_deps.data()};
725 ffrt_wait_deps(&wait);
726 auto end = std::chrono::high_resolution_clock::now();
727 std::chrono::duration<double, std::micro> elapsed = end-start;
728 t = elapsed.count();
729 if (a != 1) {
730 result = 1;
731 }
732 if (t <= 5000 || t >= 20000) {
733 result = 2;
734 }
735
736 uint64_t delay = ffrt_task_attr_get_delay(&task_attr);
737 if (delay != 5000) {
738 result = 3;
739 }
740 ffrt_task_attr_destroy(&task_attr);
741 ffrt_task_handle_destroy(task);
742 napi_value flag = nullptr;
743 napi_create_double(env, result, &flag);
744 return flag;
745 }
746
FfrtYieldC0001(napi_env env,napi_callback_info info)747 static napi_value FfrtYieldC0001(napi_env env, napi_callback_info info)
748 {
749 int result = 0;
750 int x = 0;
751 pthread_mutex_t lock;
752 int ret = (pthread_mutex_init(&lock, nullptr));
753 if (ret != 0) {
754 result = 1;
755 }
756 std::function<void()>&& func1 = [&]() {
757 while (true) {
758 pthread_mutex_lock(&lock);
759 if (x == 1) {
760 pthread_mutex_unlock(&lock);
761 return;
762 } else {
763 pthread_mutex_unlock(&lock);
764 usleep(1000);
765 ffrt_yield();
766 }
767 }
768 };
769 std::function<void()>&& func2 = [&]() {
770 pthread_mutex_lock(&lock);
771 x++;
772 pthread_mutex_unlock(&lock);
773 };
774 ffrt_task_handle_t task = ffrt_submit_h_base(create_function_wrapper(func1), nullptr, nullptr, nullptr);
775 for (int i = 0; i < 20; i++) {
776 ffrt_submit_base(create_function_wrapper(func1), nullptr, nullptr, nullptr);
777 }
778 ffrt_submit_base(create_function_wrapper(func2), nullptr, nullptr, nullptr);
779 const std::vector<ffrt_dependence_t> wait_deps = {{ffrt_dependence_task, task}};
780 ffrt_deps_t wait{static_cast<uint32_t>(wait_deps.size()), wait_deps.data()};
781 ffrt_wait_deps(&wait);
782 if (x != 1) {
783 result = 7;
784 }
785 ffrt_wait();
786 if (x != 1) {
787 result = 8;
788 }
789 ffrt_task_handle_destroy(task);
790 pthread_mutex_destroy(&lock);
791 napi_value flag = nullptr;
792 napi_create_double(env, result, &flag);
793 return flag;
794 }
795
RecursiveMutexAbnormalParamTest001(napi_env env,napi_callback_info info)796 static napi_value RecursiveMutexAbnormalParamTest001(napi_env env, napi_callback_info info)
797 {
798 int result = 0;
799 int type = 0;
800 ffrt_mutexattr_t attr;
801 ffrt_mutex_t mtx;
802 int ret = ffrt_mutexattr_init(&attr);
803 if (ret != ffrt_success) {
804 result = ERR_CODE_1;
805 }
806 ret = ffrt_mutexattr_settype(&attr, ffrt_mutex_recursive);
807 if (ret != ffrt_success) {
808 result = ERR_CODE_2;
809 }
810 ret = ffrt_mutexattr_gettype(&attr, &type);
811 if (ret != ffrt_success) {
812 result = ERR_CODE_3;
813 }
814 ret = ffrt_mutex_init(&mtx, &attr);
815 if (ret != ffrt_success) {
816 result = ERR_CODE_4;
817 }
818 ret = ffrt_mutexattr_destroy(&attr);
819 if (ret != ffrt_success) {
820 result = ERR_CODE_5;
821 }
822 ret = ffrt_mutex_destroy(&mtx);
823 if (ret != ffrt_success) {
824 result = ERR_CODE_6;
825 }
826 napi_value flag = nullptr;
827 napi_create_double(env, result, &flag);
828 return flag;
829 }
830
RecursiveMutexAbnormalInvalidParamTest001(napi_env env,napi_callback_info info)831 static napi_value RecursiveMutexAbnormalInvalidParamTest001(napi_env env, napi_callback_info info)
832 {
833 int result = 0;
834 ffrt_mutexattr_t attr;
835 int ret = ffrt_mutexattr_init(NULL);
836 if (ret != ffrt_error_inval) {
837 result = ERR_CODE_1;
838 }
839 ret = ffrt_mutexattr_settype(NULL, ffrt_mutex_recursive);
840 if (ret != ffrt_error_inval) {
841 result = ERR_CODE_2;
842 }
843 ret = ffrt_mutexattr_settype(&attr, -1);
844 if (ret != ffrt_error_inval) {
845 result = ERR_CODE_3;
846 }
847 ret = ffrt_mutexattr_gettype(NULL, NULL);
848 if (ret != ffrt_error_inval) {
849 result = ERR_CODE_4;
850 }
851 ret = ffrt_mutexattr_destroy(NULL);
852 if (ret != ffrt_error_inval) {
853 result = ERR_CODE_5;
854 }
855 napi_value flag = nullptr;
856 napi_create_double(env, result, &flag);
857 return flag;
858 }
859
MutexAbnormalParamTest001(napi_env env,napi_callback_info info)860 static napi_value MutexAbnormalParamTest001(napi_env env, napi_callback_info info)
861 {
862 int result = 0;
863 ffrt_mutex_t mtx;
864 ffrt_mutexattr_t attr;
865 int ret = ffrt_mutex_init(NULL, &attr);
866 if (ret != ffrt_error_inval) {
867 result = 1;
868 }
869 ffrt_mutexattr_init(&attr);
870 ret = ffrt_mutex_init(&mtx, &attr);
871 if (ret != ffrt_success) {
872 result = 2;
873 }
874 ret = ffrt_mutex_init(&mtx, nullptr);
875 if (ret != ffrt_success) {
876 result = 3;
877 }
878 ret = ffrt_mutex_destroy(NULL);
879 if (ret != ffrt_error_inval) {
880 result = 4;
881 }
882 ret = ffrt_mutex_destroy(&mtx);
883 if (ret != ffrt_success) {
884 result = 5;
885 }
886 napi_value flag = nullptr;
887 napi_create_double(env, result, &flag);
888 return flag;
889 }
890
MutexAbnormalParamTest002(napi_env env,napi_callback_info info)891 static napi_value MutexAbnormalParamTest002(napi_env env, napi_callback_info info)
892 {
893 int result = 0;
894 ffrt_mutex_t mtx;
895 int ret = ffrt_mutex_init(&mtx, nullptr);
896 if (ret != ffrt_success) {
897 result = 1;
898 }
899 std::function<void()>&& func = [&]() {
900 ret = ffrt_mutex_lock(NULL);
901 if (ret != ffrt_error_inval) {
902 result = 2;
903 }
904 ret = ffrt_mutex_lock(&mtx);
905 ret = ffrt_mutex_unlock(NULL);
906 if (ret != ffrt_error_inval) {
907 result = 3;
908 }
909 ret = ffrt_mutex_trylock(NULL);
910 if (ret != ffrt_error_inval) {
911 result = 4;
912 }
913 ret = ffrt_mutex_trylock(&mtx); // 没抢到锁
914 if (ret != ffrt_error_busy) {
915 result = 5;
916 }
917 ret = ffrt_mutex_destroy(NULL);
918 if (ret != ffrt_error_inval) {
919 result = 6;
920 }
921 ret = ffrt_mutex_unlock(&mtx);
922 if (ret != ffrt_success) {
923 result = 7;
924 }
925 };
926 ffrt_submit_base(create_function_wrapper(func), nullptr, nullptr, nullptr);
927 ffrt_wait();
928 ret = ffrt_mutex_destroy(&mtx);
929 if (ret != ffrt_success) {
930 result = 8;
931 }
932 napi_value flag = nullptr;
933 napi_create_double(env, result, &flag);
934 return flag;
935 }
936
MutexTest006(napi_env env,napi_callback_info info)937 static napi_value MutexTest006(napi_env env, napi_callback_info info)
938 {
939 int resultEnd = 0;
940 int x = 0;
941 ffrt_mutex_t lock;
942 int ret = ffrt_mutex_init(&lock, nullptr);
943 if (ret != ffrt_success) {
944 resultEnd = 1;
945 }
946 std::function<void()>&& func1 = [&]() {
947 ffrt_usleep(50 * 1000);
948 int res = ffrt_mutex_lock(&lock);
949 if (res != ffrt_success) {
950 resultEnd = 2;
951 }
952 x = x * 2;
953 res = ffrt_mutex_unlock(&lock);
954 if (res != ffrt_success) {
955 resultEnd = 3;
956 }
957 };
958 std::function<void()>&& func2 = [&]() {
959 int res = ffrt_mutex_lock(&lock);
960 if (res != ffrt_success) {
961 resultEnd = 4;
962 }
963 ffrt_usleep(100 * 1000);
964 x++;
965 res = ffrt_mutex_unlock(&lock);
966 if (res != ffrt_success) {
967 resultEnd = 5;
968 }
969 };
970 ffrt_submit_base(create_function_wrapper(func1), nullptr, nullptr, nullptr);
971 ffrt_submit_base(create_function_wrapper(func2), nullptr, nullptr, nullptr);
972 ffrt_wait();
973 if (x != 2) {
974 resultEnd = 6;
975 }
976 ffrt_mutex_destroy(&lock);
977 napi_value flag = nullptr;
978 napi_create_double(env, resultEnd, &flag);
979 return flag;
980 }
981
MutexTest007(napi_env env,napi_callback_info info)982 static napi_value MutexTest007(napi_env env, napi_callback_info info)
983 {
984 int resultEnd = 0;
985 int x = 0;
986 ffrt_mutex_t lock;
987 int ret = ffrt_mutex_init(&lock, nullptr);
988 if (ret != ffrt_success) {
989 resultEnd = 1;
990 }
991 std::function<void()>&& func1 = [&]() {
992 ffrt_usleep(50 * 1000);
993 int res = ffrt_mutex_lock(&lock);
994 if (res != ffrt_success) {
995 resultEnd = 2;
996 }
997 x = x * 2;
998 res = ffrt_mutex_unlock(&lock);
999 if (res != ffrt_success) {
1000 resultEnd = 3;
1001 }
1002 };
1003 std::function<void()>&& func2 = [&]() {
1004 int res = ffrt_mutex_lock(&lock);
1005 if (res != ffrt_success) {
1006 resultEnd = 4;
1007 }
1008 x++;
1009 res = ffrt_mutex_unlock(&lock);
1010 if (res != ffrt_success) {
1011 resultEnd = 5;
1012 }
1013 };
1014 ffrt_submit_base(create_function_wrapper(func1), nullptr, nullptr, nullptr);
1015 ffrt_submit_base(create_function_wrapper(func2), nullptr, nullptr, nullptr);
1016 ffrt_wait();
1017 ffrt_mutex_destroy(&lock);
1018 napi_value flag = nullptr;
1019 napi_create_double(env, resultEnd, &flag);
1020 return flag;
1021 }
1022
MutexTest008(napi_env env,napi_callback_info info)1023 static napi_value MutexTest008(napi_env env, napi_callback_info info)
1024 {
1025 int resultEnd = 0;
1026 int x = 0;
1027 int y = 0;
1028 ffrt_mutex_t lock;
1029 int ret = ffrt_mutex_init(&lock, nullptr);
1030 if (ret != ffrt_success) {
1031 resultEnd = 1;
1032 }
1033 std::function<void()>&& func1 = [&]() {
1034 usleep(30 * 1000);
1035 while (ffrt_mutex_trylock(&lock)) {
1036 y++;
1037 usleep(20 * 1000);
1038 }
1039 x = x * 2;
1040 int res = ffrt_mutex_unlock(&lock);
1041 if (res != ffrt_success) {
1042 resultEnd = 2;
1043 }
1044 return;
1045 };
1046 std::function<void()>&& func2 = [&]() {
1047 int res = ffrt_mutex_lock(&lock);
1048 if (res != ffrt_success) {
1049 resultEnd = 3;
1050 }
1051 usleep(100 * 1000);
1052 x++;
1053 res = ffrt_mutex_unlock(&lock);
1054 if (res != ffrt_success) {
1055 resultEnd = 4;
1056 }
1057 };
1058 ffrt_submit_base(create_function_wrapper(func1), nullptr, nullptr, nullptr);
1059 ffrt_submit_base(create_function_wrapper(func2), nullptr, nullptr, nullptr);
1060 ffrt_wait();
1061 if (x != 2) {
1062 resultEnd = 5;
1063 }
1064 if (y == 0) {
1065 resultEnd = 6;
1066 }
1067 ffrt_mutex_destroy(&lock);
1068 napi_value flag = nullptr;
1069 napi_create_double(env, resultEnd, &flag);
1070 return flag;
1071 }
1072
SharedMutexTest001(napi_env env,napi_callback_info info)1073 static napi_value SharedMutexTest001(napi_env env, napi_callback_info info)
1074 {
1075 int resultEnd = 0;
1076 ffrt_rwlock_t rwlock;
1077 int x = 0;
1078 int ret = ffrt_rwlock_init(&rwlock, nullptr);
1079 if (ret != ffrt_success) {
1080 resultEnd = 1;
1081 }
1082 OH_LOG_Print(LOG_APP, LOG_INFO, 1, "FFRT SHARED_MUTEX", "fun0 resultEnd is %{public}d", resultEnd);
1083
1084 std::function<void()>&& func1 = [&]() {
1085 OH_LOG_Print(LOG_APP, LOG_INFO, 1, "FFRT SHARED_MUTEX", "fun1 start resultEnd is %{public}d", resultEnd);
1086 int res = ffrt_rwlock_wrlock(&rwlock);
1087 if (res != ffrt_success) {
1088 resultEnd = 2;
1089 }
1090 usleep(10 * 1000);
1091 x++;
1092 res = ffrt_rwlock_unlock(&rwlock);
1093 if (res != ffrt_success) {
1094 resultEnd = 3;
1095 }
1096 OH_LOG_Print(LOG_APP, LOG_INFO, 1, "FFRT SHARED_MUTEX", "fun1 end resultEnd is %{public}d", resultEnd);
1097 };
1098
1099 std::function<void()>&& func2 = [&]() {
1100 OH_LOG_Print(LOG_APP, LOG_INFO, 1, "FFRT SHARED_MUTEX", "fun2 start resultEnd is %{public}d", resultEnd);
1101 usleep(2 * 1000);
1102 int res1 = ffrt_rwlock_rdlock(&rwlock);
1103 if (res1 != ffrt_success) {
1104 resultEnd = 4;
1105 }
1106 res1 = ffrt_rwlock_unlock(&rwlock);
1107 if (res1 != ffrt_success) {
1108 resultEnd = 5;
1109 }
1110 OH_LOG_Print(LOG_APP, LOG_INFO, 1, "FFRT SHARED_MUTEX", "fun2 end resultEnd is %{public}d", resultEnd);
1111 };
1112
1113 std::function<void()>&& func3 = [&]() {
1114 OH_LOG_Print(LOG_APP, LOG_INFO, 1, "FFRT SHARED_MUTEX", "fun3 start resultEnd is %{public}d", resultEnd);
1115 usleep(2 * 1000);
1116 int res2 = ffrt_rwlock_trywrlock(&rwlock);
1117 if (res2 == ffrt_success) {
1118 x++;
1119 ffrt_rwlock_unlock(&rwlock);
1120 }
1121 };
1122
1123 std::function<void()>&& func4 = [&]() {
1124 OH_LOG_Print(LOG_APP, LOG_INFO, 1, "FFRT SHARED_MUTEX", "fun4 start resultEnd is %{public}d", resultEnd);
1125 usleep(2 * 1000);
1126 int res3 = ffrt_rwlock_tryrdlock(&rwlock);
1127 if (res3 == ffrt_success) {
1128 ffrt_rwlock_unlock(&rwlock);
1129 }
1130 };
1131 ffrt_submit_base(create_function_wrapper(func1), nullptr, nullptr, nullptr);
1132 ffrt_submit_base(create_function_wrapper(func2), nullptr, nullptr, nullptr);
1133 ffrt_submit_base(create_function_wrapper(func3), nullptr, nullptr, nullptr);
1134 ffrt_submit_base(create_function_wrapper(func4), nullptr, nullptr, nullptr);
1135 ffrt_wait();
1136 ffrt_rwlock_destroy(&rwlock);
1137 if (x != 1) {
1138 resultEnd = 6;
1139 }
1140 OH_LOG_Print(LOG_APP, LOG_INFO, 1, "FFRT SHARED_MUTEX", "wait after resultEnd is %{public}d", resultEnd);
1141 napi_value flag = nullptr;
1142 napi_create_double(env, resultEnd, &flag);
1143 return flag;
1144 }
1145
QueueApiTest001(napi_env env,napi_callback_info info)1146 static napi_value QueueApiTest001(napi_env env, napi_callback_info info)
1147 {
1148 int result = 0;
1149 // ffrt_queue_create接口type为异常值
1150 ffrt_queue_attr_t queue_attr;
1151 (void)ffrt_queue_attr_init(&queue_attr);
1152 ffrt_queue_t queue_handle = ffrt_queue_create(ffrt_queue_max, "test_queue", &queue_attr);
1153 if (queue_handle != nullptr) {
1154 result = 3;
1155 }
1156
1157 // 销毁队列
1158 ffrt_queue_attr_destroy(&queue_attr);
1159 ffrt_queue_destroy(queue_handle);
1160 napi_value flag = nullptr;
1161 napi_create_double(env, result, &flag);
1162 return flag;
1163 }
1164
QueueApiTest002(napi_env env,napi_callback_info info)1165 static napi_value QueueApiTest002(napi_env env, napi_callback_info info)
1166 {
1167 int result = 0;
1168 // ffrt_queue_create接口name为空
1169 ffrt_queue_attr_t queue_attr;
1170 (void)ffrt_queue_attr_init(&queue_attr);
1171 ffrt_queue_t queue_handle = ffrt_queue_create(ffrt_queue_serial, nullptr, &queue_attr);
1172 if (queue_handle == nullptr) {
1173 result = 3;
1174 }
1175
1176 int a = 0;
1177 ffrt_queue_submit(queue_handle, ffrt_create_function_wrapper(OnePlusForTest, nullptr, &a,
1178 ffrt_function_kind_queue), nullptr);
1179
1180 usleep(SLEEP_TIME);
1181 if (a != 1) {
1182 result = 1;
1183 }
1184
1185 // 销毁队列
1186 ffrt_queue_attr_destroy(&queue_attr);
1187 ffrt_queue_destroy(queue_handle);
1188 napi_value flag = nullptr;
1189 napi_create_double(env, result, &flag);
1190 return flag;
1191 }
1192
QueueApiTest003(napi_env env,napi_callback_info info)1193 static napi_value QueueApiTest003(napi_env env, napi_callback_info info)
1194 {
1195 int result = 0;
1196 ffrt_queue_t queue_handle = ffrt_queue_create(ffrt_queue_serial, "test_queue", nullptr);
1197 if (queue_handle == nullptr) {
1198 result = 3;
1199 }
1200 napi_value flag = nullptr;
1201 napi_create_double(env, result, &flag);
1202 return flag;
1203 }
1204
QueueApiTest004(napi_env env,napi_callback_info info)1205 static napi_value QueueApiTest004(napi_env env, napi_callback_info info)
1206 {
1207 int result = 0;
1208 (void)ffrt_queue_attr_init(nullptr);
1209 napi_value flag = nullptr;
1210 napi_create_double(env, result, &flag);
1211 return flag;
1212 }
1213
QueueApiTest005(napi_env env,napi_callback_info info)1214 static napi_value QueueApiTest005(napi_env env, napi_callback_info info)
1215 {
1216 int result = 0;
1217 // ffrt_queue_attr_destroy接口attr为异常值
1218 ffrt_queue_attr_t queue_attr;
1219 (void)ffrt_queue_attr_init(&queue_attr);
1220 ffrt_queue_t queue_handle = ffrt_queue_create(ffrt_queue_serial, "test_queue", &queue_attr);
1221 if (queue_handle == nullptr) {
1222 result = 3;
1223 }
1224
1225 int a = 0;
1226 ffrt_task_handle_t handle = ffrt_queue_submit_h(queue_handle, ffrt_create_function_wrapper(OnePlusForTest,
1227 nullptr, &a, ffrt_function_kind_queue), nullptr);
1228 ffrt_queue_wait(handle);
1229 if (a != 1) {
1230 result = 1;
1231 }
1232 ffrt_task_handle_destroy(handle);
1233 // 销毁队列
1234 ffrt_queue_attr_destroy(nullptr);
1235 ffrt_queue_attr_destroy(&queue_attr);
1236 ffrt_queue_destroy(queue_handle);
1237 napi_value flag = nullptr;
1238 napi_create_double(env, result, &flag);
1239 return flag;
1240 }
1241
QueueApiTest006(napi_env env,napi_callback_info info)1242 static napi_value QueueApiTest006(napi_env env, napi_callback_info info)
1243 {
1244 int result = 0;
1245 // ffrt_queue_attr_set_qos接口attr为异常值
1246 ffrt_queue_attr_t queue_attr;
1247 (void)ffrt_queue_attr_init(&queue_attr);
1248 ffrt_queue_attr_set_qos(nullptr, static_cast<ffrt_qos_t>(ffrt_qos_utility));
1249 ffrt_qos_t qos = ffrt_queue_attr_get_qos(&queue_attr);
1250 if (qos != static_cast<int>(ffrt_qos_default)) {
1251 result = 2;
1252 }
1253 ffrt_queue_t queue_handle = ffrt_queue_create(ffrt_queue_serial, "test_queue", &queue_attr);
1254 if (queue_handle == nullptr) {
1255 result = 3;
1256 }
1257
1258 int a = 0;
1259 ffrt_task_handle_t handle = ffrt_queue_submit_h(queue_handle, ffrt_create_function_wrapper(OnePlusForTest,
1260 nullptr, &a, ffrt_function_kind_queue), nullptr);
1261 ffrt_queue_wait(handle);
1262 if (a != 1) {
1263 result = 1;
1264 }
1265 ffrt_task_handle_destroy(handle);
1266
1267 // 销毁队列
1268 ffrt_queue_attr_destroy(&queue_attr);
1269 ffrt_queue_destroy(queue_handle);
1270 napi_value flag = nullptr;
1271 napi_create_double(env, result, &flag);
1272 return flag;
1273 }
1274
QueueApiTest007(napi_env env,napi_callback_info info)1275 static napi_value QueueApiTest007(napi_env env, napi_callback_info info)
1276 {
1277 int result = 0;
1278 // ffrt_queue_attr_set_qos接口qos为异常值
1279 // 设置qos为-1
1280 ffrt_queue_attr_t queue_attr;
1281 ffrt_queue_t queue_handle;
1282 (void)ffrt_queue_attr_init(&queue_attr);
1283 ffrt_queue_attr_set_qos(&queue_attr, static_cast<ffrt_qos_t>(ffrt_qos_inherit));
1284 ffrt_qos_t ret = ffrt_queue_attr_get_qos(&queue_attr);
1285 if (ret != static_cast<int>(ffrt_qos_inherit)) {
1286 result = 1;
1287 }
1288 queue_handle = ffrt_queue_create(ffrt_queue_serial, "test_queue", &queue_attr);
1289
1290 int a = 0;
1291 ffrt_task_handle_t handle = ffrt_queue_submit_h(queue_handle,
1292 ffrt_create_function_wrapper(OnePlusForTest, nullptr, &a, ffrt_function_kind_queue), nullptr);
1293
1294 ffrt_queue_wait(handle);
1295 if (a != 1) {
1296 result = 2;
1297 }
1298
1299 ffrt_task_handle_destroy(handle);
1300 ffrt_queue_destroy(queue_handle);
1301
1302 // 设置qos为-2
1303 ffrt_queue_attr_set_qos(&queue_attr, static_cast<ffrt_qos_t>(-2));
1304 ret = ffrt_queue_attr_get_qos(&queue_attr);
1305 if (ret != static_cast<int>(ffrt_qos_inherit)) {
1306 result = 1;
1307 }
1308 queue_handle = ffrt_queue_create(ffrt_queue_serial, "test_queue", &queue_attr);
1309
1310 handle = ffrt_queue_submit_h(queue_handle,
1311 ffrt_create_function_wrapper(OnePlusForTest, nullptr, &a, ffrt_function_kind_queue), nullptr);
1312
1313 ffrt_queue_wait(handle);
1314 if (a != 2) {
1315 result = 3;
1316 }
1317
1318 ffrt_queue_attr_destroy(&queue_attr);
1319 ffrt_task_handle_destroy(handle);
1320 ffrt_queue_destroy(queue_handle);
1321 napi_value flag = nullptr;
1322 napi_create_double(env, result, &flag);
1323 return flag;
1324 }
1325
QueueApiTest008(napi_env env,napi_callback_info info)1326 static napi_value QueueApiTest008(napi_env env, napi_callback_info info)
1327 {
1328 int result = 0;
1329 // ffrt_queue_attr_get_qos接口attr为异常值
1330 ffrt_queue_attr_t queue_attr;
1331 (void)ffrt_queue_attr_init(&queue_attr);
1332 ffrt_queue_attr_set_qos(&queue_attr, static_cast<ffrt_qos_t>(ffrt_qos_utility));
1333 ffrt_qos_t ret = ffrt_queue_attr_get_qos(nullptr);
1334 if (ret != static_cast<int>(ffrt_qos_default)) {
1335 result = 2;
1336 }
1337 ret = ffrt_queue_attr_get_qos(&queue_attr);
1338 if (ret != static_cast<int>(ffrt_qos_utility)) {
1339 result = 1;
1340 }
1341 ffrt_queue_t queue_handle = ffrt_queue_create(ffrt_queue_serial, "test_queue", &queue_attr);
1342 if (queue_handle == nullptr) {
1343 result = 3;
1344 }
1345
1346 int a = 0;
1347 ffrt_task_handle_t handle = ffrt_queue_submit_h(queue_handle, ffrt_create_function_wrapper(OnePlusForTest,
1348 nullptr, &a, ffrt_function_kind_queue), nullptr);
1349 ffrt_queue_wait(handle);
1350 if (a != 1) {
1351 result = 1;
1352 }
1353 ffrt_task_handle_destroy(handle);
1354
1355 // 销毁队列
1356 ffrt_queue_attr_destroy(&queue_attr);
1357 ffrt_queue_destroy(queue_handle);
1358 napi_value flag = nullptr;
1359 napi_create_double(env, result, &flag);
1360 return flag;
1361 }
1362
QueueApiTest009(napi_env env,napi_callback_info info)1363 static napi_value QueueApiTest009(napi_env env, napi_callback_info info)
1364 {
1365 int result = 0;
1366 // ffrt_queue_destroy接口queue为异常值
1367 ffrt_queue_attr_t queue_attr;
1368 (void)ffrt_queue_attr_init(&queue_attr);
1369 ffrt_queue_t queue_handle = ffrt_queue_create(ffrt_queue_serial, "test_queue", &queue_attr);
1370 if (queue_handle == nullptr) {
1371 result = 3;
1372 }
1373
1374 int a = 0;
1375 ffrt_task_handle_t handle = ffrt_queue_submit_h(queue_handle, ffrt_create_function_wrapper(OnePlusForTest,
1376 nullptr, &a, ffrt_function_kind_queue), nullptr);
1377 ffrt_queue_wait(handle);
1378 if (a != 1) {
1379 result = 1;
1380 }
1381 ffrt_task_handle_destroy(handle);
1382
1383 // 销毁队列
1384 ffrt_queue_attr_destroy(&queue_attr);
1385 ffrt_queue_destroy(nullptr);
1386 ffrt_queue_destroy(queue_handle);
1387 napi_value flag = nullptr;
1388 napi_create_double(env, result, &flag);
1389 return flag;
1390 }
1391
QueueApiTest010(napi_env env,napi_callback_info info)1392 static napi_value QueueApiTest010(napi_env env, napi_callback_info info)
1393 {
1394 int result = 0;
1395 // ffrt_queue_submit接口queue或f为异常值
1396 ffrt_queue_attr_t queue_attr;
1397 (void)ffrt_queue_attr_init(&queue_attr);
1398 ffrt_queue_t queue_handle = ffrt_queue_create(ffrt_queue_serial, "test_queue", &queue_attr);
1399 if (queue_handle == nullptr) {
1400 result = 3;
1401 }
1402
1403 int a = 0;
1404 ffrt_queue_submit(nullptr, ffrt_create_function_wrapper(OnePlusForTest, nullptr, &a,
1405 ffrt_function_kind_queue), nullptr);
1406 ffrt_queue_submit(queue_handle, nullptr, nullptr);
1407 ffrt_task_handle_t handle = ffrt_queue_submit_h(queue_handle, ffrt_create_function_wrapper(OnePlusForTest,
1408 nullptr, &a, ffrt_function_kind_queue), nullptr);
1409 ffrt_queue_wait(handle);
1410 if (a != 1) {
1411 result = 1;
1412 }
1413 ffrt_task_handle_destroy(handle);
1414
1415 // 销毁队列
1416 ffrt_queue_attr_destroy(&queue_attr);
1417 ffrt_queue_destroy(queue_handle);
1418 napi_value flag = nullptr;
1419 napi_create_double(env, result, &flag);
1420 return flag;
1421 }
1422
QueueApiTest011(napi_env env,napi_callback_info info)1423 static napi_value QueueApiTest011(napi_env env, napi_callback_info info)
1424 {
1425 int result = 0;
1426 // ffrt_queue_submit_h接口queue或f为异常值
1427 ffrt_queue_attr_t queue_attr;
1428 (void)ffrt_queue_attr_init(&queue_attr);
1429 ffrt_queue_t queue_handle = ffrt_queue_create(ffrt_queue_serial, "test_queue", &queue_attr);
1430 if (queue_handle == nullptr) {
1431 result = 3;
1432 }
1433
1434 int a = 0;
1435 ffrt_task_handle_t handle = ffrt_queue_submit_h(nullptr,
1436 ffrt_create_function_wrapper(OnePlusForTest, nullptr, &a, ffrt_function_kind_queue), nullptr);
1437 if (handle != nullptr) {
1438 result = 1;
1439 }
1440 handle = ffrt_queue_submit_h(queue_handle, nullptr, nullptr);
1441 if (handle != nullptr) {
1442 result = 2;
1443 }
1444 handle = ffrt_queue_submit_h(queue_handle,
1445 ffrt_create_function_wrapper(OnePlusForTest, nullptr, &a, ffrt_function_kind_queue), nullptr);
1446
1447 ffrt_queue_wait(handle);
1448 if (a != 1) {
1449 result = 1;
1450 }
1451
1452 // 销毁队列
1453 ffrt_queue_attr_destroy(&queue_attr);
1454 ffrt_task_handle_destroy(handle);
1455 ffrt_queue_destroy(queue_handle);
1456 napi_value flag = nullptr;
1457 napi_create_double(env, result, &flag);
1458 return flag;
1459 }
1460
QueueApiTest012(napi_env env,napi_callback_info info)1461 static napi_value QueueApiTest012(napi_env env, napi_callback_info info)
1462 {
1463 int result = 0;
1464 // ffrt_queue_wait接口handle为异常值
1465 ffrt_queue_attr_t queue_attr;
1466 (void)ffrt_queue_attr_init(&queue_attr);
1467 ffrt_queue_t queue_handle = ffrt_queue_create(ffrt_queue_serial, "test_queue", &queue_attr);
1468 if (queue_handle == nullptr) {
1469 result = 3;
1470 }
1471
1472 int a = 0;
1473 ffrt_task_handle_t handle = ffrt_queue_submit_h(queue_handle,
1474 ffrt_create_function_wrapper(OnePlusForTest, nullptr, &a, ffrt_function_kind_queue), nullptr);
1475
1476 ffrt_queue_wait(nullptr);
1477 ffrt_queue_wait(handle);
1478 if (a != 1) {
1479 result = 1;
1480 }
1481
1482 // 销毁队列
1483 ffrt_queue_attr_destroy(&queue_attr);
1484 ffrt_task_handle_destroy(handle);
1485 ffrt_queue_destroy(queue_handle);
1486 napi_value flag = nullptr;
1487 napi_create_double(env, result, &flag);
1488 return flag;
1489 }
1490
QueueApiTest013(napi_env env,napi_callback_info info)1491 static napi_value QueueApiTest013(napi_env env, napi_callback_info info)
1492 {
1493 int result = 0;
1494 // ffrt_queue_cancel接口handle为异常值
1495 ffrt_queue_attr_t queue_attr;
1496 (void)ffrt_queue_attr_init(&queue_attr);
1497 ffrt_queue_t queue_handle = ffrt_queue_create(ffrt_queue_serial, "test_queue", &queue_attr);
1498
1499 int a = 0;
1500 ffrt_task_attr_t task_attr;
1501 (void)ffrt_task_attr_init(&task_attr);
1502 ffrt_task_attr_set_delay(&task_attr, 1000000); // 设置任务1s后才执行
1503 ffrt_task_handle_t task1 = ffrt_queue_submit_h(queue_handle,
1504 ffrt_create_function_wrapper(OnePlusForTest, nullptr, &a, ffrt_function_kind_queue), &task_attr);
1505
1506 int ret = ffrt_queue_cancel(nullptr);
1507 if (ret != -1) {
1508 result = 1;
1509 }
1510 ret = ffrt_queue_cancel(task1);
1511 if (ret != 0) {
1512 result = 2;
1513 }
1514 if (a != 0) {
1515 result = 3;
1516 }
1517
1518 ffrt_task_attr_destroy(&task_attr);
1519 ffrt_task_handle_destroy(task1);
1520
1521 // 销毁队列
1522 ffrt_queue_attr_destroy(&queue_attr);
1523 ffrt_queue_destroy(queue_handle);
1524 if (a != 0) {
1525 result = 4;
1526 }
1527 napi_value flag = nullptr;
1528 napi_create_double(env, result, &flag);
1529 return flag;
1530 }
1531
QueueApiTest014(napi_env env,napi_callback_info info)1532 static napi_value QueueApiTest014(napi_env env, napi_callback_info info)
1533 {
1534 int result = 0;
1535 // ffrt_queue_wait接口handle为异常值
1536 ffrt_queue_attr_t queue_attr;
1537 (void)ffrt_queue_attr_init(&queue_attr);
1538 ffrt_queue_t queue_handle = ffrt_queue_create(ffrt_queue_serial, "test_queue", &queue_attr);
1539 if (queue_handle == nullptr) {
1540 result += 1;
1541 }
1542 int a = 0;
1543 ffrt_task_handle_t handle = ffrt_queue_submit_h_f(queue_handle, OnePlusForTest, &a, nullptr);
1544 ffrt_queue_wait(handle);
1545 if (a != 1) {
1546 result += 1;
1547 }
1548 // 销毁队列
1549 ffrt_queue_attr_destroy(&queue_attr);
1550 ffrt_task_handle_destroy(handle);
1551 ffrt_queue_destroy(queue_handle);
1552 napi_value flag = nullptr;
1553 napi_create_double(env, result, &flag);
1554 return flag;
1555 }
1556
QueueApiTest015(napi_env env,napi_callback_info info)1557 static napi_value QueueApiTest015(napi_env env, napi_callback_info info)
1558 {
1559 int result = 0;
1560 // ffrt_queue_wait接口handle为异常值
1561 ffrt_queue_attr_t queue_attr;
1562 (void)ffrt_queue_attr_init(&queue_attr);
1563 ffrt_queue_t queue_handle = ffrt_queue_create(ffrt_queue_serial, "test_queue", &queue_attr);
1564 if (queue_handle == nullptr) {
1565 result += 1;
1566 }
1567 int a = 0;
1568 ffrt_queue_submit_f(queue_handle, OnePlusForTest, &a, nullptr);
1569 usleep(SLEEP_TIME);
1570 if (a != 1) {
1571 result += 1;
1572 }
1573 // 销毁队列
1574 ffrt_queue_attr_destroy(&queue_attr);
1575 ffrt_queue_destroy(queue_handle);
1576 napi_value flag = nullptr;
1577 napi_create_double(env, result, &flag);
1578 return flag;
1579 }
1580
QueueApiTest016(napi_env env,napi_callback_info info)1581 static napi_value QueueApiTest016(napi_env env, napi_callback_info info)
1582 {
1583 int result = 0;
1584 ffrt_queue_attr_t queue_attr;
1585 (void)ffrt_queue_attr_init(&queue_attr);
1586
1587 ffrt_queue_attr_set_thread_mode(&queue_attr, true);
1588 ffrt_queue_t queue_handle = ffrt_queue_create(ffrt_queue_serial, "test_queue", &queue_attr);
1589 if (queue_handle == nullptr) {
1590 result += 1;
1591 }
1592 int a = 0;
1593 std::function<void()>&& basicFunc = [&a]() {
1594 a += 1;
1595 };
1596 ffrt_queue_submit(queue_handle, create_function_wrapper(basicFunc, ffrt_function_kind_queue), nullptr);
1597 if (!ffrt_queue_attr_get_thread_mode(&queue_attr)) {
1598 result += 1;
1599 }
1600
1601 // 销毁队列
1602 ffrt_queue_attr_destroy(&queue_attr);
1603 ffrt_queue_destroy(queue_handle);
1604 napi_value flag = nullptr;
1605 napi_create_double(env, result, &flag);
1606 return flag;
1607 }
1608
QueueCancelTest001(napi_env env,napi_callback_info info)1609 static napi_value QueueCancelTest001(napi_env env, napi_callback_info info)
1610 {
1611 int result = 0;
1612 // cancel一个delay的未执行task
1613 ffrt_queue_attr_t queue_attr;
1614 (void)ffrt_queue_attr_init(&queue_attr);
1615 ffrt_queue_t queue_handle = ffrt_queue_create(ffrt_queue_serial, "test_queue", &queue_attr);
1616
1617 int a = 0;
1618 ffrt_task_attr_t task_attr;
1619 (void)ffrt_task_attr_init(&task_attr);
1620 ffrt_task_attr_set_delay(&task_attr, 1000000); // 设置任务1s后才执行
1621 ffrt_task_handle_t task1 = ffrt_queue_submit_h(queue_handle,
1622 ffrt_create_function_wrapper(OnePlusForTest, nullptr, &a, ffrt_function_kind_queue), &task_attr);
1623
1624 int ret = ffrt_queue_cancel(task1);
1625 if (ret != 0) {
1626 result = 2;
1627 }
1628 if (a != 0) {
1629 result = 3;
1630 }
1631
1632 ffrt_task_attr_destroy(&task_attr);
1633 ffrt_task_handle_destroy(task1);
1634
1635 // 销毁队列
1636 ffrt_queue_attr_destroy(&queue_attr);
1637 ffrt_queue_destroy(queue_handle);
1638 if (a != 0) {
1639 result = 4;
1640 }
1641 napi_value flag = nullptr;
1642 napi_create_double(env, result, &flag);
1643 return flag;
1644 }
1645
QueueCancelTest003(napi_env env,napi_callback_info info)1646 static napi_value QueueCancelTest003(napi_env env, napi_callback_info info)
1647 {
1648 int result = 0;
1649 // cancel一个执行中task,ffrt的sleep
1650 ffrt_queue_attr_t queue_attr;
1651 (void)ffrt_queue_attr_init(&queue_attr);
1652 ffrt_queue_t queue_handle = ffrt_queue_create(ffrt_queue_serial, "test_queue", &queue_attr);
1653
1654 int a = 0;
1655 ffrt_task_handle_t task1 = ffrt_queue_submit_h(queue_handle,
1656 ffrt_create_function_wrapper(OnePlusSleepForTest, nullptr, &a, ffrt_function_kind_queue), nullptr);
1657
1658 usleep(2000);
1659 int ret = ffrt_queue_cancel(task1);
1660 if (ret != 1) {
1661 result = 2;
1662 }
1663 if (a != 0) {
1664 result = 3;
1665 }
1666 ffrt_task_handle_destroy(task1);
1667 if (a != 0) {
1668 result = 4;
1669 }
1670
1671 // 销毁队列
1672 ffrt_queue_attr_destroy(&queue_attr);
1673 ffrt_queue_destroy(queue_handle);
1674 if (a != 1) {
1675 result = 5;
1676 }
1677 napi_value flag = nullptr;
1678 napi_create_double(env, result, &flag);
1679 return flag;
1680 }
1681
QueueCancelTest004(napi_env env,napi_callback_info info)1682 static napi_value QueueCancelTest004(napi_env env, napi_callback_info info)
1683 {
1684 int result = 0;
1685 // cancel一个已执行的task
1686 ffrt_queue_attr_t queue_attr;
1687 (void)ffrt_queue_attr_init(&queue_attr);
1688 ffrt_queue_t queue_handle = ffrt_queue_create(ffrt_queue_serial, "test_queue", &queue_attr);
1689
1690 int a = 0;
1691 ffrt_task_handle_t task1 = ffrt_queue_submit_h(queue_handle,
1692 ffrt_create_function_wrapper(OnePlusForTest, nullptr, &a, ffrt_function_kind_queue), nullptr);
1693 ffrt_task_handle_t task2 = ffrt_queue_submit_h(queue_handle,
1694 ffrt_create_function_wrapper(OnePlusSleepForTest, nullptr, &a, ffrt_function_kind_queue), nullptr);
1695
1696 ffrt_queue_wait(task1);
1697 int ret = ffrt_queue_cancel(task1);
1698 if (ret != 1) {
1699 result = 2;
1700 }
1701 if (a != 1) {
1702 result = 3;
1703 }
1704 ffrt_queue_wait(task2);
1705 if (a != 2) {
1706 result = 4;
1707 }
1708 ffrt_task_handle_destroy(task1);
1709 ffrt_task_handle_destroy(task2);
1710
1711 // 销毁队列
1712 ffrt_queue_attr_destroy(&queue_attr);
1713 ffrt_queue_destroy(queue_handle);
1714 napi_value flag = nullptr;
1715 napi_create_double(env, result, &flag);
1716 return flag;
1717 }
1718
QueueDelayTest001(napi_env env,napi_callback_info info)1719 static napi_value QueueDelayTest001(napi_env env, napi_callback_info info)
1720 {
1721 int resultEnd = 0;
1722 // 验证delay时间的正确性,先提交一个非延时task,再提交一个delay 5s的task,再提交一个delay 2s的task
1723 int result = 0;
1724 ffrt_task_attr_t task_attr1;
1725 ffrt_task_attr_t task_attr2;
1726 (void)ffrt_task_attr_init(&task_attr1);
1727 (void)ffrt_task_attr_init(&task_attr2);
1728 ffrt_task_attr_set_delay(&task_attr1, UNIT_TASK_DELAY_500);
1729 ffrt_task_attr_set_delay(&task_attr2, UNIT_TASK_DELAY);
1730
1731 std::function<void()>&& MultipleFunc = [&result]() { MultipleForTest(static_cast<void*>(&result)); };
1732 ffrt_queue_attr_t queue_attr;
1733 (void)ffrt_queue_attr_init(&queue_attr);
1734 ffrt_queue_t queue_handle = ffrt_queue_create(ffrt_queue_serial, "test_queue", &queue_attr);
1735 ffrt_queue_submit(queue_handle, create_function_wrapper(MultipleFunc, ffrt_function_kind_queue), nullptr);
1736 double t;
1737 auto start = std::chrono::high_resolution_clock::now();
1738 std::function<void()>&& OnePlusFunc = [&result]() { OnePlusForTest(static_cast<void*>(&result)); };
1739 std::function<void()>&& OneSubFunc = [&result]() { SubForTest(static_cast<void*>(&result)); };
1740 ffrt_task_handle_t handle1 = ffrt_queue_submit_h(queue_handle,
1741 create_function_wrapper(OneSubFunc, ffrt_function_kind_queue), &task_attr1);
1742 ffrt_task_handle_t handle2 = ffrt_queue_submit_h(queue_handle,
1743 create_function_wrapper(OnePlusFunc, ffrt_function_kind_queue), &task_attr2);
1744
1745 ffrt_queue_wait(handle2);
1746 auto end = std::chrono::high_resolution_clock::now();
1747 std::chrono::duration<double, std::milli> elapsed = end-start;
1748 t = elapsed.count();
1749 if (result != 1) {
1750 resultEnd = 1;
1751 }
1752 if (t <= COST_TIME_200 || t >= COST_TIME_300) {
1753 resultEnd = 2;
1754 }
1755
1756 ffrt_queue_wait(handle1);
1757 end = std::chrono::high_resolution_clock::now();
1758 elapsed = end-start;
1759 t = elapsed.count();
1760 if (result != 0) {
1761 resultEnd = 3;
1762 }
1763 if (t <= COST_TIME_500 || t >= COST_TIME_600) {
1764 resultEnd = 4;
1765 }
1766 ffrt_task_handle_destroy(handle1);
1767 ffrt_task_handle_destroy(handle2);
1768 ffrt_queue_attr_destroy(&queue_attr);
1769 ffrt_queue_destroy(queue_handle);
1770 napi_value flag = nullptr;
1771 napi_create_double(env, resultEnd, &flag);
1772 return flag;
1773 }
1774
QueueDelayTest002(napi_env env,napi_callback_info info)1775 static napi_value QueueDelayTest002(napi_env env, napi_callback_info info)
1776 {
1777 int result = 0;
1778 // 验证delay时间的正确性,提交一个delay 5ms的task
1779 ffrt_queue_attr_t queue_attr;
1780 (void)ffrt_queue_attr_init(&queue_attr);
1781 ffrt_queue_t queue_handle = ffrt_queue_create(ffrt_queue_serial, "test_queue", &queue_attr);
1782
1783 int a = 0;
1784 ffrt_task_attr_t task_attr;
1785 (void)ffrt_task_attr_init(&task_attr);
1786 ffrt_task_attr_set_delay(&task_attr, 5000); // 设置任务5ms后才执行
1787
1788 double t;
1789 auto start = std::chrono::high_resolution_clock::now();
1790 std::function<void()>&& OnePlusFunc = [&a]() { OnePlusForTest((void *)(&a)); };
1791 ffrt_task_handle_t task1 = ffrt_queue_submit_h(queue_handle,
1792 create_function_wrapper(OnePlusFunc, ffrt_function_kind_queue), &task_attr);
1793 ffrt_queue_wait(task1);
1794 auto end = std::chrono::high_resolution_clock::now();
1795 std::chrono::duration<double, std::micro> elapsed = end-start;
1796 t = elapsed.count();
1797 if (a != 1) {
1798 result = 1;
1799 }
1800 if (t <= 5000 || t >= 10000) {
1801 result = 2;
1802 }
1803 uint64_t delay = ffrt_task_attr_get_delay(&task_attr);
1804 if (delay != 5000) {
1805 result = 3;
1806 }
1807 ffrt_task_attr_destroy(&task_attr);
1808 ffrt_task_handle_destroy(task1);
1809 ffrt_queue_attr_destroy(&queue_attr);
1810 ffrt_queue_destroy(queue_handle);
1811 napi_value flag = nullptr;
1812 napi_create_double(env, result, &flag);
1813 return flag;
1814 }
1815
QueueDelayTest005(napi_env env,napi_callback_info info)1816 static napi_value QueueDelayTest005(napi_env env, napi_callback_info info)
1817 {
1818 int result = 0;
1819 // 等待delay任务时提交一个task可以快速调度
1820 ffrt_queue_attr_t queue_attr;
1821 (void)ffrt_queue_attr_init(&queue_attr);
1822 ffrt_queue_t queue_handle = ffrt_queue_create(ffrt_queue_serial, "test_queue", &queue_attr);
1823
1824 int a = 0;
1825 ffrt_task_attr_t task_attr;
1826 (void)ffrt_task_attr_init(&task_attr);
1827 ffrt_task_attr_set_delay(&task_attr, UNIT_TASK_DELAY_500);
1828 std::function<void()>&& MultipleFunc = [&a]() { MultipleForTest(static_cast<void*>(&a)); };
1829 ffrt_task_handle_t task1 = ffrt_queue_submit_h(queue_handle,
1830 create_function_wrapper(MultipleFunc, ffrt_function_kind_queue), &task_attr);
1831
1832 double t;
1833 auto start = std::chrono::high_resolution_clock::now();
1834 std::function<void()>&& OnePlusFunc = [&a]() { OnePlusForTest(static_cast<void*>(&a)); };
1835 ffrt_task_handle_t task2 = ffrt_queue_submit_h(queue_handle,
1836 create_function_wrapper(OnePlusFunc, ffrt_function_kind_queue), nullptr);
1837 ffrt_queue_wait(task2);
1838 auto end = std::chrono::high_resolution_clock::now();
1839 std::chrono::duration<double, std::milli> elapsed = end-start;
1840 t = elapsed.count();
1841 if (a != 1) {
1842 result = 1;
1843 }
1844 OH_LOG_Print(LOG_APP, LOG_INFO, 1, "FFRT QUEUE", "test2 cost %{public}f ms", t);
1845 ffrt_queue_wait(task1);
1846 if (a != 10) {
1847 result = 3;
1848 }
1849 uint64_t delay = ffrt_task_attr_get_delay(&task_attr);
1850 if (delay != UNIT_TASK_DELAY_500) {
1851 result = 4;
1852 }
1853 ffrt_task_attr_destroy(&task_attr);
1854 ffrt_task_handle_destroy(task1);
1855 ffrt_task_handle_destroy(task2);
1856
1857 // 销毁队列
1858 ffrt_queue_attr_destroy(&queue_attr);
1859 ffrt_queue_destroy(queue_handle);
1860 napi_value flag = nullptr;
1861 napi_create_double(env, result, &flag);
1862 return flag;
1863 }
1864
QueueDfxTest001(napi_env env,napi_callback_info info)1865 static napi_value QueueDfxTest001(napi_env env, napi_callback_info info)
1866 {
1867 int result = 0;
1868 // ffrt_queue_attr_set_timeout接口attr为异常值
1869 ffrt_queue_attr_t queue_attr;
1870 (void)ffrt_queue_attr_init(&queue_attr);
1871 ffrt_queue_attr_set_timeout(nullptr, 10000);
1872 uint64_t time = ffrt_queue_attr_get_timeout(&queue_attr);
1873 if (time != 0) {
1874 result = 1;
1875 }
1876 ffrt_queue_t queue_handle = ffrt_queue_create(ffrt_queue_serial, "test_queue", &queue_attr);
1877 if (queue_handle == nullptr) {
1878 result = 2;
1879 }
1880 // 销毁队列
1881 ffrt_queue_attr_destroy(&queue_attr);
1882 ffrt_queue_destroy(queue_handle);
1883 napi_value flag = nullptr;
1884 napi_create_double(env, result, &flag);
1885 return flag;
1886 }
1887
QueueDfxTest002(napi_env env,napi_callback_info info)1888 static napi_value QueueDfxTest002(napi_env env, napi_callback_info info)
1889 {
1890 int result = 0;
1891 // ffrt_queue_attr_get_timeout接口attr为异常值
1892 ffrt_queue_attr_t queue_attr;
1893 (void)ffrt_queue_attr_init(&queue_attr);
1894 ffrt_queue_attr_set_timeout(&queue_attr, 10000);
1895 uint64_t time = ffrt_queue_attr_get_timeout(nullptr);
1896 if (time != 0) {
1897 result = 1;
1898 }
1899 time = ffrt_queue_attr_get_timeout(&queue_attr);
1900 if (time != 10000) {
1901 result = 2;
1902 }
1903 ffrt_queue_t queue_handle = ffrt_queue_create(ffrt_queue_serial, "test_queue", &queue_attr);
1904 if (queue_handle == nullptr) {
1905 result = 3;
1906 }
1907
1908 // 销毁队列
1909 ffrt_queue_attr_destroy(&queue_attr);
1910 ffrt_queue_destroy(queue_handle);
1911 napi_value flag = nullptr;
1912 napi_create_double(env, result, &flag);
1913 return flag;
1914 }
1915
QueueDfxTest003(napi_env env,napi_callback_info info)1916 static napi_value QueueDfxTest003(napi_env env, napi_callback_info info)
1917 {
1918 int result = 0;
1919 // ffrt_queue_attr_set_callback接口attr为异常值
1920 int end = 0;
1921 std::function<void()> cbOne = [&end]() {
1922 end++;
1923 };
1924 ffrt_queue_attr_t queue_attr;
1925 (void)ffrt_queue_attr_init(&queue_attr);
1926 ffrt_queue_attr_set_callback(nullptr, create_function_wrapper(cbOne, ffrt_function_kind_queue));
1927 ffrt_queue_t queue_handle = ffrt_queue_create(ffrt_queue_serial, "test_queue", &queue_attr);
1928 if (queue_handle == nullptr) {
1929 result = 3;
1930 }
1931
1932 // 销毁队列
1933 ffrt_queue_attr_destroy(&queue_attr);
1934 ffrt_queue_destroy(queue_handle);
1935 napi_value flag = nullptr;
1936 napi_create_double(env, result, &flag);
1937 return flag;
1938 }
1939
QueueDfxTest004(napi_env env,napi_callback_info info)1940 static napi_value QueueDfxTest004(napi_env env, napi_callback_info info)
1941 {
1942 int result = 0;
1943 int end = 0;
1944 std::function<void()> cbOne = [&end]() {
1945 end++;
1946 };
1947 ffrt_queue_attr_t queue_attr;
1948 (void)ffrt_queue_attr_init(&queue_attr);
1949 ffrt_queue_attr_set_callback(&queue_attr, create_function_wrapper(cbOne, ffrt_function_kind_queue));
1950 ffrt_function_header_t* func = ffrt_queue_attr_get_callback(nullptr);
1951 if (func != nullptr) {
1952 result = 1;
1953 }
1954 func = ffrt_queue_attr_get_callback(&queue_attr);
1955 if (func == nullptr) {
1956 result = 2;
1957 }
1958 ffrt_queue_t queue_handle = ffrt_queue_create(ffrt_queue_serial, "test_queue", &queue_attr);
1959 if (queue_handle == nullptr) {
1960 result = 3;
1961 }
1962
1963 // 销毁队列
1964 ffrt_queue_destroy(queue_handle);
1965 ffrt_queue_attr_destroy(&queue_attr);
1966 napi_value flag = nullptr;
1967 napi_create_double(env, result, &flag);
1968 return flag;
1969 }
1970
QueueDfxTest005(napi_env env,napi_callback_info info)1971 static napi_value QueueDfxTest005(napi_env env, napi_callback_info info)
1972 {
1973 int resultEnd = 0;
1974 int x = 0;
1975 int end = 0;
1976 std::function<void()> cbOne = [&end]() {
1977 end++;
1978 };
1979 ffrt_queue_attr_t queue_attr;
1980 (void)ffrt_queue_attr_init(&queue_attr);
1981 ffrt_queue_attr_set_timeout(&queue_attr, 10000);
1982 ffrt_queue_attr_set_callback(&queue_attr, create_function_wrapper(cbOne, ffrt_function_kind_queue));
1983 ffrt_queue_t queue_handle = ffrt_queue_create(ffrt_queue_serial, "test_queue", &queue_attr);
1984 std::function<void()>&& basicFunc1 = [&] {
1985 x++;
1986 usleep(500 * 1000);
1987 };
1988 ffrt_task_handle_t handle = ffrt_queue_submit_h(queue_handle,
1989 create_function_wrapper(basicFunc1, ffrt_function_kind_queue), nullptr);
1990 ffrt_queue_wait(handle);
1991 if (x != 1) {
1992 resultEnd = 1;
1993 }
1994 if (end != 1) {
1995 resultEnd = 2;
1996 }
1997
1998 std::function<void()>&& basicFunc2 = [&] {
1999 x++;
2000 ffrt_usleep(500 * 1000);
2001 };
2002 ffrt_task_handle_t handle1 = ffrt_queue_submit_h(queue_handle,
2003 create_function_wrapper(basicFunc2, ffrt_function_kind_queue), nullptr);
2004 ffrt_queue_wait(handle1);
2005 if (x != 2) {
2006 resultEnd = 3;
2007 }
2008 if (end != 2) {
2009 resultEnd = 4;
2010 }
2011
2012 ffrt_task_handle_destroy(handle);
2013 ffrt_task_handle_destroy(handle1);
2014 ffrt_queue_attr_destroy(&queue_attr);
2015 ffrt_queue_destroy(queue_handle);
2016 napi_value flag = nullptr;
2017 napi_create_double(env, resultEnd, &flag);
2018 return flag;
2019 }
2020
QueueDfxTest006(napi_env env,napi_callback_info info)2021 static napi_value QueueDfxTest006(napi_env env, napi_callback_info info)
2022 {
2023 int resultEnd = 0;
2024 int x = 0;
2025 int end = 0;
2026 std::function<void()> cbOne = [&end]() {
2027 end++;
2028 };
2029 ffrt_queue_attr_t queue_attr;
2030 (void)ffrt_queue_attr_init(&queue_attr);
2031 ffrt_queue_attr_set_timeout(&queue_attr, 10000);
2032 ffrt_queue_attr_set_callback(&queue_attr, create_function_wrapper(cbOne, ffrt_function_kind_queue));
2033 ffrt_queue_t queue_handle = ffrt_queue_create(ffrt_queue_serial, "test_queue", &queue_attr);
2034
2035 ffrt_task_handle_t handle[5];
2036 std::function<void()>&& basicFunc = [&] {
2037 x++;
2038 };
2039 for (int i = 0; i < 5; ++i) {
2040 handle[i] = ffrt_queue_submit_h(queue_handle,
2041 create_function_wrapper(basicFunc, ffrt_function_kind_queue), nullptr);
2042 }
2043 ffrt_queue_wait(handle[4]);
2044 if (x != 5) {
2045 resultEnd = 1;
2046 }
2047 if (end != 0) {
2048 resultEnd = 2;
2049 }
2050 for (int i = 0; i < 5; i++) {
2051 ffrt_task_handle_destroy(handle[i]);
2052 }
2053 ffrt_queue_attr_destroy(&queue_attr);
2054 ffrt_queue_destroy(queue_handle);
2055 napi_value flag = nullptr;
2056 napi_create_double(env, resultEnd, &flag);
2057 return flag;
2058 }
2059
QueueTest001(napi_env env,napi_callback_info info)2060 static napi_value QueueTest001(napi_env env, napi_callback_info info)
2061 {
2062 ffrt_queue_attr_t queue_attr;
2063 (void)ffrt_queue_attr_init(&queue_attr);
2064 ffrt_queue_t queue_handle = ffrt_queue_create(ffrt_queue_serial, "test_queue", &queue_attr);
2065 int result = 0;
2066 ffrt_queue_submit(queue_handle, ffrt_create_function_wrapper(OnePlusForTest, nullptr, &result,
2067 ffrt_function_kind_queue), nullptr);
2068 ffrt_queue_submit(queue_handle, ffrt_create_function_wrapper(MultipleForTest, nullptr, &result,
2069 ffrt_function_kind_queue), nullptr);
2070 ffrt_task_handle_t handle = ffrt_queue_submit_h(queue_handle,
2071 ffrt_create_function_wrapper(SubForTest, nullptr, &result, ffrt_function_kind_queue), nullptr);
2072 ffrt_queue_wait(handle);
2073 ffrt_task_handle_destroy(handle);
2074 napi_value flag = nullptr;
2075 napi_create_double(env, result, &flag);
2076 ffrt_queue_attr_destroy(&queue_attr);
2077 ffrt_queue_destroy(queue_handle);
2078 return flag;
2079 }
2080
QueueTest002(napi_env env,napi_callback_info info)2081 static napi_value QueueTest002(napi_env env, napi_callback_info info)
2082 {
2083 const int maxNum = (int)ffrt_qos_user_initiated + 1;
2084 ffrt_queue_attr_t queue_attr[maxNum];
2085 ffrt_queue_t queue_handle[maxNum];
2086 for (int num = 0; num < maxNum; num++) {
2087 (void)ffrt_queue_attr_init(&queue_attr[num]);
2088 ffrt_queue_attr_set_qos(&queue_attr[num], num);
2089 queue_handle[num] = ffrt_queue_create(ffrt_queue_serial, "test_queue", &queue_attr[num]);
2090 }
2091
2092 int a = 0;
2093 int result[maxNum] = {0};
2094 ffrt_task_handle_t task[maxNum][10];
2095 for (int i = 0; i < 10; i++) {
2096 for (int num = 0; num < maxNum; num++) {
2097 task[num][i] = ffrt_queue_submit_h(queue_handle[num],
2098 ffrt_create_function_wrapper(OnePlusForTest, NULL, &result[num], ffrt_function_kind_queue), nullptr);
2099 }
2100 }
2101 for (int num = 0; num < maxNum; num++) {
2102 ffrt_queue_wait(task[num][9]);
2103 OH_LOG_Print(LOG_APP, LOG_INFO, 1, "FFRT QUEUE", "result in queue %{public}d is %{public}d", num, result[num]);
2104 if (result[num] != 10) {
2105 a = 1;
2106 }
2107 }
2108 for (int i = 0; i < 10; i++) {
2109 for (int num = 0; num < maxNum; num++) {
2110 ffrt_task_handle_destroy(task[num][i]);
2111 }
2112 }
2113 for (int num = 0; num < maxNum; num++) {
2114 OH_LOG_Print(LOG_APP, LOG_INFO, 1, "FFRT QUEUE", "qos in queue task %{public}d is %{public}d", num,
2115 ffrt_queue_attr_get_qos(&queue_attr[num]));
2116 if (ffrt_queue_attr_get_qos(&queue_attr[num]) != num) {
2117 a = 1;
2118 }
2119 ffrt_queue_attr_destroy(&queue_attr[num]);
2120 ffrt_queue_destroy(queue_handle[num]);
2121 }
2122 napi_value flag = nullptr;
2123 napi_create_double(env, a, &flag);
2124 return flag;
2125 }
2126
QueueTest003(napi_env env,napi_callback_info info)2127 static napi_value QueueTest003(napi_env env, napi_callback_info info)
2128 {
2129 int resultEnd = 0;
2130 // 创建多个相同qos队列,分别调度执行task
2131 ffrt_queue_attr_t queue_attr;
2132 (void)ffrt_queue_attr_init(&queue_attr);
2133 ffrt_queue_t queue_handle[10];
2134 for (int num = 0; num < 10; num++) {
2135 queue_handle[num] = ffrt_queue_create(ffrt_queue_serial, "test_queue", &queue_attr);
2136 }
2137
2138 int result[10] = {0};
2139 void *addr;
2140 ffrt_task_handle_t task[10][10];
2141 for (int i = 0; i < 10; i++) {
2142 for (int num = 0; num < 10; num++) {
2143 addr = static_cast<void *>(&result[num]);
2144 std::function<void()> basicFunc = [=]() { OnePlusForTest(addr); };
2145 task[num][i] = ffrt_queue_submit_h(queue_handle[num],
2146 create_function_wrapper(basicFunc, ffrt_function_kind_queue), nullptr);
2147 }
2148 }
2149 for (int num = 0; num < 10; num++) {
2150 ffrt_queue_wait(task[num][9]);
2151 if (result[num] != 10) {
2152 resultEnd = num + 1;
2153 }
2154 }
2155
2156 for (int i = 0; i < 10; i++) {
2157 for (int num = 0; num < 10; num++) {
2158 ffrt_task_handle_destroy(task[num][i]);
2159 }
2160 }
2161
2162 ffrt_queue_attr_destroy(&queue_attr);
2163 for (int num = 0; num < 10; num++) {
2164 ffrt_queue_destroy(queue_handle[num]);
2165 }
2166 napi_value flag = nullptr;
2167 napi_create_double(env, resultEnd, &flag);
2168 return flag;
2169 }
2170
QueueWaitTest001(napi_env env,napi_callback_info info)2171 static napi_value QueueWaitTest001(napi_env env, napi_callback_info info)
2172 {
2173 int result = 0;
2174 // wait一个delay的未执行task
2175 ffrt_queue_attr_t queue_attr;
2176 (void)ffrt_queue_attr_init(&queue_attr);
2177 ffrt_queue_t queue_handle = ffrt_queue_create(ffrt_queue_serial, "test_queue", &queue_attr);
2178
2179 int a = 0;
2180 ffrt_task_attr_t task_attr;
2181 (void)ffrt_task_attr_init(&task_attr);
2182 ffrt_task_attr_set_delay(&task_attr, UNIT_TASK_DELAY);
2183 std::function<void()>&& OnePlusFunc = [&a]() { OnePlusForTest(static_cast<void*>(&a)); };
2184 ffrt_task_handle_t task1 = ffrt_queue_submit_h(queue_handle,
2185 create_function_wrapper(OnePlusFunc, ffrt_function_kind_queue), &task_attr);
2186
2187 ffrt_queue_wait(task1);
2188 if (a != 1) {
2189 result = 1;
2190 }
2191
2192 ffrt_task_attr_destroy(&task_attr);
2193 ffrt_task_handle_destroy(task1);
2194
2195 // 销毁队列
2196 ffrt_queue_attr_destroy(&queue_attr);
2197 ffrt_queue_destroy(queue_handle);
2198 napi_value flag = nullptr;
2199 napi_create_double(env, result, &flag);
2200 return flag;
2201 }
2202
SubmitAbnormalTest(napi_env env,napi_callback_info info)2203 static napi_value SubmitAbnormalTest(napi_env env, napi_callback_info info)
2204 {
2205 int result = 0;
2206 int x = 0;
2207 std::function<void()>&& func = [&]() { x = x + 1;};
2208 const std::vector<ffrt_dependence_t> in_deps = {{ffrt_dependence_data, &x}};
2209 ffrt_deps_t in{static_cast<uint32_t>(in_deps.size()), in_deps.data()};
2210 const std::vector<ffrt_dependence_t> out_deps = {{ffrt_dependence_data, &x}};
2211 ffrt_deps_t out{static_cast<uint32_t>(out_deps.size()), out_deps.data()};
2212 ffrt_function_header_t* ffrt_header_t = create_function_wrapper((func));
2213
2214 ffrt_submit_base(nullptr, &in, &out, nullptr);
2215 ffrt_submit_h_base(nullptr, &in, &out, nullptr);
2216 ffrt_task_handle_destroy(nullptr);
2217 ffrt_submit_base(ffrt_header_t, &in, &out, nullptr);
2218 ffrt_wait();
2219 if (x != 1) {
2220 result = 1;
2221 }
2222 napi_value flag = nullptr;
2223 napi_create_double(env, result, &flag);
2224 return flag;
2225 }
2226
SubmitBasicTest001(napi_env env,napi_callback_info info)2227 static napi_value SubmitBasicTest001(napi_env env, napi_callback_info info)
2228 {
2229 int result = 0;
2230 int x = 0;
2231 std::function<void()>&& func = [&]() { x = x + 1;};
2232 const std::vector<ffrt_dependence_t> in_deps = {{ffrt_dependence_data, &x}};
2233 ffrt_deps_t in{static_cast<uint32_t>(in_deps.size()), in_deps.data()};
2234 const std::vector<ffrt_dependence_t> out_deps = {{ffrt_dependence_data, &x}};
2235 ffrt_deps_t out{static_cast<uint32_t>(out_deps.size()), out_deps.data()};
2236 ffrt_function_header_t* ffrt_header_t = create_function_wrapper((func));
2237 ffrt_submit_base(ffrt_header_t, &in, &out, nullptr);
2238 ffrt_wait();
2239 if (x != 1) {
2240 result = 1;
2241 }
2242 napi_value flag = nullptr;
2243 napi_create_double(env, result, &flag);
2244 return flag;
2245 }
2246
SubmitBasicTest002(napi_env env,napi_callback_info info)2247 static napi_value SubmitBasicTest002(napi_env env, napi_callback_info info)
2248 {
2249 int result = 0;
2250 const uint32_t sleepTime = 5 * 1000;
2251 int a = 0;
2252 ffrt_task_attr_t attr;
2253 ffrt_task_attr_init(&attr);
2254 ffrt_submit_base(ffrt_create_function_wrapper(OnePlusForTest, NULL, &a), NULL, NULL, &attr);
2255 ffrt_wait();
2256 usleep(sleepTime);
2257 if (a != 1) {
2258 result = 3;
2259 }
2260 ffrt_task_attr_destroy(&attr);
2261 napi_value flag = nullptr;
2262 napi_create_double(env, result, &flag);
2263 return flag;
2264 }
2265
SubmitInDependEmptyTest(napi_env env,napi_callback_info info)2266 static napi_value SubmitInDependEmptyTest(napi_env env, napi_callback_info info)
2267 {
2268 int result = 0;
2269 const uint32_t sleepTime = 10 * 1000;
2270 int x = 0;
2271 int y = 0;
2272 std::function<void()>&& basic1Func = [&]() {
2273 x = x + 1;
2274 usleep(sleepTime);
2275 };
2276 std::function<void()>&& basic2Func = [&]() {
2277 y = y + 1;
2278 usleep(sleepTime);
2279 };
2280 ffrt_task_attr_t attr1;
2281 ffrt_task_attr_init(&attr1);
2282 ffrt_task_attr_set_qos(&attr1, static_cast<int>(ffrt_qos_background));
2283 ffrt_task_attr_t attr2;
2284 ffrt_task_attr_init(&attr2);
2285 ffrt_task_attr_set_qos(&attr2, static_cast<int>(ffrt_qos_utility));
2286 ffrt_function_header_t* basic1Func_ht = create_function_wrapper((basic1Func));
2287 ffrt_function_header_t* basic2Func_ht = create_function_wrapper((basic2Func));
2288 const std::vector<ffrt_dependence_t> in1_deps = {};
2289 ffrt_deps_t in1{static_cast<uint32_t>(in1_deps.size()), in1_deps.data()};
2290 const std::vector<ffrt_dependence_t> in2_deps = {};
2291 ffrt_deps_t in2{static_cast<uint32_t>(in2_deps.size()), in2_deps.data()};
2292 ffrt_submit_base(basic1Func_ht, &in1, nullptr, &attr1);
2293 ffrt_submit_base(basic2Func_ht, &in2, nullptr, &attr2);
2294 ffrt_wait();
2295 if (x != 1) {
2296 result = 1;
2297 }
2298 if (y != 1) {
2299 result = 2;
2300 }
2301 ffrt_task_attr_destroy(&attr1);
2302 ffrt_task_attr_destroy(&attr2);
2303 napi_value flag = nullptr;
2304 napi_create_double(env, result, &flag);
2305 return flag;
2306 }
2307
SubmitInDependNullptrTest(napi_env env,napi_callback_info info)2308 static napi_value SubmitInDependNullptrTest(napi_env env, napi_callback_info info)
2309 {
2310 int result = 0;
2311 const uint32_t sleepTime = 10 * 1000;
2312 int x = 0;
2313 int y = 0;
2314 std::function<void()>&& basic1Func = [&]() {
2315 x = x + 1;
2316 usleep(sleepTime);
2317 };
2318 std::function<void()>&& basic2Func = [&]() {
2319 y = y + 1;
2320 usleep(sleepTime);
2321 };
2322 ffrt_function_header_t* basic1Func_ht = create_function_wrapper((basic1Func));
2323 ffrt_function_header_t* basic2Func_ht = create_function_wrapper((basic2Func));
2324 const std::vector<ffrt_dependence_t> in1_deps = {{ffrt_dependence_data, NULL}};
2325 ffrt_deps_t in1{static_cast<uint32_t>(in1_deps.size()), in1_deps.data()};
2326 const std::vector<ffrt_dependence_t> in2_deps = {{ffrt_dependence_data, NULL}};
2327 ffrt_deps_t in2{static_cast<uint32_t>(in2_deps.size()), in2_deps.data()};
2328 ffrt_submit_base(basic1Func_ht, &in1, nullptr, nullptr);
2329 ffrt_submit_base(basic2Func_ht, &in2, nullptr, nullptr);
2330 ffrt_wait();
2331 if (x != 1) {
2332 result = 1;
2333 }
2334 if (y != 1) {
2335 result = 2;
2336 }
2337 napi_value flag = nullptr;
2338 napi_create_double(env, result, &flag);
2339 return flag;
2340 }
2341
SubmitOuDependEmptyTest(napi_env env,napi_callback_info info)2342 static napi_value SubmitOuDependEmptyTest(napi_env env, napi_callback_info info)
2343 {
2344 int result = 0;
2345 const uint32_t sleepTime = 10 * 1000;
2346 int x = 0;
2347 int y = 0;
2348 std::function<void()>&& basic1Func = [&]() {
2349 x = x + 1;
2350 usleep(sleepTime);
2351 };
2352 std::function<void()>&& basic2Func = [&]() {
2353 y = y + 1;
2354 usleep(sleepTime);
2355 };
2356 ffrt_function_header_t* basic1Func_ht = create_function_wrapper((basic1Func));
2357 ffrt_function_header_t* basic2Func_ht = create_function_wrapper((basic2Func));
2358 const std::vector<ffrt_dependence_t> in1_deps = {};
2359 ffrt_deps_t in1{static_cast<uint32_t>(in1_deps.size()), in1_deps.data()};
2360 const std::vector<ffrt_dependence_t> in2_deps = {};
2361 ffrt_deps_t in2{static_cast<uint32_t>(in2_deps.size()), in2_deps.data()};
2362 const std::vector<ffrt_dependence_t> ou1_deps = {};
2363 ffrt_deps_t ou1{static_cast<uint32_t>(ou1_deps.size()), ou1_deps.data()};
2364 const std::vector<ffrt_dependence_t> ou2_deps = {};
2365 ffrt_deps_t ou2{static_cast<uint32_t>(ou2_deps.size()), ou2_deps.data()};
2366 ffrt_submit_base(basic1Func_ht, &in1, &ou1, nullptr);
2367 ffrt_submit_base(basic2Func_ht, &in2, &ou2, nullptr);
2368 ffrt_wait();
2369 if (x != 1) {
2370 result = 1;
2371 }
2372 if (y != 1) {
2373 result = 2;
2374 }
2375 napi_value flag = nullptr;
2376 napi_create_double(env, result, &flag);
2377 return flag;
2378 }
2379
SubmitOuDependNullptrTest(napi_env env,napi_callback_info info)2380 static napi_value SubmitOuDependNullptrTest(napi_env env, napi_callback_info info)
2381 {
2382 int result = 0;
2383 const uint32_t sleepTime = 10 * 1000;
2384 int x = 0;
2385 int y = 0;
2386 std::function<void()>&& basic1Func = [&]() {
2387 x = x + 1;
2388 usleep(sleepTime);
2389 if (y != 0) {
2390 result = 1;
2391 }
2392 };
2393 std::function<void()>&& basic2Func = [&]() {
2394 y = y + 1;
2395 usleep(sleepTime);
2396 if (x != 1) {
2397 result = 2;
2398 }
2399 };
2400 ffrt_function_header_t* basic1Func_ht = create_function_wrapper((basic1Func));
2401 ffrt_function_header_t* basic2Func_ht = create_function_wrapper((basic2Func));
2402 const std::vector<ffrt_dependence_t> ou1_deps = {{ffrt_dependence_data, NULL}};
2403 ffrt_deps_t ou1{static_cast<uint32_t>(ou1_deps.size()), ou1_deps.data()};
2404 const std::vector<ffrt_dependence_t> ou2_deps = {{ffrt_dependence_data, NULL}};
2405 ffrt_deps_t ou2{static_cast<uint32_t>(ou2_deps.size()), ou2_deps.data()};
2406 ffrt_submit_base(basic1Func_ht, nullptr, &ou1, nullptr);
2407 ffrt_submit_base(basic2Func_ht, nullptr, &ou2, nullptr);
2408 ffrt_wait();
2409 if (x != 1) {
2410 result = 3;
2411 }
2412 if (y != 1) {
2413 result = 4;
2414 }
2415 napi_value flag = nullptr;
2416 napi_create_double(env, result, &flag);
2417 return flag;
2418 }
2419
SubmitIODependTest001(napi_env env,napi_callback_info info)2420 static napi_value SubmitIODependTest001(napi_env env, napi_callback_info info)
2421 {
2422 int result = 0;
2423 int x = 0;
2424 int y = 0;
2425 int z = 0;
2426 std::function<void()>&& basic1Func = [&]() {
2427 ffrt_usleep(10 * 1000);
2428 x = x + 1;
2429 };
2430 std::function<void()>&& basic2Func = [&]() {
2431 ffrt_usleep(5 * 1000);
2432 y = y + 1;
2433 };
2434 std::function<void()>&& basic3Func = [&]() {
2435 z = x + y;
2436 };
2437 const std::vector<ffrt_dependence_t> in3_deps = {{ffrt_dependence_data, &x}, {ffrt_dependence_data, &y}};
2438 ffrt_deps_t in3{static_cast<uint32_t>(in3_deps.size()), in3_deps.data()};
2439 const std::vector<ffrt_dependence_t> ou1_deps = {{ffrt_dependence_data, &x}};
2440 ffrt_deps_t ou1{static_cast<uint32_t>(ou1_deps.size()), ou1_deps.data()};
2441 const std::vector<ffrt_dependence_t> ou2_deps = {{ffrt_dependence_data, &y}};
2442 ffrt_deps_t ou2{static_cast<uint32_t>(ou2_deps.size()), ou2_deps.data()};
2443 const std::vector<ffrt_dependence_t> ou3_deps = {{ffrt_dependence_data, &z}};
2444 ffrt_deps_t ou3{static_cast<uint32_t>(ou3_deps.size()), ou3_deps.data()};
2445 ffrt_submit_base(create_function_wrapper(basic1Func), nullptr, &ou1, nullptr);
2446 ffrt_submit_base(create_function_wrapper(basic2Func), nullptr, &ou2, nullptr);
2447 ffrt_submit_base(create_function_wrapper(basic3Func), &in3, &ou3, nullptr);
2448 ffrt_wait();
2449 if (z != 2) {
2450 result = 1;
2451 }
2452 napi_value flag = nullptr;
2453 napi_create_double(env, result, &flag);
2454 return flag;
2455 }
2456
SubmitIODependTest002(napi_env env,napi_callback_info info)2457 static napi_value SubmitIODependTest002(napi_env env, napi_callback_info info)
2458 {
2459 int result = 0;
2460 int x = 0;
2461 int y = 0;
2462 int z = 0;
2463 int t = 0;
2464 std::function<void()>&& basic1Func = [&]() {
2465 usleep(10 * 1000);
2466 x = x + 1;
2467 y = y + 1;
2468 };
2469 std::function<void()>&& basic2Func = [&]() {
2470 z = x * 5;
2471 };
2472 std::function<void()>&& basic3Func = [&]() {
2473 t = y * 10;
2474 };
2475 const std::vector<ffrt_dependence_t> in2_deps = {{ffrt_dependence_data, &x}};
2476 ffrt_deps_t in2{static_cast<uint32_t>(in2_deps.size()), in2_deps.data()};
2477 const std::vector<ffrt_dependence_t> in3_deps = {{ffrt_dependence_data, &y}};
2478 ffrt_deps_t in3{static_cast<uint32_t>(in3_deps.size()), in3_deps.data()};
2479 const std::vector<ffrt_dependence_t> ou1_deps = {{ffrt_dependence_data, &x}, {ffrt_dependence_data, &y}};
2480 ffrt_deps_t ou1{static_cast<uint32_t>(ou1_deps.size()), ou1_deps.data()};
2481 const std::vector<ffrt_dependence_t> ou2_deps = {{ffrt_dependence_data, &z}};
2482 ffrt_deps_t ou2{static_cast<uint32_t>(ou2_deps.size()), ou2_deps.data()};
2483 const std::vector<ffrt_dependence_t> ou3_deps = {{ffrt_dependence_data, &t}};
2484 ffrt_deps_t ou3{static_cast<uint32_t>(ou3_deps.size()), ou3_deps.data()};
2485 ffrt_submit_base(create_function_wrapper(basic1Func), nullptr, &ou1, nullptr);
2486 ffrt_submit_base(create_function_wrapper(basic2Func), &in2, &ou2, nullptr);
2487 ffrt_submit_base(create_function_wrapper(basic3Func), &in3, &ou3, nullptr);
2488 ffrt_wait();
2489 if (z != 5) {
2490 result = 1;
2491 }
2492 if (t != 10) {
2493 result = 2;
2494 }
2495 napi_value flag = nullptr;
2496 napi_create_double(env, result, &flag);
2497 return flag;
2498 }
2499
SubmitHIODependTest001(napi_env env,napi_callback_info info)2500 static napi_value SubmitHIODependTest001(napi_env env, napi_callback_info info)
2501 {
2502 int result = 0;
2503 int x = 0;
2504 int y = 0;
2505 int z = 0;
2506 std::function<void()>&& basic1Func = [&]() {
2507 ffrt_usleep(10 * 1000);
2508 x = x + 1;
2509 };
2510 std::function<void()>&& basic2Func = [&]() {
2511 ffrt_usleep(5 * 1000);
2512 y = y + 1;
2513 };
2514 std::function<void()>&& basic3Func = [&]() {
2515 z = x + y;
2516 };
2517 const std::vector<ffrt_dependence_t> in3_deps = {
2518 {ffrt_dependence_data, &x}, {ffrt_dependence_data, &y}};
2519 ffrt_deps_t in3{static_cast<uint32_t>(in3_deps.size()), in3_deps.data()};
2520 const std::vector<ffrt_dependence_t> ou1_deps = {{ffrt_dependence_data, &x}};
2521 ffrt_deps_t ou1{static_cast<uint32_t>(ou1_deps.size()), ou1_deps.data()};
2522 const std::vector<ffrt_dependence_t> ou2_deps = {{ffrt_dependence_data, &y}};
2523 ffrt_deps_t ou2{static_cast<uint32_t>(ou2_deps.size()), ou2_deps.data()};
2524 const std::vector<ffrt_dependence_t> ou3_deps = {{ffrt_dependence_data, &z}};
2525 ffrt_deps_t ou3{static_cast<uint32_t>(ou3_deps.size()), ou3_deps.data()};
2526 ffrt_task_handle_t task1 = ffrt_submit_h_base(
2527 create_function_wrapper(basic1Func), nullptr, &ou1, nullptr);
2528 ffrt_task_handle_t task2 = ffrt_submit_h_base(
2529 create_function_wrapper(basic2Func), nullptr, &ou2, nullptr);
2530 ffrt_task_handle_t task3 = ffrt_submit_h_base(
2531 create_function_wrapper(basic3Func), &in3, &ou3, nullptr);
2532 const std::vector<ffrt_dependence_t> wait_deps = {{ffrt_dependence_task, task3}};
2533 ffrt_deps_t wait{static_cast<uint32_t>(wait_deps.size()), wait_deps.data()};
2534 ffrt_wait_deps(&wait);
2535 if (z != 2) {
2536 result = 1;
2537 }
2538 ffrt_task_handle_destroy(task1);
2539 ffrt_task_handle_destroy(task2);
2540 ffrt_task_handle_destroy(task3);
2541 napi_value flag = nullptr;
2542 napi_create_double(env, result, &flag);
2543 return flag;
2544 }
2545
SubmitHIODependTest002(napi_env env,napi_callback_info info)2546 static napi_value SubmitHIODependTest002(napi_env env, napi_callback_info info)
2547 {
2548 int result = 0;
2549 int x = 0;
2550 int y = 0;
2551 int z = 0;
2552 int t = 0;
2553 std::function<void()>&& basic1Func = [&]() {
2554 usleep(10 * 1000);
2555 x = x + 1;
2556 y = y + 1;
2557 };
2558 std::function<void()>&& basic2Func = [&]() {
2559 z = x * 5;
2560 };
2561 std::function<void()>&& basic3Func = [&]() {
2562 t = y * 10;
2563 };
2564 const std::vector<ffrt_dependence_t> in2_deps = {{ffrt_dependence_data, &x}};
2565 ffrt_deps_t in2{static_cast<uint32_t>(in2_deps.size()), in2_deps.data()};
2566 const std::vector<ffrt_dependence_t> in3_deps = {{ffrt_dependence_data, &y}};
2567 ffrt_deps_t in3{static_cast<uint32_t>(in3_deps.size()), in3_deps.data()};
2568 const std::vector<ffrt_dependence_t> ou1_deps = {{ffrt_dependence_data, &x}, {ffrt_dependence_data, &y}};
2569 ffrt_deps_t ou1{static_cast<uint32_t>(ou1_deps.size()), ou1_deps.data()};
2570 const std::vector<ffrt_dependence_t> ou2_deps = {{ffrt_dependence_data, &z}};
2571 ffrt_deps_t ou2{static_cast<uint32_t>(ou2_deps.size()), ou2_deps.data()};
2572 const std::vector<ffrt_dependence_t> ou3_deps = {{ffrt_dependence_data, &t}};
2573 ffrt_deps_t ou3{static_cast<uint32_t>(ou3_deps.size()), ou3_deps.data()};
2574 ffrt_task_handle_t task1 = ffrt_submit_h_base(create_function_wrapper(basic1Func), nullptr, &ou1, nullptr);
2575 ffrt_task_handle_t task2 = ffrt_submit_h_base(create_function_wrapper(basic2Func), &in2, &ou2, nullptr);
2576 ffrt_task_handle_t task3 = ffrt_submit_h_base(create_function_wrapper(basic3Func), &in3, &ou3, nullptr);
2577 const std::vector<ffrt_dependence_t> wait2_deps = {{ffrt_dependence_task, task2}};
2578 ffrt_deps_t wait2{static_cast<uint32_t>(wait2_deps.size()), wait2_deps.data()};
2579 ffrt_wait_deps(&wait2);
2580 if (z != 5) {
2581 result = 1;
2582 }
2583 const std::vector<ffrt_dependence_t> wait3_deps = {{ffrt_dependence_task, task3}};
2584 ffrt_deps_t wait3{static_cast<uint32_t>(wait3_deps.size()), wait3_deps.data()};
2585 ffrt_wait_deps(&wait3);
2586 if (t != 10) {
2587 result = 2;
2588 }
2589 ffrt_task_handle_destroy(task1);
2590 ffrt_task_handle_destroy(task2);
2591 ffrt_task_handle_destroy(task3);
2592 napi_value flag = nullptr;
2593 napi_create_double(env, result, &flag);
2594 return flag;
2595 }
2596
SubmitIn0Ou0WaitNullTask1Test(napi_env env,napi_callback_info info)2597 static napi_value SubmitIn0Ou0WaitNullTask1Test(napi_env env, napi_callback_info info)
2598 {
2599 int result = 0;
2600 const uint32_t sleepTime = 30 * 1000;
2601 int x = 0;
2602 ffrt_task_attr_t attr;
2603 ffrt_task_attr_init(&attr);
2604 std::function<void()>&& basicFunc = [&]() {
2605 if (x != 0) {
2606 result = 1;
2607 }
2608 usleep(sleepTime);
2609 x = x + 1;
2610 };
2611 ffrt_function_header_t* basicFunc_ht = create_function_wrapper((basicFunc));
2612 const std::vector<ffrt_dependence_t> in_deps = {};
2613 ffrt_deps_t in{static_cast<uint32_t>(in_deps.size()), in_deps.data()};
2614 const std::vector<ffrt_dependence_t> ou_deps = {};
2615 ffrt_deps_t ou{static_cast<uint32_t>(ou_deps.size()), ou_deps.data()};
2616 const std::vector<ffrt_dependence_t> wait_deps = {};
2617 ffrt_deps_t wait{static_cast<uint32_t>(wait_deps.size()), wait_deps.data()};
2618 const ffrt_deps_t *wait_null = nullptr;
2619 ffrt_submit_base(basicFunc_ht, &in, &ou, &attr);
2620 if (x != 0) {
2621 result = 2;
2622 }
2623 ffrt_wait_deps(wait_null);
2624 if (x != 0) {
2625 result = 3;
2626 }
2627 ffrt_wait_deps(&wait);
2628 if (x != 0) {
2629 result = 4;
2630 }
2631 ffrt_wait();
2632 if (x != 1) {
2633 result = 5;
2634 }
2635 ffrt_task_attr_destroy(&attr);
2636 napi_value flag = nullptr;
2637 napi_create_double(env, result, &flag);
2638 return flag;
2639 }
2640
SubmitHBasicTest001(napi_env env,napi_callback_info info)2641 static napi_value SubmitHBasicTest001(napi_env env, napi_callback_info info)
2642 {
2643 int result = 0;
2644 int x = 0;
2645 std::function<void()>&& func = [&]() { x = x + 1;};
2646 const std::vector<ffrt_dependence_t> in_deps = {{ffrt_dependence_data, &x}};
2647 ffrt_deps_t in{static_cast<uint32_t>(in_deps.size()), in_deps.data()};
2648 const std::vector<ffrt_dependence_t> out_deps = {{ffrt_dependence_data, &x}};
2649 ffrt_deps_t out{static_cast<uint32_t>(out_deps.size()), out_deps.data()};
2650 ffrt_function_header_t* ffrt_header_t = create_function_wrapper((func));
2651 ffrt_task_handle_t task = ffrt_submit_h_base(ffrt_header_t, &in, &out, nullptr);
2652 const std::vector<ffrt_dependence_t> wait_deps = {{ffrt_dependence_data, &x}};
2653 ffrt_deps_t wait{static_cast<uint32_t>(wait_deps.size()), wait_deps.data()};
2654 ffrt_wait_deps(&wait);
2655 if (x != 1) {
2656 result = 1;
2657 }
2658 ffrt_task_handle_destroy(task);
2659 napi_value flag = nullptr;
2660 napi_create_double(env, result, &flag);
2661 return flag;
2662 }
2663
SubmitHBasicTest002(napi_env env,napi_callback_info info)2664 static napi_value SubmitHBasicTest002(napi_env env, napi_callback_info info)
2665 {
2666 int result = 0;
2667 const uint32_t sleepTime = 5 * 1000;
2668 int a = 0;
2669 ffrt_task_attr_t attr;
2670 ffrt_task_attr_init(&attr);
2671 ffrt_task_handle_t task = ffrt_submit_h_base(
2672 ffrt_create_function_wrapper(OnePlusForTest, NULL, &a), NULL, NULL, &attr);
2673 const std::vector<ffrt_dependence_t> wait_deps = {{ffrt_dependence_task, task}};
2674 ffrt_deps_t wait{static_cast<uint32_t>(wait_deps.size()), wait_deps.data()};
2675 ffrt_wait_deps(&wait);
2676 usleep(sleepTime);
2677 if (a != 1) {
2678 result = 3;
2679 }
2680 ffrt_task_attr_destroy(&attr);
2681 ffrt_task_handle_destroy(task);
2682 napi_value flag = nullptr;
2683 napi_create_double(env, result, &flag);
2684 return flag;
2685 }
2686
SubmitHFTest001(napi_env env,napi_callback_info info)2687 static napi_value SubmitHFTest001(napi_env env, napi_callback_info info)
2688 {
2689 int result = 0;
2690 int a = 0;
2691 ffrt_task_attr_t attr;
2692 ffrt_task_attr_init(&attr);
2693 ffrt_task_handle_t task = ffrt_submit_h_f(OnePlusForTest, &a, nullptr, nullptr, &attr);
2694 const std::vector<ffrt_dependence_t> wait_deps = {{ffrt_dependence_task, task}};
2695 ffrt_deps_t wait{static_cast<uint32_t>(wait_deps.size()), wait_deps.data()};
2696 ffrt_wait_deps(&wait);
2697 if (a != 1) {
2698 result += 1;
2699 }
2700 ffrt_task_attr_destroy(&attr);
2701 ffrt_task_handle_destroy(task);
2702 napi_value flag = nullptr;
2703 napi_create_double(env, result, &flag);
2704 return flag;
2705 }
2706
SubmitFTest001(napi_env env,napi_callback_info info)2707 static napi_value SubmitFTest001(napi_env env, napi_callback_info info)
2708 {
2709 int result = 0;
2710 int a = 0;
2711 ffrt_task_attr_t attr;
2712 ffrt_task_attr_init(&attr);
2713 ffrt_submit_f(OnePlusForTest, &a, nullptr, nullptr, &attr);
2714 ffrt_wait();
2715 if (a != 1) {
2716 result += 1;
2717 }
2718 ffrt_task_attr_destroy(&attr);
2719 napi_value flag = nullptr;
2720 napi_create_double(env, result, &flag);
2721 return flag;
2722 }
2723
SubmitHInDependEmptyTest(napi_env env,napi_callback_info info)2724 static napi_value SubmitHInDependEmptyTest(napi_env env, napi_callback_info info)
2725 {
2726 int result = 0;
2727 const uint32_t sleepTime = 10 * 1000;
2728 int x = 0;
2729 int y = 0;
2730 std::function<void()>&& basic1Func = [&]() {
2731 x = x + 1;
2732 usleep(sleepTime);
2733 };
2734 std::function<void()>&& basic2Func = [&]() {
2735 y = y + 1;
2736 usleep(sleepTime);
2737 };
2738 ffrt_task_attr_t attr1;
2739 ffrt_task_attr_init(&attr1);
2740 ffrt_task_attr_set_qos(&attr1, static_cast<int>(ffrt_qos_background));
2741 ffrt_task_attr_t attr2;
2742 ffrt_task_attr_init(&attr2);
2743 ffrt_task_attr_set_qos(&attr2, static_cast<int>(ffrt_qos_utility));
2744 ffrt_function_header_t* basic1Func_ht = create_function_wrapper((basic1Func));
2745 ffrt_function_header_t* basic2Func_ht = create_function_wrapper((basic2Func));
2746 const std::vector<ffrt_dependence_t> in1_deps = {};
2747 ffrt_deps_t in1{static_cast<uint32_t>(in1_deps.size()), in1_deps.data()};
2748 const std::vector<ffrt_dependence_t> in2_deps = {};
2749 ffrt_deps_t in2{static_cast<uint32_t>(in2_deps.size()), in2_deps.data()};
2750 ffrt_task_handle_t task1 = ffrt_submit_h_base(basic1Func_ht, &in1, nullptr, &attr1);
2751 ffrt_task_handle_t task2 = ffrt_submit_h_base(basic2Func_ht, &in2, nullptr, &attr2);
2752 const std::vector<ffrt_dependence_t> wait_deps1 = {{ffrt_dependence_task, task1}};
2753 ffrt_deps_t wait1{static_cast<uint32_t>(wait_deps1.size()), wait_deps1.data()};
2754 const std::vector<ffrt_dependence_t> wait_deps2 = {{ffrt_dependence_task, task2}};
2755 ffrt_deps_t wait2{static_cast<uint32_t>(wait_deps2.size()), wait_deps2.data()};
2756 ffrt_wait_deps(&wait1);
2757 if (x != 1) {
2758 result = 1;
2759 }
2760 ffrt_wait_deps(&wait2);
2761 if (y != 1) {
2762 result = 2;
2763 }
2764 ffrt_task_attr_destroy(&attr1);
2765 ffrt_task_attr_destroy(&attr2);
2766 ffrt_task_handle_destroy(task1);
2767 ffrt_task_handle_destroy(task2);
2768 napi_value flag = nullptr;
2769 napi_create_double(env, result, &flag);
2770 return flag;
2771 }
2772
SubmitHInDependNullptrTest(napi_env env,napi_callback_info info)2773 static napi_value SubmitHInDependNullptrTest(napi_env env, napi_callback_info info)
2774 {
2775 int result = 0;
2776 const uint32_t sleepTime = 10 * 1000;
2777 int x = 0;
2778 int y = 0;
2779 std::function<void()>&& basic1Func = [&]() {
2780 x = x + 1;
2781 usleep(sleepTime);
2782 };
2783 std::function<void()>&& basic2Func = [&]() {
2784 y = y + 1;
2785 usleep(sleepTime);
2786 };
2787 ffrt_function_header_t* basic1Func_ht = create_function_wrapper((basic1Func));
2788 ffrt_function_header_t* basic2Func_ht = create_function_wrapper((basic2Func));
2789 const std::vector<ffrt_dependence_t> in1_deps = {{ffrt_dependence_data, NULL}};
2790 ffrt_deps_t in1{static_cast<uint32_t>(in1_deps.size()), in1_deps.data()};
2791 const std::vector<ffrt_dependence_t> in2_deps = {{ffrt_dependence_data, NULL}};
2792 ffrt_deps_t in2{static_cast<uint32_t>(in2_deps.size()), in2_deps.data()};
2793 ffrt_task_handle_t task1 = ffrt_submit_h_base(basic1Func_ht, &in1, nullptr, nullptr);
2794 ffrt_task_handle_t task2 = ffrt_submit_h_base(basic2Func_ht, &in2, nullptr, nullptr);
2795 const std::vector<ffrt_dependence_t> wait_deps1 = {{ffrt_dependence_task, task1}};
2796 ffrt_deps_t wait1{static_cast<uint32_t>(wait_deps1.size()), wait_deps1.data()};
2797 const std::vector<ffrt_dependence_t> wait_deps2 = {{ffrt_dependence_task, task2}};
2798 ffrt_deps_t wait2{static_cast<uint32_t>(wait_deps2.size()), wait_deps2.data()};
2799 ffrt_wait_deps(&wait1);
2800 if (x != 1) {
2801 result = 1;
2802 }
2803 ffrt_wait_deps(&wait2);
2804 if (y != 1) {
2805 result = 2;
2806 }
2807 ffrt_task_handle_destroy(task1);
2808 ffrt_task_handle_destroy(task2);
2809 napi_value flag = nullptr;
2810 napi_create_double(env, result, &flag);
2811 return flag;
2812 }
2813
SubmitHOuDependEmptyTest(napi_env env,napi_callback_info info)2814 static napi_value SubmitHOuDependEmptyTest(napi_env env, napi_callback_info info)
2815 {
2816 int result = 0;
2817 const uint32_t sleepTime = 10 * 1000;
2818 int x = 0;
2819 int y = 0;
2820 std::function<void()>&& basic1Func = [&]() {
2821 x = x + 1;
2822 usleep(sleepTime);
2823 };
2824 std::function<void()>&& basic2Func = [&]() {
2825 y = y + 1;
2826 usleep(sleepTime);
2827 };
2828 ffrt_function_header_t* basic1Func_ht = create_function_wrapper((basic1Func));
2829 ffrt_function_header_t* basic2Func_ht = create_function_wrapper((basic2Func));
2830 const std::vector<ffrt_dependence_t> in1_deps = {};
2831 ffrt_deps_t in1{static_cast<uint32_t>(in1_deps.size()), in1_deps.data()};
2832 const std::vector<ffrt_dependence_t> in2_deps = {};
2833 ffrt_deps_t in2{static_cast<uint32_t>(in2_deps.size()), in2_deps.data()};
2834 const std::vector<ffrt_dependence_t> ou1_deps = {};
2835 ffrt_deps_t ou1{static_cast<uint32_t>(ou1_deps.size()), ou1_deps.data()};
2836 const std::vector<ffrt_dependence_t> ou2_deps = {};
2837 ffrt_deps_t ou2{static_cast<uint32_t>(ou2_deps.size()), ou2_deps.data()};
2838 ffrt_task_handle_t task1 = ffrt_submit_h_base(basic1Func_ht, &in1, &ou1, nullptr);
2839 ffrt_task_handle_t task2 = ffrt_submit_h_base(basic2Func_ht, &in2, &ou2, nullptr);
2840 const std::vector<ffrt_dependence_t> wait_deps1 = {{ffrt_dependence_task, task1}};
2841 ffrt_deps_t wait1{static_cast<uint32_t>(wait_deps1.size()), wait_deps1.data()};
2842 const std::vector<ffrt_dependence_t> wait_deps2 = {{ffrt_dependence_task, task2}};
2843 ffrt_deps_t wait2{static_cast<uint32_t>(wait_deps2.size()), wait_deps2.data()};
2844 ffrt_wait_deps(&wait1);
2845 if (x != 1) {
2846 result = 1;
2847 }
2848 ffrt_wait_deps(&wait2);
2849 if (y != 1) {
2850 result = 2;
2851 }
2852 ffrt_task_handle_destroy(task1);
2853 ffrt_task_handle_destroy(task2);
2854 napi_value flag = nullptr;
2855 napi_create_double(env, result, &flag);
2856 return flag;
2857 }
2858
SubmitHOuDependNullptrTest(napi_env env,napi_callback_info info)2859 static napi_value SubmitHOuDependNullptrTest(napi_env env, napi_callback_info info)
2860 {
2861 int result = 0;
2862 const uint32_t sleepTime = 10 * 1000;
2863 int x = 0;
2864 int y = 0;
2865 std::function<void()>&& basic1Func = [&]() {
2866 x = x + 1;
2867 usleep(sleepTime);
2868 if (y != 0) {
2869 result = 1;
2870 }
2871 };
2872 std::function<void()>&& basic2Func = [&]() {
2873 y = y + 1;
2874 usleep(sleepTime);
2875 if (x != 1) {
2876 result = 2;
2877 }
2878 };
2879 ffrt_function_header_t* basic1Func_ht = create_function_wrapper((basic1Func));
2880 ffrt_function_header_t* basic2Func_ht = create_function_wrapper((basic2Func));
2881 const std::vector<ffrt_dependence_t> ou1_deps = {{ffrt_dependence_data, NULL}};
2882 ffrt_deps_t ou1{static_cast<uint32_t>(ou1_deps.size()), ou1_deps.data()};
2883 const std::vector<ffrt_dependence_t> ou2_deps = {{ffrt_dependence_data, NULL}};
2884 ffrt_deps_t ou2{static_cast<uint32_t>(ou2_deps.size()), ou2_deps.data()};
2885 ffrt_task_handle_t task1 = ffrt_submit_h_base(basic1Func_ht, nullptr, &ou1, nullptr);
2886 ffrt_task_handle_t task2 = ffrt_submit_h_base(basic2Func_ht, nullptr, &ou2, nullptr);
2887 const std::vector<ffrt_dependence_t> wait_deps1 = {{ffrt_dependence_task, task1}};
2888 ffrt_deps_t wait1{static_cast<uint32_t>(wait_deps1.size()), wait_deps1.data()};
2889 const std::vector<ffrt_dependence_t> wait_deps2 = {{ffrt_dependence_task, task2}};
2890 ffrt_deps_t wait2{static_cast<uint32_t>(wait_deps2.size()), wait_deps2.data()};
2891 ffrt_wait_deps(&wait1);
2892 if (x != 1) {
2893 result = 3;
2894 }
2895 ffrt_wait_deps(&wait2);
2896 if (y != 1) {
2897 result = 4;
2898 }
2899 ffrt_task_handle_destroy(task1);
2900 ffrt_task_handle_destroy(task2);
2901 napi_value flag = nullptr;
2902 napi_create_double(env, result, &flag);
2903 return flag;
2904 }
2905
2906
SleepForTest000(napi_env env,napi_callback_info info)2907 static napi_value SleepForTest000(napi_env env, napi_callback_info info)
2908 {
2909 int resultEnd = 0;
2910 // sleep 1ms,验证sleep时间的正确性
2911 double t;
2912 std::function<void()>&& func = [&]() {
2913 auto start = std::chrono::high_resolution_clock::now();
2914 ffrt_usleep(0);
2915 auto end = std::chrono::high_resolution_clock::now();
2916 std::chrono::duration<double, std::milli> elapsed = end-start;
2917 t = elapsed.count();
2918 };
2919 ffrt_submit_base(create_function_wrapper(func), nullptr, nullptr, nullptr);
2920 ffrt_wait();
2921 if (t <= 0 || t > 10) {
2922 resultEnd = 1;
2923 }
2924 napi_value flag = nullptr;
2925 napi_create_double(env, resultEnd, &flag);
2926 return flag;
2927 }
2928
SleepForTest001(napi_env env,napi_callback_info info)2929 static napi_value SleepForTest001(napi_env env, napi_callback_info info)
2930 {
2931 int resultEnd = 0;
2932 // sleep 1ms,验证sleep时间的正确性
2933 double t;
2934 std::function<void()>&& func = [&]() {
2935 auto start = std::chrono::high_resolution_clock::now();
2936 ffrt_usleep(1000);
2937 auto end = std::chrono::high_resolution_clock::now();
2938 std::chrono::duration<double, std::milli> elapsed = end-start;
2939 t = elapsed.count();
2940 };
2941 ffrt_submit_base(create_function_wrapper(func), nullptr, nullptr, nullptr);
2942 ffrt_wait();
2943 if (t <= 1 || t > 10) {
2944 resultEnd = 1;
2945 }
2946 napi_value flag = nullptr;
2947 napi_create_double(env, resultEnd, &flag);
2948 return flag;
2949 }
2950
TaskAttrAbnormalTest(napi_env env,napi_callback_info info)2951 static napi_value TaskAttrAbnormalTest(napi_env env, napi_callback_info info)
2952 {
2953 int result = 0;
2954 ffrt_task_attr_t attr;
2955 int ret = ffrt_task_attr_init(nullptr);
2956 if (ret != -1) {
2957 result = 1;
2958 }
2959 ret = ffrt_task_attr_init(&attr);
2960 ffrt_task_attr_set_qos(nullptr, static_cast<int>(ffrt_qos_default));
2961 ffrt_task_attr_set_name(nullptr, nullptr);
2962 ffrt_task_attr_set_delay(nullptr, 0);
2963 ffrt_qos_t ffrt_qos = ffrt_task_attr_get_qos(nullptr);
2964 if (ffrt_qos != ffrt_qos_default) {
2965 result = 2;
2966 }
2967 const char* name = ffrt_task_attr_get_name(nullptr);
2968 if (name != nullptr) {
2969 result = 3;
2970 }
2971 uint64_t delay = ffrt_task_attr_get_delay(nullptr);
2972 if (delay != 0) {
2973 result = 4;
2974 }
2975 ffrt_task_attr_destroy(nullptr);
2976 ffrt_task_attr_destroy(&attr);
2977 napi_value flag = nullptr;
2978 napi_create_double(env, result, &flag);
2979 return flag;
2980 }
2981
TaskAttrQosIllegalTest(napi_env env,napi_callback_info info)2982 static napi_value TaskAttrQosIllegalTest(napi_env env, napi_callback_info info)
2983 {
2984 int result = 0;
2985 ffrt_task_attr_t attr;
2986 ffrt_task_attr_init(&attr);
2987 int minVal = static_cast<int>(ffrt_qos_inherit) - 1;
2988 ffrt_task_attr_set_qos(&attr, minVal);
2989 int queryVal = int(ffrt_task_attr_get_qos(&attr));
2990 if (queryVal != -1) {
2991 result = 1;
2992 }
2993 ffrt_task_attr_destroy(&attr);
2994 napi_value flag = nullptr;
2995 napi_create_double(env, result, &flag);
2996 return flag;
2997 }
2998
TaskAttrQosQueryTest(napi_env env,napi_callback_info info)2999 static napi_value TaskAttrQosQueryTest(napi_env env, napi_callback_info info)
3000 {
3001 int result = 0;
3002 ffrt_task_attr_t attr;
3003 ffrt_task_attr_get_qos(&attr);
3004 int ret = ffrt_task_attr_init(&attr);
3005 if (ret != 0) {
3006 result = 1;
3007 }
3008 int qosVal = ffrt_task_attr_get_qos(&attr);
3009 if (qosVal != ffrt_qos_default) {
3010 result = 2;
3011 }
3012 ffrt_task_attr_destroy(&attr);
3013 napi_value flag = nullptr;
3014 napi_create_double(env, result, &flag);
3015 return flag;
3016 }
3017
TaskAttrSetNameTest(napi_env env,napi_callback_info info)3018 static napi_value TaskAttrSetNameTest(napi_env env, napi_callback_info info)
3019 {
3020 int result = 0;
3021 ffrt_task_attr_t attr;
3022 (void)ffrt_task_attr_init(&attr);
3023 std::string name(ffrt_task_attr_get_name(&attr));
3024 if (name != "") {
3025 result = 1;
3026 }
3027 ffrt_task_attr_set_name(&attr, "Task Name");
3028 std::string reName(ffrt_task_attr_get_name(&attr));
3029 if (reName != "Task Name") {
3030 result = 2;
3031 }
3032 ffrt_task_attr_destroy(&attr);
3033 std::string desName(ffrt_task_attr_get_name(&attr));
3034 napi_value flag = nullptr;
3035 napi_create_double(env, result, &flag);
3036 return flag;
3037 }
3038
TaskAttrSetQosTest(napi_env env,napi_callback_info info)3039 static napi_value TaskAttrSetQosTest(napi_env env, napi_callback_info info)
3040 {
3041 int result = 0;
3042 ffrt_task_attr_t attr;
3043 ffrt_task_attr_init(&attr);
3044 int minLevel = static_cast<int>(ffrt_qos_inherit);
3045 int maxLevel = static_cast<int>(ffrt_qos_user_initiated);
3046 for (int idx = minLevel; idx <= maxLevel; idx++) {
3047 ffrt_task_attr_set_qos(&attr, idx);
3048 int qosVal = int(ffrt_task_attr_get_qos(&attr));
3049 if (qosVal != idx) {
3050 result = idx + 2;
3051 }
3052 }
3053 ffrt_task_attr_destroy(&attr);
3054 napi_value flag = nullptr;
3055 napi_create_double(env, result, &flag);
3056 return flag;
3057 }
3058
3059 typedef struct {
3060 int timerId;
3061 int result;
3062 uint64_t timeout;
3063 high_resolution_clock::time_point submitTime;
3064 high_resolution_clock::time_point dispatchTime;
3065 bool finish;
3066 } TimerDataT;
3067
StallUs(size_t us)3068 static inline void StallUs(size_t us)
3069 {
3070 auto start = std::chrono::system_clock::now();
3071 size_t passed = 0;
3072 while (passed < us) {
3073 passed = std::chrono::duration_cast<std::chrono::microseconds>
3074 (std::chrono::system_clock::now() - start).count();
3075 }
3076 }
3077
ThreadFunc(void * p)3078 void* ThreadFunc(void *p)
3079 {
3080 ffrt_loop_run(p);
3081 return nullptr;
3082 }
3083
TimerCb(void * data)3084 static void TimerCb(void *data)
3085 {
3086 printf("enter TimerCb\n");
3087 const double error = 100;
3088 TimerDataT *timerData = reinterpret_cast<TimerDataT *>(data);
3089 timerData->dispatchTime = high_resolution_clock::now();
3090 auto elapsed = std::chrono::duration_cast<std::chrono::milliseconds>(
3091 timerData->dispatchTime - timerData->submitTime);
3092 double realTimeVal = elapsed.count();
3093 if (realTimeVal < timerData->timeout - error || realTimeVal > timerData->timeout + error) {
3094 timerData->result += 1;
3095 }
3096 timerData->finish = true;
3097 }
3098
ffrt_timer_start_abnormal_0001(napi_env env,napi_callback_info info)3099 static napi_value ffrt_timer_start_abnormal_0001(napi_env env, napi_callback_info info)
3100 {
3101 high_resolution_clock::time_point startT = high_resolution_clock::now();
3102 TimerDataT timerData1 = {.timerId = 1, .timeout = 0, .submitTime = startT, .finish = false, .result = 0};
3103 int ret = ffrt_timer_start(-1, 0, reinterpret_cast<void *>(&timerData1), nullptr, false);
3104
3105 int result = 0;
3106 if (ret != -1) {
3107 result += 1;
3108 }
3109 napi_value flag = nullptr;
3110 napi_create_double(env, result, &flag);
3111 return flag;
3112 }
3113
ffrt_timer_start_0001(napi_env env,napi_callback_info info)3114 static napi_value ffrt_timer_start_0001(napi_env env, napi_callback_info info)
3115 {
3116 high_resolution_clock::time_point startT = high_resolution_clock::now();
3117 TimerDataT timerData1 = {.timerId = 1, .timeout = 0, .submitTime = startT, .finish = false, .result = 0};
3118 ffrt_timer_start(ffrt_qos_default, 0, reinterpret_cast<void *>(&timerData1), TimerCb, false);
3119 bool finish = false;
3120 while (!finish) {
3121 usleep(1);
3122 bool flag = false;
3123 if (timerData1.finish) {
3124 flag = true;
3125 }
3126 finish = (flag == true ? true : false);
3127 }
3128 napi_value flag = nullptr;
3129 napi_create_double(env, timerData1.result, &flag);
3130 return flag;
3131 }
3132
ffrt_timer_start_0002(napi_env env,napi_callback_info info)3133 static napi_value ffrt_timer_start_0002(napi_env env, napi_callback_info info)
3134 {
3135 const int timerCount = 100;
3136 bool finish = false;
3137 TimerDataT timerData[timerCount];
3138 high_resolution_clock::time_point startT = high_resolution_clock::now();
3139 ffrt_qos_default_t qos_type[5] = {ffrt_qos_inherit, ffrt_qos_background, ffrt_qos_utility,
3140 ffrt_qos_default, ffrt_qos_user_initiated};
3141 for (int i = 0; i < timerCount; ++i) {
3142 uint64_t timeout = 0;
3143 const int mod1 = 500;
3144 const int mod2 = 5;
3145 timeout = rand() % mod1;
3146 int qosidx = rand() % mod2;
3147 timerData[i] = {.timerId = i, .timeout = timeout, .submitTime = startT, .finish = false, .result = 0};
3148 ffrt_timer_start(qos_type[qosidx], timeout, (void *)&timerData[i], TimerCb, false);
3149 }
3150
3151 while (!finish) {
3152 usleep(1);
3153 bool flag = true;
3154 for (int i = 0; i < timerCount; ++i) {
3155 flag = (flag && timerData[i].finish);
3156 }
3157 finish = flag == true ? true : false;
3158 }
3159 napi_value flag = nullptr;
3160 for (int i = 0; i < timerCount; ++i) {
3161 flag = nullptr;
3162 napi_create_double(env, timerData[i].result, &flag);
3163 }
3164 return flag;
3165 }
3166
TimerCbCancel(void * data)3167 static void TimerCbCancel(void *data)
3168 {
3169 printf("enter TimerCbCancel\n");
3170 const uint32_t slpTime = 500 * 1000;
3171 StallUs(slpTime);
3172 TimerDataT *timerData = reinterpret_cast<TimerDataT *>(data);
3173 timerData->finish = true;
3174 }
3175
ffrt_timer_cancel_0001(napi_env env,napi_callback_info info)3176 static napi_value ffrt_timer_cancel_0001(napi_env env, napi_callback_info info)
3177 {
3178 const uint32_t delayTime = 2000;
3179 TimerDataT timerData = { .finish = false, .result = 0};
3180 int handle = ffrt_timer_start(ffrt_qos_default, delayTime, reinterpret_cast<void *>(&timerData),
3181 TimerCbCancel, false);
3182 int abnormalHandle = handle + 1;
3183 ffrt_timer_stop(ffrt_qos_default, abnormalHandle);
3184 ffrt_timer_stop(ffrt_qos_default, handle);
3185 ffrt_timer_stop(ffrt_qos_default, handle);
3186 if (timerData.finish != false) {
3187 timerData.result += 1;
3188 }
3189 napi_value flag = nullptr;
3190 napi_create_double(env, timerData.result, &flag);
3191 return flag;
3192 }
3193
ffrt_loop_abnormal_0001(napi_env env,napi_callback_info info)3194 static napi_value ffrt_loop_abnormal_0001(napi_env env, napi_callback_info info)
3195 {
3196 ffrt_queue_attr_t queue_attr;
3197 (void)ffrt_queue_attr_init(&queue_attr);
3198 ffrt_queue_t queue_handle = ffrt_queue_create(ffrt_queue_concurrent, "test_queue", &queue_attr);
3199
3200 int result2 = 0;
3201 const int addnum = 20;
3202 std::function<void()>&& basicFunc2 = [&result2]() {result2 += addnum;};
3203 auto loop = ffrt_loop_create(queue_handle);
3204
3205 int result = 0;
3206 if (loop == nullptr) {
3207 result += 1;
3208 }
3209
3210 ffrt_queue_attr_destroy(&queue_attr);
3211 ffrt_queue_destroy(queue_handle);
3212 napi_value flag = nullptr;
3213 napi_create_double(env, result, &flag);
3214 return flag;
3215 }
3216
ffrt_loop_abnormal_0002(napi_env env,napi_callback_info info)3217 static napi_value ffrt_loop_abnormal_0002(napi_env env, napi_callback_info info)
3218 {
3219 auto loop = ffrt_loop_create(nullptr);
3220 int result = 0;
3221 if (loop != nullptr) {
3222 result += 1;
3223 }
3224 int res2 = ffrt_loop_destroy(loop);
3225 if (res2 != -1) {
3226 result += 1;
3227 }
3228 int res3 = ffrt_loop_run(loop);
3229 if (res3 != -1) {
3230 result += 1;
3231 }
3232 auto res4 = ffrt_queue_attr_get_max_concurrency(nullptr);
3233 if (res4 != 0) {
3234 result += 1;
3235 }
3236 napi_value flag = nullptr;
3237 napi_create_double(env, result, &flag);
3238 return flag;
3239 }
3240
ffrt_loop_0001(napi_env env,napi_callback_info info)3241 static napi_value ffrt_loop_0001(napi_env env, napi_callback_info info)
3242 {
3243 ffrt_queue_attr_t queue_attr;
3244 (void)ffrt_queue_attr_init(&queue_attr);
3245 ffrt_queue_t queue_handle = ffrt_queue_create(ffrt_queue_concurrent, "test_queue", &queue_attr);
3246 auto loop = ffrt_loop_create(queue_handle);
3247 ffrt_task_attr_t task_attr;
3248 (void)ffrt_task_attr_init(&task_attr);
3249 ffrt_task_attr_set_delay(&task_attr, TASK_DELAY_TIME);
3250 int result1 = 0;
3251 const int loopCnt = 1000;
3252 std::function<void()>&& basicFunc1 = [&result1]() {for (int i = 0; i < loopCnt; ++i) {result1 += 1;}};
3253 ffrt_task_handle_t task1 = ffrt_queue_submit_h(queue_handle,
3254 create_function_wrapper(basicFunc1, ffrt_function_kind_queue), &task_attr);
3255 pthread_t thread;
3256 pthread_create(&thread, 0, ThreadFunc, loop);
3257 int result2 = 0;
3258 const int addnum = 20;
3259 std::function<void()>&& basicFunc2 = [&result2]() {result2 += addnum;};
3260 ffrt_task_handle_t task2 = ffrt_queue_submit_h(queue_handle,
3261 create_function_wrapper(basicFunc2, ffrt_function_kind_queue), nullptr);
3262 ffrt_queue_wait(task1);
3263 ffrt_queue_wait(task2);
3264 int result = 0;
3265 if (result1 != loopCnt || result2 != addnum) {
3266 result = ERR_CODE_1;
3267 }
3268 int result3 = 0;
3269 std::function<void()>&& basicFunc3 = [&result3]() {result3 += addnum;};
3270 std::function<void()> &&SleepFunc = [] () {usleep(SLEEP_TIME);};
3271 ffrt_task_handle_t sleepTask = ffrt_queue_submit_h(queue_handle, create_function_wrapper(SleepFunc,
3272 ffrt_function_kind_queue), nullptr);
3273 ffrt_task_handle_t task3 = ffrt_queue_submit_h(queue_handle, create_function_wrapper(basicFunc3,
3274 ffrt_function_kind_queue), nullptr);
3275 int ret = ffrt_queue_cancel(task3);
3276 if (ret != 0 || result3 != 0) {
3277 result = ERR_CODE_2;
3278 }
3279 ffrt_queue_wait(sleepTask);
3280 ffrt_loop_stop(loop);
3281 pthread_join(thread, nullptr);
3282 int destoryRet = ffrt_loop_destroy(loop);
3283 if (destoryRet != 0) {
3284 result = ERR_CODE_3;
3285 }
3286 ffrt_queue_attr_destroy(&queue_attr);
3287 ffrt_queue_destroy(queue_handle);
3288 napi_value flag = nullptr;
3289 napi_create_double(env, result, &flag);
3290 return flag;
3291 }
3292
ffrt_loop_0002(napi_env env,napi_callback_info info)3293 static napi_value ffrt_loop_0002(napi_env env, napi_callback_info info)
3294 {
3295 ffrt_queue_attr_t queue_attr;
3296 (void)ffrt_queue_attr_init(&queue_attr);
3297 ffrt_queue_t queue_handle = ffrt_queue_create(ffrt_queue_concurrent, "test_queue", &queue_attr);
3298 auto loop = ffrt_loop_create(queue_handle);
3299 pthread_t thread;
3300 pthread_create(&thread, 0, ThreadFunc, loop);
3301
3302 int result1 = 0;
3303 const int addTen = 10;
3304 std::function<void()>&& basicFunc1 = [&result1]() {result1 += addTen;};
3305 std::function<void()> &&SleepFunc = [] () {usleep(SLEEP_TIME);};
3306 ffrt_task_handle_t sleepTask = ffrt_queue_submit_h(queue_handle, create_function_wrapper(SleepFunc,
3307 ffrt_function_kind_queue), nullptr);
3308 ffrt_task_handle_t task1 = ffrt_queue_submit_h(queue_handle, create_function_wrapper(basicFunc1,
3309 ffrt_function_kind_queue), nullptr);
3310 int result = 0;
3311 int ret1 = ffrt_queue_cancel(task1);
3312 if (ret1 != 0) {
3313 result = ERR_CODE_1;
3314 }
3315 ffrt_queue_wait(sleepTask);
3316 int result2 = 0;
3317 const int addTwenty = 20;
3318 std::function<void()>&& basicFunc2 = [&result2]() {result2 += addTwenty;};
3319 ffrt_task_handle_t sleepTask2 = ffrt_queue_submit_h(queue_handle, create_function_wrapper(SleepFunc,
3320 ffrt_function_kind_queue), nullptr);
3321 ffrt_task_handle_t task2 = ffrt_queue_submit_h(queue_handle,
3322 create_function_wrapper(basicFunc2, ffrt_function_kind_queue), nullptr);
3323 int ret2 = ffrt_queue_cancel(task2);
3324 if (ret2 != 0) {
3325 result = ERR_CODE_2;
3326 }
3327 ffrt_queue_wait(sleepTask2);
3328 ffrt_loop_stop(loop);
3329 pthread_join(thread, nullptr);
3330 ffrt_loop_destroy(loop);
3331 ffrt_queue_attr_destroy(&queue_attr);
3332 ffrt_queue_destroy(queue_handle);
3333 napi_value flag = nullptr;
3334 napi_create_double(env, result, &flag);
3335 return flag;
3336 }
3337
ffrt_queue_parallel_api_0001(napi_env env,napi_callback_info info)3338 static napi_value ffrt_queue_parallel_api_0001(napi_env env, napi_callback_info info)
3339 {
3340 int result = 0;
3341 ffrt_queue_attr_t queue_attr;
3342 (void)ffrt_queue_attr_init(&queue_attr);
3343 const int maxConcurrency1 = 4;
3344 ffrt_queue_attr_set_max_concurrency(nullptr, maxConcurrency1);
3345 int concurrency = ffrt_queue_attr_get_max_concurrency(&queue_attr);
3346 if (concurrency != 1) {
3347 result += 1;
3348 }
3349
3350 const int maxConcurrency2 = 0;
3351 ffrt_queue_attr_set_max_concurrency(&queue_attr, maxConcurrency2);
3352 concurrency = ffrt_queue_attr_get_max_concurrency(&queue_attr);
3353 if (concurrency != 1) {
3354 result += 1;
3355 }
3356 const int maxConcurrency3 = 100;
3357 ffrt_queue_attr_set_max_concurrency(&queue_attr, maxConcurrency3);
3358 concurrency = ffrt_queue_attr_get_max_concurrency(&queue_attr);
3359 if (concurrency != maxConcurrency3) {
3360 result += 1;
3361 }
3362
3363 // 销毁队列
3364 ffrt_queue_attr_destroy(&queue_attr);
3365
3366 napi_value flag = nullptr;
3367 napi_create_double(env, result, &flag);
3368 return flag;
3369 }
3370
ffrt_queue_parallel_api_0002(napi_env env,napi_callback_info info)3371 static napi_value ffrt_queue_parallel_api_0002(napi_env env, napi_callback_info info)
3372 {
3373 int result = 0;
3374 const int pri = 4;
3375 ffrt_queue_attr_t queue_attr;
3376 (void)ffrt_queue_attr_init(&queue_attr);
3377 ffrt_queue_attr_set_max_concurrency(&queue_attr, pri);
3378 int concurrency = ffrt_queue_attr_get_max_concurrency(nullptr);
3379 if (concurrency != 0) {
3380 result += 1;
3381 }
3382 concurrency = ffrt_queue_attr_get_max_concurrency(&queue_attr);
3383 if (concurrency != pri) {
3384 result += 1;
3385 }
3386
3387 // 销毁队列
3388 ffrt_queue_attr_destroy(&queue_attr);
3389 napi_value flag = nullptr;
3390 napi_create_double(env, result, &flag);
3391 return flag;
3392 }
3393
ffrt_queue_parallel_api_0003(napi_env env,napi_callback_info info)3394 static napi_value ffrt_queue_parallel_api_0003(napi_env env, napi_callback_info info)
3395 {
3396 int result = 0;
3397 ffrt_task_attr_t task_attr;
3398 (void)ffrt_task_attr_init(&task_attr);
3399 ffrt_task_attr_set_queue_priority(nullptr, ffrt_queue_priority_immediate);
3400 int priority = ffrt_task_attr_get_queue_priority(&task_attr);
3401 if (priority != ffrt_queue_priority_low) {
3402 result += 1;
3403 }
3404
3405 ffrt_task_attr_set_queue_priority(&task_attr, ffrt_queue_priority_low);
3406 priority = ffrt_task_attr_get_queue_priority(&task_attr);
3407 if (priority != ffrt_queue_priority_low) {
3408 result += 1;
3409 }
3410
3411 ffrt_task_attr_set_queue_priority(&task_attr, ffrt_queue_priority_low);
3412 priority = ffrt_task_attr_get_queue_priority(&task_attr);
3413 if (priority != ffrt_queue_priority_low) {
3414 result += 1;
3415 }
3416
3417 ffrt_task_attr_set_queue_priority(&task_attr, ffrt_queue_priority_immediate);
3418 priority = ffrt_task_attr_get_queue_priority(&task_attr);
3419 if (priority != ffrt_queue_priority_immediate) {
3420 result += 1;
3421 }
3422
3423 ffrt_task_attr_set_queue_priority(&task_attr, ffrt_queue_priority_high);
3424 priority = ffrt_task_attr_get_queue_priority(&task_attr);
3425 if (priority != ffrt_queue_priority_high) {
3426 result += 1;
3427 }
3428
3429 ffrt_task_attr_set_queue_priority(&task_attr, ffrt_queue_priority_idle);
3430 priority = ffrt_task_attr_get_queue_priority(&task_attr);
3431 if (priority != ffrt_queue_priority_idle) {
3432 result += 1;
3433 }
3434
3435 ffrt_task_attr_set_queue_priority(&task_attr, ffrt_queue_priority_low);
3436 priority = ffrt_task_attr_get_queue_priority(&task_attr);
3437 if (priority != ffrt_queue_priority_low) {
3438 result += 1;
3439 }
3440
3441 const ffrt_queue_priority_t abnormal_pri = (ffrt_queue_priority_t)100;
3442 ffrt_task_attr_set_queue_priority(&task_attr, abnormal_pri);
3443 priority = ffrt_task_attr_get_queue_priority(&task_attr);
3444 if (priority != ffrt_queue_priority_low) {
3445 result += 1;
3446 }
3447 // 销毁队列
3448 ffrt_task_attr_destroy(&task_attr);
3449 napi_value flag = nullptr;
3450 napi_create_double(env, result, &flag);
3451 return flag;
3452 }
3453
ffrt_queue_parallel_api_0004(napi_env env,napi_callback_info info)3454 static napi_value ffrt_queue_parallel_api_0004(napi_env env, napi_callback_info info)
3455 {
3456 int result = 0;
3457 ffrt_task_attr_t task_attr;
3458 (void)ffrt_task_attr_init(&task_attr);
3459 ffrt_task_attr_set_queue_priority(&task_attr, ffrt_queue_priority_immediate);
3460 int priority = ffrt_task_attr_get_queue_priority(nullptr);
3461 if (priority != 0) {
3462 result += 1;
3463 }
3464
3465 priority = ffrt_task_attr_get_queue_priority(&task_attr);
3466 if (priority != ffrt_queue_priority_immediate) {
3467 result += 1;
3468 }
3469 // 销毁队列
3470 ffrt_task_attr_destroy(&task_attr);
3471 napi_value flag = nullptr;
3472 napi_create_double(env, result, &flag);
3473 return flag;
3474 }
3475
queue_parallel_cancel_0001(napi_env env,napi_callback_info info)3476 static napi_value queue_parallel_cancel_0001(napi_env env, napi_callback_info info)
3477 {
3478 int result = 0;
3479 const int taskRes = 9;
3480 ffrt_queue_attr_t queue_attr;
3481 (void)ffrt_queue_attr_init(&queue_attr);
3482 ffrt_queue_t queue_handle = ffrt_queue_create(ffrt_queue_concurrent, "test_queue", &queue_attr);
3483
3484 int res = 0;
3485 const uint32_t delayTime = 1000000;
3486 ffrt_task_attr_t task_attr;
3487 (void)ffrt_task_attr_init(&task_attr);
3488 ffrt_task_attr_set_delay(&task_attr, delayTime);
3489 std::function<void()> &&OnePlusFunc = [&res] () {OnePlusForTest((void *)(&res));};
3490
3491 ffrt_task_handle_t task1 = ffrt_queue_submit_h(queue_handle,
3492 create_function_wrapper(OnePlusFunc, ffrt_function_kind_queue), &task_attr);
3493
3494 int ret = ffrt_queue_cancel(task1);
3495 if (res != 0) {
3496 result += 1;
3497 }
3498 ret = ffrt_queue_cancel(task1);
3499 if (ret != 1) {
3500 result += 1;
3501 }
3502
3503 std::function<void()> &&MultipleFunc = [&res] () {MultipleForTest((void *)(&res));};
3504 std::function<void()> &&OneSubFunc = [&res] () {SubForTest((void *)(&res));};
3505 ffrt_queue_submit_h(queue_handle, create_function_wrapper(OnePlusFunc, ffrt_function_kind_queue), nullptr);
3506 ffrt_queue_submit_h(queue_handle, create_function_wrapper(MultipleFunc, ffrt_function_kind_queue), nullptr);
3507 ffrt_task_handle_t task3 = ffrt_queue_submit_h(queue_handle,
3508 create_function_wrapper(OneSubFunc, ffrt_function_kind_queue), nullptr);
3509 ffrt_queue_wait(task3);
3510 if (res != taskRes) {
3511 result += 1;
3512 }
3513
3514 ffrt_task_attr_destroy(&task_attr);
3515 ffrt_task_handle_destroy(task1);
3516 ffrt_task_handle_destroy(task3);
3517
3518 ffrt_queue_attr_destroy(&queue_attr);
3519 ffrt_queue_destroy(queue_handle);
3520
3521 napi_value flag = nullptr;
3522 napi_create_double(env, result, &flag);
3523 return flag;
3524 }
3525
queue_parallel_cancel_0002(napi_env env,napi_callback_info info)3526 static napi_value queue_parallel_cancel_0002(napi_env env, napi_callback_info info)
3527 {
3528 int result = 0;
3529 const uint32_t delayTime = 2000;
3530 ffrt_queue_attr_t queue_attr;
3531 (void)ffrt_queue_attr_init(&queue_attr);
3532 ffrt_queue_t queue_handle = ffrt_queue_create(ffrt_queue_concurrent, "test_queue", &queue_attr);
3533
3534 int res = 0;
3535 std::function<void()> &&OnePlusFfrtSleepFunc = [&res] () {OnePlusSleepForTest((void *)(&res));};
3536 ffrt_task_handle_t task1 = ffrt_queue_submit_h(queue_handle,
3537 create_function_wrapper(OnePlusFfrtSleepFunc, ffrt_function_kind_queue), nullptr);
3538
3539 usleep(delayTime);
3540 ffrt_queue_cancel(task1);
3541 if (res != 0) {
3542 result += 1;
3543 }
3544 ffrt_queue_wait(task1);
3545 if (res != 1) {
3546 result += 1;
3547 }
3548
3549 ffrt_task_handle_destroy(task1);
3550 ffrt_queue_attr_destroy(&queue_attr);
3551 ffrt_queue_destroy(queue_handle);
3552
3553 napi_value flag = nullptr;
3554 napi_create_double(env, result, &flag);
3555 return flag;
3556 }
3557
queue_parallel_0001(napi_env env,napi_callback_info info)3558 static napi_value queue_parallel_0001(napi_env env, napi_callback_info info)
3559 {
3560 int result = 0;
3561 const int taskRes = 9;
3562 ffrt_queue_attr_t queue_attr;
3563 (void)ffrt_queue_attr_init(&queue_attr);
3564 ffrt_queue_t queue_handle = ffrt_queue_create(ffrt_queue_concurrent, "test_queue", &queue_attr);
3565
3566 int res = 0;
3567 const uint32_t delayTime = 2000;
3568
3569 std::function<void()> &&OnePlusFunc = [&res] () {OnePlusForTest((void *)(&res));};
3570 std::function<void()> &&MultipleFunc = [&res] () {MultipleForTest((void *)(&res));};
3571 std::function<void()> &&OneSubFunc = [&res] () {SubForTest((void *)(&res));};
3572
3573 ffrt_queue_submit(queue_handle, create_function_wrapper(OnePlusFunc, ffrt_function_kind_queue), nullptr);
3574 ffrt_queue_submit(queue_handle, create_function_wrapper(MultipleFunc, ffrt_function_kind_queue), nullptr);
3575 ffrt_task_handle_t task3 = ffrt_queue_submit_h(queue_handle,
3576 create_function_wrapper(OneSubFunc, ffrt_function_kind_queue), nullptr);
3577 ffrt_queue_wait(task3);
3578 if (res != taskRes) {
3579 result += 1;
3580 }
3581 usleep(delayTime);
3582 int concurrency = ffrt_queue_attr_get_max_concurrency(&queue_attr);
3583 if (concurrency != 1) {
3584 result += 1;
3585 }
3586
3587 ffrt_task_handle_destroy(task3);
3588 ffrt_queue_attr_destroy(&queue_attr);
3589 ffrt_queue_destroy(queue_handle);
3590
3591 napi_value flag = nullptr;
3592 napi_create_double(env, result, &flag);
3593 return flag;
3594 }
3595
DivForTest(void * data)3596 inline void DivForTest(void *data)
3597 {
3598 const int div = 3;
3599 (*static_cast<int*>(data)) /= div;
3600 }
3601
TwoPlusForTest(void * data)3602 inline void TwoPlusForTest(void *data)
3603 {
3604 const int plus = 2;
3605 (*static_cast<int*>(data)) += plus;
3606 }
3607
TwoSubForTest(void * data)3608 inline void TwoSubForTest(void *data)
3609 {
3610 const int sub = 2;
3611 (*static_cast<int*>(data)) -= sub;
3612 }
3613
queue_parallel_0002(napi_env env,napi_callback_info info)3614 static napi_value queue_parallel_0002(napi_env env, napi_callback_info info)
3615 {
3616 int result = 0;
3617 const int maxConcurrency = 1;
3618 const int taskRes = 9;
3619 ffrt_queue_attr_t queue_attr;
3620 (void)ffrt_queue_attr_init(&queue_attr);
3621 ffrt_queue_attr_set_max_concurrency(&queue_attr, maxConcurrency);
3622 ffrt_queue_t queue_handle = ffrt_queue_create(ffrt_queue_concurrent, "test_queue", &queue_attr);
3623
3624 int res = 3;
3625 ffrt_task_handle_t task;
3626 std::function<void()> &&DivFunc = [&res] () {DivForTest((void *)(&res));};
3627 std::function<void()> &&MultipleFunc = [&res] () {MultipleForTest((void *)(&res));};
3628 std::function<void()> &&OnePlusFunc = [&res] () {OnePlusForTest((void *)(&res));};
3629 std::function<void()> &&SubFunc = [&res] () {SubForTest((void *)(&res));};
3630 std::function<void()> &&TwoPlusFunc = [&res] () {TwoPlusForTest((void *)(&res));};
3631 std::function<void()> &&TwoSubFunc = [&res] () {TwoSubForTest((void *)(&res));};
3632 std::function<void()> &&SleepFunc = [] () {sleep(1);};
3633
3634 const int taskCnt = 6;
3635 ffrt_task_attr_t task_attr[taskCnt];
3636 for (int i = 0; i < taskCnt; ++i) {
3637 (void)ffrt_task_attr_init(&task_attr[i]);
3638
3639 const ffrt_queue_priority_t pri = (ffrt_queue_priority_t)(taskCnt - i);
3640 ffrt_task_attr_set_queue_priority(&task_attr[i], pri);
3641 }
3642 ffrt_task_attr_t task_attr_tmp;
3643 (void)ffrt_task_attr_init(&task_attr_tmp);
3644 ffrt_task_attr_set_queue_priority(&task_attr_tmp, ffrt_queue_priority_immediate);
3645 ffrt_queue_submit(queue_handle, create_function_wrapper(SleepFunc, ffrt_function_kind_queue), &task_attr_tmp);
3646 ffrt_queue_submit(queue_handle, create_function_wrapper(TwoSubFunc, ffrt_function_kind_queue), &task_attr[0]);
3647 ffrt_queue_submit(queue_handle, create_function_wrapper(OnePlusFunc, ffrt_function_kind_queue), &task_attr[1]);
3648 ffrt_queue_submit(queue_handle, create_function_wrapper(DivFunc, ffrt_function_kind_queue), &task_attr[2]);
3649 int waitIdex = 3;
3650 task = ffrt_queue_submit_h(queue_handle, create_function_wrapper(
3651 SubFunc, ffrt_function_kind_queue), &task_attr[waitIdex]);
3652 ffrt_queue_submit(queue_handle, create_function_wrapper(MultipleFunc, ffrt_function_kind_queue), &task_attr[4]);
3653 ffrt_queue_submit(queue_handle, create_function_wrapper(TwoPlusFunc, ffrt_function_kind_queue), &task_attr[5]);
3654
3655 ffrt_queue_wait(task);
3656 if (res != taskRes) {
3657 result += 1;
3658 }
3659 for (int i = 0; i < taskCnt; ++i) {
3660 (void) ffrt_task_attr_destroy(&task_attr[i]);
3661 }
3662 ffrt_task_handle_destroy(task);
3663 ffrt_queue_attr_destroy(&queue_attr);
3664 ffrt_queue_destroy(queue_handle);
3665
3666 napi_value flag = nullptr;
3667 napi_create_double(env, result, &flag);
3668 return flag;
3669 }
3670
Testfun(void * data)3671 static void Testfun(void* data)
3672 {
3673 *(int*)data += 1;
3674 printf("%d, timeout callback\n", *(int*)data);
3675 }
3676
3677 static void (*g_cb)(void*) = Testfun;
3678
3679 struct TestData {
3680 int fd;
3681 uint64_t expected;
3682 };
3683
TestCallBack(void * token,uint32_t event)3684 static void TestCallBack(void* token, uint32_t event)
3685 {
3686 printf("g_cb done\n");
3687 }
3688
ffrt_loop_abnormal_0003(napi_env env,napi_callback_info info)3689 static napi_value ffrt_loop_abnormal_0003(napi_env env, napi_callback_info info)
3690 {
3691 int result = 0;
3692 int result1 = 0;
3693 std::function<void()>&& basicFunc1 = [&result1]() { result1 += 1; };
3694 auto loop = ffrt_loop_create(nullptr);
3695 if (loop != nullptr) {
3696 result += 1;
3697 }
3698 int res1 = ffrt_loop_destroy(loop);
3699 if (res1 != -1) {
3700 result += 1;
3701 }
3702 int res2 = ffrt_loop_run(loop);
3703 if (res2 != -1) {
3704 result += 1;
3705 }
3706 auto res5 = ffrt_queue_attr_get_max_concurrency(nullptr);
3707 if (res5 != 0) {
3708 result += 1;
3709 }
3710 int ret6 = ffrt_loop_timer_stop(loop, 0);
3711 if (ret6 != -1) {
3712 result += 1;
3713 }
3714
3715 napi_value flag = nullptr;
3716 napi_create_double(env, result, &flag);
3717 return flag;
3718 }
3719
ffrt_loop_normal_0003(napi_env env,napi_callback_info info)3720 static napi_value ffrt_loop_normal_0003(napi_env env, napi_callback_info info)
3721 {
3722 int result = 0;
3723 ffrt_queue_attr_t queue_attr;
3724 (void)ffrt_queue_attr_init(&queue_attr);
3725 ffrt_queue_t queue_handle = ffrt_queue_create(ffrt_queue_concurrent, "test_queue", &queue_attr);
3726 auto loop = ffrt_loop_create(queue_handle);
3727 int result1 = 0;
3728 std::function<void()>&& basicFunc1 = [&result1]() {
3729 int testNumber = 10;
3730 result1 += testNumber;
3731 };
3732 ffrt_task_handle_t task1 = ffrt_queue_submit_h(queue_handle,
3733 create_function_wrapper(basicFunc1, ffrt_function_kind_queue), nullptr);
3734 pthread_t thread;
3735 pthread_create(&thread, 0, ThreadFunc, loop);
3736 static int staticReslult = 0;
3737 int* xf = &staticReslult;
3738 void* data = xf;
3739 uint64_t timeout1 = 20;
3740 uint64_t timeout2 = 10;
3741 uint64_t expected = 0xabacadae;
3742 int testFd = eventfd(0, EFD_NONBLOCK | EFD_CLOEXEC);
3743 printf("testfd=%d\n", testFd);
3744 struct TestData testData{.fd = testFd, .expected = expected};
3745 int res1 = ffrt_loop_timer_start(loop, timeout1, data, g_cb, false);
3746 int res2 = ffrt_loop_timer_start(loop, timeout2, data, g_cb, false);
3747
3748 ffrt_loop_epoll_ctl(loop, 1, testFd, 0x00000001U, (void*)(&testData), TestCallBack);
3749 ssize_t n = write(testFd, &expected, sizeof(uint64_t));
3750 int sleepNumber = 25000;
3751 usleep(sleepNumber);
3752 ffrt_loop_epoll_ctl(loop, 1, testFd, 0, nullptr, nullptr);
3753 int testNumber4 = 2;
3754 int result2 = 0;
3755 std::function<void()>&& basicFunc2 = [&result2]() {
3756 int testNumber2 = 20;
3757 result2 += testNumber2;
3758 };
3759 ffrt_task_handle_t task2 = ffrt_queue_submit_h(queue_handle,
3760 create_function_wrapper(basicFunc2, ffrt_function_kind_queue), nullptr);
3761 ffrt_queue_wait(task1);
3762 ffrt_queue_wait(task2);
3763 int testNumber1 = 10;
3764 int testNumber3 = 20;
3765 if (res2 != 1 or res1 != 0 or result2 != testNumber3 or result1 != testNumber1 or
3766 n != sizeof(uint64_t) or staticReslult != testNumber4) {
3767 result += 1;
3768 }
3769 ffrt_loop_stop(loop);
3770 pthread_join(thread, nullptr);
3771 ffrt_queue_attr_destroy(&queue_attr);
3772 ffrt_queue_destroy(queue_handle);
3773 napi_value flag = nullptr;
3774 napi_create_double(env, result, &flag);
3775 return flag;
3776 }
3777
ffrt_get_main_queue_0001(napi_env env,napi_callback_info info)3778 static napi_value ffrt_get_main_queue_0001(napi_env env, napi_callback_info info)
3779 {
3780 int result = 0;
3781 //ffrt test case begin
3782 ffrt_queue_attr_t queue_attr;
3783 (void)ffrt_queue_attr_init(&queue_attr);
3784 ffrt_queue_t currentQueue = ffrt_get_main_queue();
3785 if (currentQueue == nullptr) {
3786 result += 1;
3787 }
3788 napi_value flag = nullptr;
3789 napi_create_double(env, result, &flag);
3790 return flag;
3791 }
ffrt_get_current_queue_0001(napi_env env,napi_callback_info info)3792 static napi_value ffrt_get_current_queue_0001(napi_env env, napi_callback_info info)
3793 {
3794 int result = 0;
3795 //ffrt test case begin
3796 ffrt_queue_attr_t queue_attr;
3797 (void)ffrt_queue_attr_init(&queue_attr);
3798 ffrt_queue_t currentQueue = ffrt_get_current_queue();
3799 if (currentQueue == nullptr) {
3800 result += 1;
3801 }
3802 napi_value flag = nullptr;
3803 napi_create_double(env, result, &flag);
3804 return flag;
3805 }
3806
ffrt_this_task_get_qos_0001(napi_env env,napi_callback_info info)3807 static napi_value ffrt_this_task_get_qos_0001(napi_env env, napi_callback_info info)
3808 {
3809 int result = 0;
3810 //ffrt test case begin
3811 ffrt_queue_attr_t queue_attr;
3812 (void)ffrt_queue_attr_init(&queue_attr);
3813 ffrt_queue_t currentQueue = ffrt_get_current_queue();
3814 ffrt_task_attr_t attr;
3815 ffrt_task_attr_init(&attr);
3816 ffrt_task_attr_set_qos(&attr, ffrt_qos_user_initiated);
3817 int result1 = 0;
3818 std::function<void()> &&basicFunc = [&result]() {
3819 ffrt_qos_t qos = ffrt_this_task_get_qos();
3820 if (qos != ffrt_qos_user_initiated) {
3821 result += 1;
3822 };
3823 };
3824 ffrt_queue_submit_h(currentQueue, create_function_wrapper(basicFunc, ffrt_function_kind_queue), &attr);
3825 napi_value flag = nullptr;
3826 napi_create_double(env, result, &flag);
3827 if (result1 != 1) {
3828 result += 1;
3829 }
3830 return flag;
3831 }
3832
ffrt_attr_stack_size_0001(napi_env env,napi_callback_info info)3833 static napi_value ffrt_attr_stack_size_0001(napi_env env, napi_callback_info info)
3834 {
3835 int result = 0;
3836 // 验证stack_size的set和get c接口
3837 int a = 0;
3838 ffrt_task_attr_t task_attr;
3839 (void)ffrt_task_attr_init(&task_attr);
3840 ffrt_task_attr_set_stack_size(&task_attr, UNIT_STACK_SIZE);
3841
3842 std::function<void()>&& OnePlusFunc = [&a]() { a += 1; };
3843 ffrt_task_handle_t task = ffrt_submit_h_base(create_function_wrapper(OnePlusFunc), {}, {}, &task_attr);
3844 const std::vector<ffrt_dependence_t> wait_deps = {{ffrt_dependence_task, task}};
3845 ffrt_deps_t wait{static_cast<uint32_t>(wait_deps.size()), wait_deps.data()};
3846 ffrt_wait_deps(&wait);
3847 if (a != 1) {
3848 result = ERR_CODE_1;
3849 }
3850
3851 uint64_t stackSize = ffrt_task_attr_get_stack_size(&task_attr);
3852 if (stackSize != UNIT_STACK_SIZE) {
3853 result = ERR_CODE_2;
3854 }
3855 ffrt_task_attr_destroy(&task_attr);
3856 ffrt_task_handle_destroy(task);
3857 napi_value flag = nullptr;
3858 napi_create_double(env, result, &flag);
3859 return flag;
3860 }
3861
ffrt_task_handle_ref_0001(napi_env env,napi_callback_info info)3862 static napi_value ffrt_task_handle_ref_0001(napi_env env, napi_callback_info info)
3863 {
3864 int result = 0;
3865 // 验证handle的set和get c接口
3866 int a = 0;
3867 ffrt_task_attr_t task_attr;
3868 (void)ffrt_task_attr_init(&task_attr);
3869 ffrt_task_attr_set_delay(&task_attr, UNIT_TASK_DELAY);
3870
3871 std::function<void()>&& OnePlusFunc = [&a]() { a += 1; };
3872 ffrt_task_handle_t task = ffrt_submit_h_base(create_function_wrapper(OnePlusFunc), {}, {}, &task_attr);
3873 uint32_t count = ffrt_task_handle_inc_ref(task);
3874 if (count != TASK_SUBMIT_REF) {
3875 result = ERR_CODE_1;
3876 }
3877 count = ffrt_task_handle_dec_ref(task);
3878 if (count != TASK_RELEASE_REF) {
3879 result = ERR_CODE_2;
3880 }
3881 const std::vector<ffrt_dependence_t> wait_deps = {{ffrt_dependence_task, task}};
3882 ffrt_deps_t wait{static_cast<uint32_t>(wait_deps.size()), wait_deps.data()};
3883 ffrt_wait_deps(&wait);
3884 if (a != 1) {
3885 result = ERR_CODE_3;
3886 }
3887 ffrt_task_attr_destroy(&task_attr);
3888 ffrt_task_handle_destroy(task);
3889 napi_value flag = nullptr;
3890 napi_create_double(env, result, &flag);
3891 return flag;
3892 }
3893
OnePlusForTestQos(void * arg)3894 inline void OnePlusForTestQos(void* arg)
3895 {
3896 *(int*)arg = ffrt_this_task_update_qos(ffrt_qos_background);
3897 *(int*)arg += PARAM_100;
3898 }
3899
OnePlusForGetIdTest(void * arg)3900 inline void OnePlusForGetIdTest(void* arg)
3901 {
3902 *(uint64_t*)arg = ffrt_this_task_get_id();
3903 }
3904
FfrtThisTaskGetId(napi_env env,napi_callback_info info)3905 static napi_value FfrtThisTaskGetId(napi_env env, napi_callback_info info)
3906 {
3907 uint64_t taskId = SUCCESS;
3908 std::function<void()>&& GetPidFunc = [&taskId]() { OnePlusForGetIdTest((void *)(&taskId)); };
3909 ffrt_submit_base(create_function_wrapper(GetPidFunc), nullptr, nullptr, nullptr);
3910 ffrt_wait();
3911 napi_value result = nullptr;
3912 napi_create_int32(env, taskId != SUCCESS, &result);
3913 return result;
3914 }
3915
FfrtThisTaskUpdateQos(napi_env env,napi_callback_info info)3916 static napi_value FfrtThisTaskUpdateQos(napi_env env, napi_callback_info info)
3917 {
3918 int pos = FAIL;
3919 std::function<void()>&& UpdateQosFunc = [&pos]() { OnePlusForTestQos((void *)(&pos)); };
3920 ffrt_submit_base(create_function_wrapper(UpdateQosFunc), nullptr, nullptr, nullptr);
3921 ffrt_wait();
3922 napi_value result = nullptr;
3923 napi_create_int32(env, pos, &result);
3924 return result;
3925 }
3926
SuspendFunc(void * p)3927 static bool SuspendFunc([[maybe_unused]] void* p)
3928 {
3929 return true;
3930 }
3931
ffrt_fiber_001(napi_env env,napi_callback_info info)3932 static napi_value ffrt_fiber_001(napi_env env, napi_callback_info info)
3933 {
3934 constexpr uint64_t stackSize = 16 * 1024;
3935 std::array<char, stackSize> stack;
3936 using fiber_t = ffrt::Fiber<>;
3937 std::atomic<int> a = {0};
3938 auto t = fiber_t::Init([&a] {
3939 for (int i = 0; i < 10; i++) {
3940 a++;
3941 fiber_t::Suspend(SuspendFunc);
3942 }
3943 }, &stack, stackSize);
3944 t->Start();
3945
3946 napi_value result;
3947 napi_create_double(env, a.load(), &result);
3948 return result;
3949 }
3950
3951 EXTERN_C_START
Init(napi_env env,napi_value exports)3952 static napi_value Init(napi_env env, napi_value exports)
3953 {
3954 napi_property_descriptor desc[] = {
3955 { "conditionVariableTest001", nullptr, ConditionVariableTest001, nullptr, nullptr, nullptr,
3956 napi_default, nullptr },
3957 { "conditionVariableTest002", nullptr, ConditionVariableTest002, nullptr, nullptr, nullptr,
3958 napi_default, nullptr },
3959 { "conditionVariableTest003", nullptr, ConditionVariableTest003, nullptr, nullptr, nullptr,
3960 napi_default, nullptr },
3961 { "conditionVariableTest004", nullptr, ConditionVariableTest004, nullptr, nullptr, nullptr,
3962 napi_default, nullptr },
3963 { "conditionVariableApiTest001", nullptr, ConditionVariableApiTest001, nullptr, nullptr, nullptr,
3964 napi_default, nullptr },
3965 { "conditionVariableApiTest002", nullptr, ConditionVariableApiTest002, nullptr, nullptr, nullptr,
3966 napi_default, nullptr },
3967 { "conditionVariableApiTest003", nullptr, ConditionVariableApiTest003, nullptr, nullptr, nullptr,
3968 napi_default, nullptr },
3969 { "conditionVariableApiTest004", nullptr, ConditionVariableApiTest004, nullptr, nullptr, nullptr,
3970 napi_default, nullptr },
3971 { "delayCTest001", nullptr, DelayCTest001, nullptr, nullptr, nullptr, napi_default, nullptr },
3972 { "ffrtYieldC0001", nullptr, FfrtYieldC0001, nullptr, nullptr, nullptr, napi_default, nullptr },
3973 { "recursiveMutexAbnormalParamTest001", nullptr, RecursiveMutexAbnormalParamTest001, nullptr,
3974 nullptr, nullptr, napi_default, nullptr },
3975 { "recursiveMutexAbnormalInvalidParamTest001", nullptr, RecursiveMutexAbnormalInvalidParamTest001, nullptr,
3976 nullptr, nullptr, napi_default, nullptr },
3977 { "mutexAbnormalParamTest001", nullptr, MutexAbnormalParamTest001, nullptr, nullptr, nullptr, napi_default, nullptr },
3978 { "mutexAbnormalParamTest002", nullptr, MutexAbnormalParamTest002, nullptr, nullptr, nullptr, napi_default, nullptr },
3979 { "mutexTest006", nullptr, MutexTest006, nullptr, nullptr, nullptr, napi_default, nullptr },
3980 { "mutexTest007", nullptr, MutexTest007, nullptr, nullptr, nullptr, napi_default, nullptr },
3981 { "mutexTest008", nullptr, MutexTest008, nullptr, nullptr, nullptr, napi_default, nullptr },
3982 { "queueApiTest001", nullptr, QueueApiTest001, nullptr, nullptr, nullptr, napi_default, nullptr },
3983 { "queueApiTest002", nullptr, QueueApiTest002, nullptr, nullptr, nullptr, napi_default, nullptr },
3984 { "queueApiTest003", nullptr, QueueApiTest003, nullptr, nullptr, nullptr, napi_default, nullptr },
3985 { "queueApiTest004", nullptr, QueueApiTest004, nullptr, nullptr, nullptr, napi_default, nullptr },
3986 { "queueApiTest005", nullptr, QueueApiTest005, nullptr, nullptr, nullptr, napi_default, nullptr },
3987 { "queueApiTest006", nullptr, QueueApiTest006, nullptr, nullptr, nullptr, napi_default, nullptr },
3988 { "queueApiTest007", nullptr, QueueApiTest007, nullptr, nullptr, nullptr, napi_default, nullptr },
3989 { "queueApiTest008", nullptr, QueueApiTest008, nullptr, nullptr, nullptr, napi_default, nullptr },
3990 { "queueApiTest009", nullptr, QueueApiTest009, nullptr, nullptr, nullptr, napi_default, nullptr },
3991 { "queueApiTest010", nullptr, QueueApiTest010, nullptr, nullptr, nullptr, napi_default, nullptr },
3992 { "queueApiTest011", nullptr, QueueApiTest011, nullptr, nullptr, nullptr, napi_default, nullptr },
3993 { "queueApiTest012", nullptr, QueueApiTest012, nullptr, nullptr, nullptr, napi_default, nullptr },
3994 { "queueApiTest013", nullptr, QueueApiTest013, nullptr, nullptr, nullptr, napi_default, nullptr },
3995 { "queueApiTest014", nullptr, QueueApiTest014, nullptr, nullptr, nullptr, napi_default, nullptr },
3996 { "queueApiTest015", nullptr, QueueApiTest015, nullptr, nullptr, nullptr, napi_default, nullptr },
3997 { "queueApiTest016", nullptr, QueueApiTest016, nullptr, nullptr, nullptr, napi_default, nullptr },
3998 { "queueCancelTest001", nullptr, QueueCancelTest001, nullptr, nullptr, nullptr, napi_default, nullptr },
3999 { "queueCancelTest003", nullptr, QueueCancelTest003, nullptr, nullptr, nullptr, napi_default, nullptr },
4000 { "queueCancelTest004", nullptr, QueueCancelTest004, nullptr, nullptr, nullptr, napi_default, nullptr },
4001 { "queueDelayTest001", nullptr, QueueDelayTest001, nullptr, nullptr, nullptr, napi_default, nullptr },
4002 { "queueDelayTest002", nullptr, QueueDelayTest002, nullptr, nullptr, nullptr, napi_default, nullptr },
4003 { "queueDelayTest005", nullptr, QueueDelayTest005, nullptr, nullptr, nullptr, napi_default, nullptr },
4004 { "queueDfxTest001", nullptr, QueueDfxTest001, nullptr, nullptr, nullptr, napi_default, nullptr },
4005 { "queueDfxTest002", nullptr, QueueDfxTest002, nullptr, nullptr, nullptr, napi_default, nullptr },
4006 { "queueDfxTest003", nullptr, QueueDfxTest003, nullptr, nullptr, nullptr, napi_default, nullptr },
4007 { "queueDfxTest004", nullptr, QueueDfxTest004, nullptr, nullptr, nullptr, napi_default, nullptr },
4008 { "queueDfxTest005", nullptr, QueueDfxTest005, nullptr, nullptr, nullptr, napi_default, nullptr },
4009 { "queueDfxTest006", nullptr, QueueDfxTest006, nullptr, nullptr, nullptr, napi_default, nullptr },
4010 { "queueTest001", nullptr, QueueTest001, nullptr, nullptr, nullptr, napi_default, nullptr },
4011 { "queueTest002", nullptr, QueueTest002, nullptr, nullptr, nullptr, napi_default, nullptr },
4012 { "queueTest003", nullptr, QueueTest003, nullptr, nullptr, nullptr, napi_default, nullptr },
4013 { "queueWaitTest001", nullptr, QueueWaitTest001, nullptr, nullptr, nullptr, napi_default, nullptr },
4014 { "submitAbnormalTest", nullptr, SubmitAbnormalTest, nullptr, nullptr, nullptr, napi_default, nullptr },
4015 { "submitBasicTest001", nullptr, SubmitBasicTest001, nullptr, nullptr, nullptr, napi_default, nullptr },
4016 { "submitBasicTest002", nullptr, SubmitBasicTest002, nullptr, nullptr, nullptr, napi_default, nullptr },
4017 { "submitInDependEmptyTest", nullptr, SubmitInDependEmptyTest, nullptr, nullptr, nullptr,
4018 napi_default, nullptr },
4019 { "submitInDependNullptrTest", nullptr, SubmitInDependNullptrTest, nullptr, nullptr, nullptr,
4020 napi_default, nullptr },
4021 { "submitOuDependEmptyTest", nullptr, SubmitOuDependEmptyTest, nullptr, nullptr, nullptr,
4022 napi_default, nullptr },
4023 { "submitOuDependNullptrTest", nullptr, SubmitOuDependNullptrTest, nullptr, nullptr, nullptr,
4024 napi_default, nullptr },
4025 { "submitIODependTest001", nullptr, SubmitIODependTest001, nullptr, nullptr, nullptr,
4026 napi_default, nullptr },
4027 { "submitIODependTest002", nullptr, SubmitIODependTest002, nullptr, nullptr, nullptr,
4028 napi_default, nullptr },
4029 { "submitIn0Ou0WaitNullTask1Test", nullptr, SubmitIn0Ou0WaitNullTask1Test, nullptr, nullptr, nullptr,
4030 napi_default, nullptr },
4031 { "submitHBasicTest001", nullptr, SubmitHBasicTest001, nullptr, nullptr, nullptr, napi_default, nullptr },
4032 { "submitHBasicTest002", nullptr, SubmitHBasicTest002, nullptr, nullptr, nullptr, napi_default, nullptr },
4033 { "submitHFTest001", nullptr, SubmitHFTest001, nullptr, nullptr, nullptr, napi_default, nullptr },
4034 { "submitFTest001", nullptr, SubmitFTest001, nullptr, nullptr, nullptr, napi_default, nullptr },
4035 { "submitHInDependEmptyTest", nullptr, SubmitHInDependEmptyTest, nullptr, nullptr, nullptr,
4036 napi_default, nullptr },
4037 { "submitHInDependNullptrTest", nullptr, SubmitHInDependNullptrTest, nullptr, nullptr, nullptr,
4038 napi_default, nullptr },
4039 { "submitHOuDependEmptyTest", nullptr, SubmitHOuDependEmptyTest, nullptr, nullptr, nullptr,
4040 napi_default, nullptr },
4041 { "submitHOuDependNullptrTest", nullptr, SubmitHOuDependNullptrTest, nullptr, nullptr, nullptr,
4042 napi_default, nullptr },
4043 { "submitHIODependTest001", nullptr, SubmitHIODependTest001, nullptr, nullptr, nullptr,
4044 napi_default, nullptr },
4045 { "submitHIODependTest002", nullptr, SubmitHIODependTest002, nullptr, nullptr, nullptr,
4046 napi_default, nullptr },
4047 { "sleepForTest000", nullptr, SleepForTest000, nullptr, nullptr, nullptr, napi_default, nullptr },
4048 { "sleepForTest001", nullptr, SleepForTest001, nullptr, nullptr, nullptr, napi_default, nullptr },
4049 { "taskAttrAbnormalTest", nullptr, TaskAttrAbnormalTest, nullptr, nullptr, nullptr, napi_default, nullptr },
4050 { "taskAttrQosIllegalTest", nullptr, TaskAttrQosIllegalTest, nullptr, nullptr, nullptr, napi_default, nullptr },
4051 { "taskAttrQosQueryTest", nullptr, TaskAttrQosQueryTest, nullptr, nullptr, nullptr, napi_default, nullptr },
4052 { "taskAttrSetNameTest", nullptr, TaskAttrSetNameTest, nullptr, nullptr, nullptr, napi_default, nullptr },
4053 { "taskAttrSetQosTest", nullptr, TaskAttrSetQosTest, nullptr, nullptr, nullptr, napi_default, nullptr },
4054 { "ffrt_timer_start_0001", nullptr, ffrt_timer_start_0001, nullptr, nullptr, nullptr, napi_default, nullptr },
4055 { "ffrt_timer_start_0002", nullptr, ffrt_timer_start_0002, nullptr, nullptr, nullptr, napi_default, nullptr },
4056 { "ffrt_timer_cancel_0001", nullptr, ffrt_timer_cancel_0001, nullptr, nullptr, nullptr, napi_default, nullptr },
4057 { "ffrt_loop_0001", nullptr, ffrt_loop_0001, nullptr, nullptr, nullptr, napi_default, nullptr },
4058 { "ffrt_loop_0002", nullptr, ffrt_loop_0002, nullptr, nullptr, nullptr, napi_default, nullptr },
4059 { "ffrt_timer_start_abnormal_0001", nullptr, ffrt_timer_start_abnormal_0001, nullptr,
4060 nullptr, nullptr, napi_default, nullptr },
4061 { "ffrt_loop_abnormal_0001", nullptr, ffrt_loop_abnormal_0001, nullptr, nullptr, nullptr,
4062 napi_default, nullptr },
4063 { "ffrt_loop_abnormal_0002", nullptr, ffrt_loop_abnormal_0002, nullptr, nullptr, nullptr,
4064 napi_default, nullptr },
4065 { "ffrt_queue_parallel_api_0001", nullptr, ffrt_queue_parallel_api_0001, nullptr, nullptr,
4066 nullptr, napi_default,
4067 nullptr },
4068 { "ffrt_queue_parallel_api_0002", nullptr, ffrt_queue_parallel_api_0002, nullptr, nullptr,
4069 nullptr, napi_default, nullptr },
4070 { "ffrt_queue_parallel_api_0003", nullptr, ffrt_queue_parallel_api_0003, nullptr, nullptr,
4071 nullptr, napi_default, nullptr },
4072 { "ffrt_queue_parallel_api_0004", nullptr, ffrt_queue_parallel_api_0004, nullptr, nullptr,
4073 nullptr, napi_default, nullptr },
4074 { "queue_parallel_cancel_0001", nullptr, queue_parallel_cancel_0001, nullptr, nullptr,
4075 nullptr, napi_default, nullptr },
4076 { "queue_parallel_cancel_0002", nullptr, queue_parallel_cancel_0002, nullptr, nullptr,
4077 nullptr, napi_default, nullptr },
4078 { "queue_parallel_0001", nullptr, queue_parallel_0001, nullptr, nullptr, nullptr, napi_default, nullptr },
4079 { "queue_parallel_0002", nullptr, queue_parallel_0002, nullptr, nullptr, nullptr, napi_default, nullptr },
4080 { "ffrt_loop_abnormal_0003", nullptr, ffrt_loop_abnormal_0003, nullptr, nullptr,
4081 nullptr, napi_default, nullptr },
4082 { "ffrt_loop_normal_0003", nullptr, ffrt_loop_normal_0003, nullptr, nullptr,
4083 nullptr, napi_default, nullptr },
4084 { "ffrt_get_main_queue_0001", nullptr, ffrt_get_main_queue_0001, nullptr, nullptr,
4085 nullptr, napi_default, nullptr },
4086 { "ffrt_get_current_queue_0001", nullptr, ffrt_get_current_queue_0001, nullptr, nullptr,
4087 nullptr, napi_default, nullptr },
4088 { "ffrt_this_task_get_qos_0001", nullptr, ffrt_this_task_get_qos_0001, nullptr, nullptr,
4089 nullptr, napi_default, nullptr },
4090 { "ffrt_attr_stack_size_0001", nullptr, ffrt_attr_stack_size_0001, nullptr, nullptr,
4091 nullptr, napi_default, nullptr },
4092 { "ffrt_task_handle_ref_0001", nullptr, ffrt_task_handle_ref_0001, nullptr, nullptr,
4093 nullptr, napi_default, nullptr },
4094 { "ffrtThisTaskGetId", nullptr, FfrtThisTaskGetId, nullptr, nullptr, nullptr, napi_default, nullptr },
4095 { "ffrtThisTaskUpdateQos", nullptr, FfrtThisTaskUpdateQos, nullptr, nullptr, nullptr, napi_default, nullptr },
4096 { "sharedMutexTest001", nullptr, SharedMutexTest001, nullptr, nullptr, nullptr, napi_default, nullptr },
4097 { "ffrt_fiber_001", nullptr, ffrt_fiber_001, nullptr, nullptr, nullptr, napi_default, nullptr }
4098 };
4099 napi_define_properties(env, exports, sizeof(desc) / sizeof(desc[0]), desc);
4100 return exports;
4101 }
4102 EXTERN_C_END
4103
4104 static napi_module demoModule = {
4105 .nm_version =1,
4106 .nm_flags = 0,
4107 .nm_filename = nullptr,
4108 .nm_register_func = Init,
4109 .nm_modname = "entry",
4110 .nm_priv = ((void*)0),
4111 .reserved = { 0 },
4112 };
4113
RegisterEntryModule(void)4114 extern "C" __attribute__((constructor)) void RegisterEntryModule(void)
4115 {
4116 napi_module_register(&demoModule);
4117 }
4118