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 "c/task.h"
18 #include "c/type_def.h"
19 #include "c/condition_variable.h"
20 #include "c/mutex.h"
21 #include "c/queue.h"
22 #include "c/sleep.h"
23 #include <mutex>
24 #include <thread>
25 #include <string>
26 #include <unistd.h>
27 #include <pthread.h>
28
OnePlusForTest(void * arg)29 void OnePlusForTest(void* arg)
30 {
31 (*static_cast<int*>(arg)) += 1;
32 }
33
MultipleForTest(void * arg)34 void MultipleForTest(void* arg)
35 {
36 (*static_cast<int*>(arg)) *= 10;
37 }
38
SubForTest(void * arg)39 void SubForTest(void* arg)
40 {
41 (*static_cast<int*>(arg)) -= 1;
42 }
43
OnePlusSleepForTest(void * arg)44 void OnePlusSleepForTest(void* arg)
45 {
46 ffrt_usleep(2000 * 1000);
47 (*static_cast<int*>(arg)) += 1;
48 }
49
50 typedef struct {
51 ffrt_cond_t* cond;
52 int* a;
53 int* b;
54 ffrt_mutex_t* lock_;
55 int* dur;
56 int* ret;
57 } CvMutex;
58
FuncWait1(void * arg)59 void FuncWait1(void* arg)
60 {
61 CvMutex* t = static_cast<CvMutex*>(arg);
62 int ret = ffrt_mutex_lock(t->lock_);
63 if (ret != ffrt_success) {
64 *t->ret = 1;
65 }
66
67 while (*t->a != 1) {
68 ret = ffrt_cond_wait(t->cond, t->lock_);
69 if (ret != ffrt_success) {
70 *t->ret = 2;
71 }
72 }
73 *t->b += 1;
74 ret = ffrt_mutex_unlock(t->lock_);
75 if (ret != ffrt_success) {
76 *t->ret = 3;
77 }
78 }
79
FuncWait2(void * arg)80 void FuncWait2(void* arg)
81 {
82 CvMutex* t = static_cast<CvMutex*>(arg);
83 int ret = ffrt_mutex_lock(t->lock_);
84 if (ret != ffrt_success) {
85 *t->ret = 1;
86 }
87
88 while (*t->a != 1) {
89 ret = ffrt_cond_wait(t->cond, t->lock_);
90 if (ret != ffrt_success) {
91 *t->ret = 2;
92 }
93 }
94 *t->b += 1;
95 ret = ffrt_mutex_unlock(t->lock_);
96 if (ret != ffrt_success) {
97 *t->ret = 3;
98 }
99 }
100
FuncWaitTimeout(void * arg)101 void FuncWaitTimeout(void* arg)
102 {
103 CvMutex* t = static_cast<CvMutex*>(arg);
104 int ret = ffrt_mutex_lock(t->lock_);
105 if (ret != ffrt_success) {
106 *t->ret = 1;
107 }
108 timespec ts;
109 clock_gettime(CLOCK_MONOTONIC, &ts);
110 ts.tv_sec += 1;
111
112 ret = ffrt_cond_timedwait(t->cond, t->lock_, &ts);
113 *t->ret = ret;
114 if (ret == ffrt_success) {
115 *(t->a) *= 10;
116 }
117 ret = ffrt_mutex_unlock(t->lock_);
118 }
119
FuncSignal(void * arg)120 void FuncSignal(void* arg)
121 {
122 ffrt_usleep(30000);
123 CvMutex* t = static_cast<CvMutex*>(arg);
124 int ret = ffrt_mutex_lock(t->lock_);
125 if (ret != ffrt_success) {
126 *t->ret = 1;
127 }
128 *(t->a) = 1;
129 ret = ffrt_cond_signal(t->cond);
130 if (ret != ffrt_success) {
131 *t->ret = 2;
132 }
133 ret = ffrt_mutex_unlock(t->lock_);
134 if (ret != ffrt_success) {
135 *t->ret = 3;
136 }
137 }
138
FuncBroadcast(void * arg)139 void FuncBroadcast(void* arg)
140 {
141 ffrt_usleep(100000);
142 CvMutex* t = static_cast<CvMutex*>(arg);
143 int ret = ffrt_mutex_lock(t->lock_);
144 if (ret != ffrt_success) {
145 *t->ret = 1;
146 }
147 *(t->a) = 1;
148 ret = ffrt_cond_broadcast(t->cond);
149 if (ret != ffrt_success) {
150 *t->ret = 2;
151 }
152 ret = ffrt_mutex_unlock(t->lock_);
153 if (ret != ffrt_success) {
154 *t->ret = 3;
155 }
156 }
157
FuncSignalApi(void * arg)158 void FuncSignalApi(void* arg)
159 {
160 ffrt_usleep(30000);
161 CvMutex* t = static_cast<CvMutex*>(arg);
162 int ret = ffrt_mutex_lock(t->lock_);
163 if (ret != ffrt_success) {
164 *t->ret = 1;
165 }
166 *(t->a) = 1;
167 ret = ffrt_cond_signal(nullptr);
168 if (ret != ffrt_error_inval) {
169 *t->ret = 4;
170 }
171 ret = ffrt_cond_signal(t->cond);
172 if (ret != ffrt_success) {
173 *t->ret = 2;
174 }
175 ret = ffrt_mutex_unlock(t->lock_);
176 if (ret != ffrt_success) {
177 *t->ret = 3;
178 }
179 }
180
FuncBroadcastApi(void * arg)181 void FuncBroadcastApi(void* arg)
182 {
183 ffrt_usleep(100000);
184 CvMutex* t = static_cast<CvMutex*>(arg);
185 int ret = ffrt_mutex_lock(t->lock_);
186 if (ret != ffrt_success) {
187 *t->ret = 1;
188 }
189 *(t->a) = 1;
190 ret = ffrt_cond_broadcast(nullptr);
191 if (ret != ffrt_error_inval) {
192 *t->ret = 4;
193 }
194 ret = ffrt_cond_broadcast(t->cond);
195 if (ret != ffrt_success) {
196 *t->ret = 2;
197 }
198 ret = ffrt_mutex_unlock(t->lock_);
199 if (ret != ffrt_success) {
200 *t->ret = 3;
201 }
202 }
203
FuncWaitApi(void * arg)204 void FuncWaitApi(void* arg)
205 {
206 CvMutex* t = static_cast<CvMutex*>(arg);
207 int ret = ffrt_mutex_lock(t->lock_);
208 if (ret != ffrt_success) {
209 *t->ret = 1;
210 }
211
212 ret = ffrt_cond_wait(nullptr, t->lock_);
213 if (ret != ffrt_error_inval) {
214 *t->ret = 4;
215 }
216 ret = ffrt_cond_wait(t->cond, nullptr);
217 if (ret != ffrt_error_inval) {
218 *t->ret = 5;
219 }
220 while (*t->a != 1) {
221 ret = ffrt_cond_wait(t->cond, t->lock_);
222 if (ret != ffrt_success) {
223 *t->ret = 2;
224 }
225 }
226 *t->b += 1;
227 ret = ffrt_mutex_unlock(t->lock_);
228 if (ret != ffrt_success) {
229 *t->ret = 3;
230 }
231 }
232
FuncWaitTimeoutApi(void * arg)233 void FuncWaitTimeoutApi(void* arg)
234 {
235 CvMutex* t = static_cast<CvMutex*>(arg);
236 int ret = ffrt_mutex_lock(t->lock_);
237 if (ret != ffrt_success) {
238 *t->ret = 1;
239 }
240 timespec ts;
241 clock_gettime(CLOCK_MONOTONIC, &ts);
242 ts.tv_sec += *t->dur;
243
244 ret = ffrt_cond_timedwait(nullptr, t->lock_, &ts);
245 if (ret != ffrt_error_inval) {
246 *t->ret = 4;
247 }
248 ret = ffrt_cond_timedwait(t->cond, nullptr, &ts);
249 if (ret != ffrt_error_inval) {
250 *t->ret = 5;
251 }
252 ret = ffrt_cond_timedwait(t->cond, t->lock_, nullptr);
253 if (ret != ffrt_error_inval) {
254 *t->ret = 6;
255 }
256 clock_gettime(CLOCK_MONOTONIC, &ts);
257 ts.tv_sec += *t->dur;
258 ret = ffrt_cond_timedwait(t->cond, t->lock_, &ts);
259 *t->ret = ret;
260 if (ret == ffrt_success) {
261 *(t->a) *= 10;
262 }
263 ret = ffrt_mutex_unlock(t->lock_);
264 if (ret != ffrt_success) {
265 *t->ret = 3;
266 }
267 }
268
269 typedef struct {
270 ffrt_function_header_t header;
271 ffrt_function_t func;
272 ffrt_function_t after_func;
273 void* arg;
274 } CFunction;
275
FfrtExecFunctionWrapper(void * t)276 static void FfrtExecFunctionWrapper(void* t)
277 {
278 CFunction* f = static_cast<CFunction*>(t);
279 if (f->func) {
280 f->func(f->arg);
281 }
282 }
283
FfrtDestroyFunctionWrapper(void * t)284 static void FfrtDestroyFunctionWrapper(void* t)
285 {
286 CFunction* f = static_cast<CFunction*>(t);
287 if (f->after_func) {
288 f->after_func(f->arg);
289 }
290 }
291
292 #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)293 static inline ffrt_function_header_t* ffrt_create_function_wrapper(const ffrt_function_t func,
294 const ffrt_function_t after_func, void* arg, ffrt_function_kind_t kind_t = ffrt_function_kind_general)
295 {
296 FFRT_STATIC_ASSERT(sizeof(CFunction) <= ffrt_auto_managed_function_storage_size,
297 size_of_function_must_be_less_than_ffrt_auto_managed_function_storage_size);
298 CFunction* f = static_cast<CFunction*>(ffrt_alloc_auto_managed_function_storage_base(kind_t));
299 f->header.exec = FfrtExecFunctionWrapper;
300 f->header.destroy = FfrtDestroyFunctionWrapper;
301 f->func = func;
302 f->after_func = after_func;
303 f->arg = arg;
304 return reinterpret_cast<ffrt_function_header_t*>(f);
305 }
306
307 template<class T>
308 struct Function {
309 template<class CT>
FunctionFunction310 Function(ffrt_function_header_t h, CT&& c) : header(h), closure(std::forward<CT>(c)) {}
311 ffrt_function_header_t header;
312 T closure;
313 };
314
315 template<class T>
ExecFunctionWrapper(void * t)316 void ExecFunctionWrapper(void* t)
317 {
318 auto f = reinterpret_cast<Function<std::decay_t<T>>*>(t);
319 f->closure();
320 }
321
322 template<class T>
DestroyFunctionWrapper(void * t)323 void DestroyFunctionWrapper(void* t)
324 {
325 auto f = reinterpret_cast<Function<std::decay_t<T>>*>(t);
326 f->closure = nullptr;
327 }
328
329 template<class T>
create_function_wrapper(T && func,ffrt_function_kind_t kind=ffrt_function_kind_general)330 static inline ffrt_function_header_t* create_function_wrapper(T&& func,
331 ffrt_function_kind_t kind = ffrt_function_kind_general)
332 {
333 using function_type = Function<std::decay_t<T>>;
334 auto p = ffrt_alloc_auto_managed_function_storage_base(kind);
335 auto f =
336 new (p)function_type({ ExecFunctionWrapper<T>, DestroyFunctionWrapper<T>, { 0 } }, std::forward<T>(func));
337 return reinterpret_cast<ffrt_function_header_t*>(f);
338 }
339
ConditionVariableTest001(napi_env env,napi_callback_info info)340 static napi_value ConditionVariableTest001(napi_env env, napi_callback_info info)
341 {
342 int resultEnd = 0;
343 //验证ffrt_cond_signal唤醒一个wait功能是否正确
344 ffrt_cond_t cond;
345 int ret = ffrt_cond_init(&cond, nullptr);
346 if (ret != ffrt_success) {
347 resultEnd = 7;
348 }
349
350 int a = 0;
351 int b = 0;
352 ffrt_mutex_t lock_;
353 CvMutex t = {&cond, &a, &b, &lock_, nullptr, nullptr};
354 ret = ffrt_mutex_init(&lock_, nullptr);
355 if (ret != ffrt_success) {
356 resultEnd = 8;
357 }
358
359 std::function<void()>&& FfrtFunc1 = [&t]() { FuncWait1(static_cast<void*>(&t)); };
360 ffrt_function_header_t* ffrt_func1 = create_function_wrapper((FfrtFunc1));
361 ffrt_submit_base(ffrt_func1, nullptr, nullptr, nullptr);
362 std::function<void()>&& FfrtFunc2 = [&t]() { FuncSignal(static_cast<void*>(&t)); };
363 ffrt_function_header_t* ffrt_func2 = create_function_wrapper((FfrtFunc2));
364 ffrt_submit_base(ffrt_func2, nullptr, nullptr, nullptr);
365 ffrt_wait();
366 if (*(t.b) != 1) {
367 resultEnd = 9;
368 }
369 if (t.ret != nullptr) {
370 resultEnd = *(t.ret);
371 }
372 ffrt_cond_destroy(&cond);
373 ffrt_mutex_destroy(&lock_);
374 napi_value flag = nullptr;
375 napi_create_double(env, resultEnd, &flag);
376 return flag;
377 }
378
ConditionVariableTest002(napi_env env,napi_callback_info info)379 static napi_value ConditionVariableTest002(napi_env env, napi_callback_info info)
380 {
381 int resultEnd = 0;
382 // 验证ffrt_cond_broadcast唤醒一个wait功能是否正确
383 ffrt_cond_t cond;
384 int ret = ffrt_cond_init(&cond, nullptr);
385 if (ret != ffrt_success) {
386 resultEnd = 7;
387 }
388
389 int a = 0;
390 int b = 0;
391 ffrt_mutex_t lock_;
392 CvMutex t = {&cond, &a, &b, &lock_, nullptr, nullptr};
393 ret = ffrt_mutex_init(&lock_, nullptr);
394 if (ret != ffrt_success) {
395 resultEnd = 8;
396 }
397
398 std::function<void()>&& FfrtFunc1 = [&t]() { FuncWait1(static_cast<void*>(&t)); };
399 ffrt_function_header_t* ffrt_func1 = create_function_wrapper((FfrtFunc1));
400 ffrt_submit_base(ffrt_func1, nullptr, nullptr, nullptr);
401 std::function<void()>&& FfrtFunc3 = [&t]() { FuncBroadcast(static_cast<void*>(&t)); };
402 ffrt_function_header_t* ffrt_func3 = create_function_wrapper((FfrtFunc3));
403 ffrt_submit_base(ffrt_func3, nullptr, nullptr, nullptr);
404 ffrt_wait();
405 if (*(t.b) != 1) {
406 resultEnd = 9;
407 }
408 if (t.ret != nullptr) {
409 resultEnd = *(t.ret);
410 }
411 ffrt_cond_destroy(&cond);
412 ffrt_mutex_destroy(&lock_);
413 napi_value flag = nullptr;
414 napi_create_double(env, resultEnd, &flag);
415 return flag;
416 }
417
ConditionVariableTest003(napi_env env,napi_callback_info info)418 static napi_value ConditionVariableTest003(napi_env env, napi_callback_info info)
419 {
420 int resultEnd = 0;
421 // 验证ffrt_cond_broadcast唤醒多个wait功能是否正确
422 ffrt_cond_t cond;
423 int ret = ffrt_cond_init(&cond, nullptr);
424 if (ret != ffrt_success) {
425 resultEnd = 7;
426 }
427
428 int a = 0;
429 int b = 0;
430 ffrt_mutex_t lock_;
431 CvMutex t = {&cond, &a, &b, &lock_, nullptr, nullptr};
432 ret = ffrt_mutex_init(&lock_, nullptr);
433 if (ret != ffrt_success) {
434 resultEnd = 8;
435 }
436
437 std::function<void()>&& FfrtFunc1 = [&t]() { FuncWait1(static_cast<void*>(&t)); };
438 ffrt_function_header_t* ffrt_func1 = create_function_wrapper((FfrtFunc1));
439 ffrt_submit_base(ffrt_func1, nullptr, nullptr, nullptr);
440 std::function<void()>&& FfrtFunc2 = [&t]() { FuncWait2(static_cast<void*>(&t)); };
441 ffrt_function_header_t* ffrt_func2 = create_function_wrapper((FfrtFunc2));
442 ffrt_submit_base(ffrt_func2, nullptr, nullptr, nullptr);
443 std::function<void()>&& FfrtFunc3 = [&t]() { FuncBroadcast(static_cast<void*>(&t)); };
444 ffrt_function_header_t* ffrt_func3 = create_function_wrapper((FfrtFunc3));
445 ffrt_submit_base(ffrt_func3, nullptr, nullptr, nullptr);
446 ffrt_wait();
447 if (*(t.b) != 2) {
448 resultEnd = 9;
449 }
450 if (t.ret != nullptr) {
451 resultEnd = *(t.ret);
452 }
453 ffrt_cond_destroy(&cond);
454 ffrt_mutex_destroy(&lock_);
455 napi_value flag = nullptr;
456 napi_create_double(env, resultEnd, &flag);
457 return flag;
458 }
459
ConditionVariableTest004(napi_env env,napi_callback_info info)460 static napi_value ConditionVariableTest004(napi_env env, napi_callback_info info)
461 {
462 int resultEnd = 0;
463 // 验证ffrt_cond_signal只能唤醒一个wait功能正确
464 ffrt_cond_t cond;
465 int ret = ffrt_cond_init(&cond, nullptr);
466 if (ret != ffrt_success) {
467 resultEnd = 7;
468 }
469
470 int a = 0;
471 int b = 0;
472 ffrt_mutex_t lock_;
473 CvMutex t = {&cond, &a, &b, &lock_, nullptr, nullptr};
474 ret = ffrt_mutex_init(&lock_, nullptr);
475 if (ret != ffrt_success) {
476 resultEnd = 8;
477 }
478
479 std::function<void()>&& FfrtFunc1 = [&t]() { FuncWait1(static_cast<void*>(&t)); };
480 ffrt_function_header_t* ffrt_func1 = create_function_wrapper((FfrtFunc1));
481 ffrt_submit_base(ffrt_func1, nullptr, nullptr, nullptr);
482 std::function<void()>&& FfrtFunc2 = [&t]() { FuncWait2(static_cast<void*>(&t)); };
483 ffrt_function_header_t* ffrt_func2 = create_function_wrapper((FfrtFunc2));
484 ffrt_submit_base(ffrt_func2, nullptr, nullptr, nullptr);
485 std::function<void()>&& FfrtFunc3 = [&t]() { FuncSignal(static_cast<void*>(&t)); };
486 ffrt_function_header_t* ffrt_func3 = create_function_wrapper((FfrtFunc3));
487 ffrt_task_handle_t task3 = ffrt_submit_h_base(ffrt_func3, nullptr, nullptr, nullptr);
488 const std::vector<ffrt_dependence_t> wait_deps = {{ffrt_dependence_task, task3}};
489 ffrt_deps_t wait{static_cast<uint32_t>(wait_deps.size()), wait_deps.data()};
490 ffrt_wait_deps(&wait);
491 ffrt_usleep(100000);
492 if (*(t.b) != 1) {
493 resultEnd = 10;
494 }
495
496 ffrt_func3 = create_function_wrapper((FfrtFunc3));
497 ffrt_submit_base(ffrt_func3, nullptr, nullptr, nullptr);
498 ffrt_wait();
499 if (*(t.b) != 2) {
500 resultEnd = 9;
501 }
502 if (t.ret != nullptr) {
503 resultEnd = *(t.ret);
504 }
505
506 ffrt_cond_destroy(&cond);
507 ffrt_mutex_destroy(&lock_);
508 ffrt_task_handle_destroy(task3);
509 napi_value flag = nullptr;
510 napi_create_double(env, resultEnd, &flag);
511 return flag;
512 }
513
ConditionVariableApiTest001(napi_env env,napi_callback_info info)514 static napi_value ConditionVariableApiTest001(napi_env env, napi_callback_info info)
515 {
516 int resultEnd = 0;
517 //验证ffrt_cond_init接口异常参数
518 ffrt_cond_t cond;
519 int ret = ffrt_cond_init(nullptr, nullptr);
520 if (ret != ffrt_error_inval) {
521 resultEnd = 7;
522 }
523 ffrt_condattr_t attr;
524 ret = ffrt_cond_init(&cond, &attr);
525 if (ret != ffrt_success) {
526 resultEnd = 8;
527 }
528
529 int a = 0;
530 int b = 0;
531 ffrt_mutex_t lock_;
532 CvMutex t = {&cond, &a, &b, &lock_, nullptr, nullptr};
533 ret = ffrt_mutex_init(&lock_, nullptr);
534 if (ret != ffrt_success) {
535 resultEnd = 9;
536 }
537
538 std::function<void()>&& FfrtFunc1 = [&t]() { FuncWait1(static_cast<void*>(&t)); };
539 ffrt_function_header_t* ffrt_func1 = create_function_wrapper((FfrtFunc1));
540 ffrt_submit_base(ffrt_func1, nullptr, nullptr, nullptr);
541 std::function<void()>&& FfrtFunc2 = [&t]() { FuncSignal(static_cast<void*>(&t)); };
542 ffrt_function_header_t* ffrt_func2 = create_function_wrapper((FfrtFunc2));
543 ffrt_submit_base(ffrt_func2, nullptr, nullptr, nullptr);
544 ffrt_wait();
545 if (*(t.b) != 1) {
546 resultEnd = 10;
547 }
548 if (t.ret != nullptr) {
549 resultEnd = *(t.ret);
550 }
551 ffrt_cond_destroy(&cond);
552 ffrt_mutex_destroy(&lock_);
553 napi_value flag = nullptr;
554 napi_create_double(env, resultEnd, &flag);
555 return flag;
556 }
557
ConditionVariableApiTest002(napi_env env,napi_callback_info info)558 static napi_value ConditionVariableApiTest002(napi_env env, napi_callback_info info)
559 {
560 int resultEnd = 0;
561 //验证ffrt_cond_signal接口异常参数
562 ffrt_cond_t cond;
563 int ret = ffrt_cond_init(&cond, nullptr);
564 if (ret != ffrt_success) {
565 resultEnd = 7;
566 }
567
568 int a = 0;
569 int b = 0;
570 ffrt_mutex_t lock_;
571 CvMutex t = {&cond, &a, &b, &lock_, nullptr, nullptr};
572 ret = ffrt_mutex_init(&lock_, nullptr);
573 if (ret != ffrt_success) {
574 resultEnd = 8;
575 }
576
577 std::function<void()>&& FfrtFunc1 = [&t]() { FuncWait1(static_cast<void*>(&t)); };
578 ffrt_function_header_t* ffrt_func1 = create_function_wrapper((FfrtFunc1));
579 ffrt_submit_base(ffrt_func1, nullptr, nullptr, nullptr);
580 std::function<void()>&& FfrtFunc2 = [&t]() { FuncSignalApi(static_cast<void*>(&t)); };
581 ffrt_function_header_t* ffrt_func2 = create_function_wrapper((FfrtFunc2));
582 ffrt_submit_base(ffrt_func2, nullptr, nullptr, nullptr);
583 ffrt_wait();
584 if (*(t.b) != 1) {
585 resultEnd = 10;
586 }
587 if (t.ret != nullptr) {
588 resultEnd = *(t.ret);
589 }
590 ffrt_cond_destroy(&cond);
591 ffrt_mutex_destroy(&lock_);
592 napi_value flag = nullptr;
593 napi_create_double(env, resultEnd, &flag);
594 return flag;
595 }
596
ConditionVariableApiTest003(napi_env env,napi_callback_info info)597 static napi_value ConditionVariableApiTest003(napi_env env, napi_callback_info info)
598 {
599 int resultEnd = 0;
600 // 验证ffrt_cond_broadcast接口异常参数
601 ffrt_cond_t cond;
602 int ret = ffrt_cond_init(&cond, nullptr);
603 if (ret != ffrt_success) {
604 resultEnd = 7;
605 }
606
607 int a = 0;
608 int b = 0;
609 ffrt_mutex_t lock_;
610 CvMutex t = {&cond, &a, &b, &lock_, nullptr, nullptr};
611 ret = ffrt_mutex_init(&lock_, nullptr);
612 if (ret != ffrt_success) {
613 resultEnd = 8;
614 }
615
616 std::function<void()>&& FfrtFunc1 = [&t]() { FuncWait1(static_cast<void*>(&t)); };
617 ffrt_function_header_t* ffrt_func1 = create_function_wrapper((FfrtFunc1));
618 ffrt_submit_base(ffrt_func1, nullptr, nullptr, nullptr);
619 std::function<void()>&& FfrtFunc3 = [&t]() { FuncBroadcastApi(static_cast<void*>(&t)); };
620 ffrt_function_header_t* ffrt_func3 = create_function_wrapper((FfrtFunc3));
621 ffrt_submit_base(ffrt_func3, nullptr, nullptr, nullptr);
622 ffrt_wait();
623 if (*(t.b) != 1) {
624 resultEnd = 10;
625 }
626 if (t.ret != nullptr) {
627 resultEnd = *(t.ret);
628 }
629 ffrt_cond_destroy(&cond);
630 ffrt_mutex_destroy(&lock_);
631 napi_value flag = nullptr;
632 napi_create_double(env, resultEnd, &flag);
633 return flag;
634 }
635
ConditionVariableApiTest004(napi_env env,napi_callback_info info)636 static napi_value ConditionVariableApiTest004(napi_env env, napi_callback_info info)
637 {
638 int resultEnd = 0;
639 //验证ffrt_cond_wait接口异常参数
640 ffrt_cond_t cond;
641 int ret = ffrt_cond_init(&cond, nullptr);
642 if (ret != ffrt_success) {
643 resultEnd = 7;
644 }
645
646 int a = 0;
647 int b = 0;
648 ffrt_mutex_t lock_;
649 CvMutex t = {&cond, &a, &b, &lock_, nullptr, nullptr};
650 ret = ffrt_mutex_init(&lock_, nullptr);
651 if (ret != ffrt_success) {
652 resultEnd = 8;
653 }
654
655 std::function<void()>&& FfrtFunc1 = [&t]() { FuncWaitApi(static_cast<void*>(&t)); };
656 ffrt_function_header_t* ffrt_func1 = create_function_wrapper((FfrtFunc1));
657 ffrt_submit_base(ffrt_func1, nullptr, nullptr, nullptr);
658 std::function<void()>&& FfrtFunc2 = [&t]() { FuncSignal(static_cast<void*>(&t)); };
659 ffrt_function_header_t* ffrt_func2 = create_function_wrapper((FfrtFunc2));
660 ffrt_submit_base(ffrt_func2, nullptr, nullptr, nullptr);
661 ffrt_wait();
662 if (*(t.b) != 1) {
663 resultEnd = 10;
664 }
665 if (t.ret != nullptr) {
666 resultEnd = *(t.ret);
667 }
668 ffrt_cond_destroy(&cond);
669 ffrt_mutex_destroy(&lock_);
670 napi_value flag = nullptr;
671 napi_create_double(env, resultEnd, &flag);
672 return flag;
673 }
674
DelayCTest001(napi_env env,napi_callback_info info)675 static napi_value DelayCTest001(napi_env env, napi_callback_info info)
676 {
677 int result = 0;
678 // 验证delay的set和get c接口
679 int a = 0;
680 ffrt_task_attr_t task_attr;
681 (void)ffrt_task_attr_init(&task_attr);
682 ffrt_task_attr_set_delay(&task_attr, 5000);
683
684 double t;
685 auto start = std::chrono::high_resolution_clock::now();
686 std::function<void()>&& OnePlusFunc = [&a]() { a += 1; };
687 ffrt_task_handle_t task = ffrt_submit_h_base(create_function_wrapper(OnePlusFunc), {}, {}, &task_attr);
688 const std::vector<ffrt_dependence_t> wait_deps = {{ffrt_dependence_task, task}};
689 ffrt_deps_t wait{static_cast<uint32_t>(wait_deps.size()), wait_deps.data()};
690 ffrt_wait_deps(&wait);
691 auto end = std::chrono::high_resolution_clock::now();
692 std::chrono::duration<double, std::micro> elapsed = end-start;
693 t = elapsed.count();
694 if (a != 1) {
695 result = 1;
696 }
697 if (t <= 5000 || t >= 20000) {
698 result = 2;
699 }
700
701 uint64_t delay = ffrt_task_attr_get_delay(&task_attr);
702 if (delay != 5000) {
703 result = 3;
704 }
705 ffrt_task_attr_destroy(&task_attr);
706 ffrt_task_handle_destroy(task);
707 napi_value flag = nullptr;
708 napi_create_double(env, result, &flag);
709 return flag;
710 }
711
FfrtYieldC0001(napi_env env,napi_callback_info info)712 static napi_value FfrtYieldC0001(napi_env env, napi_callback_info info)
713 {
714 int result = 0;
715 int x = 0;
716 pthread_mutex_t lock;
717 int ret = (pthread_mutex_init(&lock, nullptr));
718 if (ret != 0) {
719 result = 1;
720 }
721 std::function<void()>&& func1 = [&]() {
722 while (true) {
723 pthread_mutex_lock(&lock);
724 if (x == 1) {
725 pthread_mutex_unlock(&lock);
726 return;
727 } else {
728 pthread_mutex_unlock(&lock);
729 usleep(1000);
730 ffrt_yield();
731 }
732 }
733 };
734 std::function<void()>&& func2 = [&]() {
735 pthread_mutex_lock(&lock);
736 x++;
737 pthread_mutex_unlock(&lock);
738 };
739 ffrt_task_handle_t task = ffrt_submit_h_base(create_function_wrapper(func1), nullptr, nullptr, nullptr);
740 for (int i = 0; i < 20; i++) {
741 ffrt_submit_base(create_function_wrapper(func1), nullptr, nullptr, nullptr);
742 }
743 ffrt_submit_base(create_function_wrapper(func2), nullptr, nullptr, nullptr);
744 const std::vector<ffrt_dependence_t> wait_deps = {{ffrt_dependence_task, task}};
745 ffrt_deps_t wait{static_cast<uint32_t>(wait_deps.size()), wait_deps.data()};
746 ffrt_wait_deps(&wait);
747 if (x != 1) {
748 result = 7;
749 }
750 ffrt_wait();
751 if (x != 1) {
752 result = 8;
753 }
754 ffrt_task_handle_destroy(task);
755 pthread_mutex_destroy(&lock);
756 napi_value flag = nullptr;
757 napi_create_double(env, result, &flag);
758 return flag;
759 }
760
MutexAbnormalParamTest001(napi_env env,napi_callback_info info)761 static napi_value MutexAbnormalParamTest001(napi_env env, napi_callback_info info)
762 {
763 int result = 0;
764 ffrt_mutex_t mtx;
765 ffrt_mutexattr_t attr;
766 int ret = ffrt_mutex_init(NULL, &attr);
767 if (ret != ffrt_error_inval) {
768 result = 1;
769 }
770 ret = ffrt_mutex_init(&mtx, &attr);
771 if (ret != ffrt_error) {
772 result = 2;
773 }
774 ret = ffrt_mutex_init(&mtx, nullptr);
775 if (ret != ffrt_success) {
776 result = 3;
777 }
778 ret = ffrt_mutex_destroy(NULL);
779 if (ret != ffrt_error_inval) {
780 result = 4;
781 }
782 ret = ffrt_mutex_destroy(&mtx);
783 if (ret != ffrt_success) {
784 result = 5;
785 }
786 napi_value flag = nullptr;
787 napi_create_double(env, result, &flag);
788 return flag;
789 }
790
MutexAbnormalParamTest002(napi_env env,napi_callback_info info)791 static napi_value MutexAbnormalParamTest002(napi_env env, napi_callback_info info)
792 {
793 int result = 0;
794 ffrt_mutex_t mtx;
795 int ret = ffrt_mutex_init(&mtx, nullptr);
796 if (ret != ffrt_success) {
797 result = 1;
798 }
799 std::function<void()>&& func = [&]() {
800 ret = ffrt_mutex_lock(NULL);
801 if (ret != ffrt_error_inval) {
802 result = 2;
803 }
804 ret = ffrt_mutex_lock(&mtx);
805 ret = ffrt_mutex_unlock(NULL);
806 if (ret != ffrt_error_inval) {
807 result = 3;
808 }
809 ret = ffrt_mutex_trylock(NULL);
810 if (ret != ffrt_error_inval) {
811 result = 4;
812 }
813 ret = ffrt_mutex_trylock(&mtx); // 没抢到锁
814 if (ret != ffrt_error_busy) {
815 result = 5;
816 }
817 ret = ffrt_mutex_destroy(NULL);
818 if (ret != ffrt_error_inval) {
819 result = 6;
820 }
821 ret = ffrt_mutex_unlock(&mtx);
822 if (ret != ffrt_success) {
823 result = 7;
824 }
825 };
826 ffrt_submit_base(create_function_wrapper(func), nullptr, nullptr, nullptr);
827 ffrt_wait();
828 ret = ffrt_mutex_destroy(&mtx);
829 if (ret != ffrt_success) {
830 result = 8;
831 }
832 napi_value flag = nullptr;
833 napi_create_double(env, result, &flag);
834 return flag;
835 }
836
MutexTest006(napi_env env,napi_callback_info info)837 static napi_value MutexTest006(napi_env env, napi_callback_info info)
838 {
839 int resultEnd = 0;
840 int x = 0;
841 ffrt_mutex_t lock;
842 int ret = ffrt_mutex_init(&lock, nullptr);
843 if (ret != ffrt_success) {
844 resultEnd = 1;
845 }
846 std::function<void()>&& func1 = [&]() {
847 ffrt_usleep(50 * 1000);
848 int res = ffrt_mutex_lock(&lock);
849 if (res != ffrt_success) {
850 resultEnd = 2;
851 }
852 x = x * 2;
853 res = ffrt_mutex_unlock(&lock);
854 if (res != ffrt_success) {
855 resultEnd = 3;
856 }
857 };
858 std::function<void()>&& func2 = [&]() {
859 int res = ffrt_mutex_lock(&lock);
860 if (res != ffrt_success) {
861 resultEnd = 4;
862 }
863 ffrt_usleep(100 * 1000);
864 x++;
865 res = ffrt_mutex_unlock(&lock);
866 if (res != ffrt_success) {
867 resultEnd = 5;
868 }
869 };
870 ffrt_submit_base(create_function_wrapper(func1), nullptr, nullptr, nullptr);
871 ffrt_submit_base(create_function_wrapper(func2), nullptr, nullptr, nullptr);
872 ffrt_wait();
873 if (x != 2) {
874 resultEnd = 6;
875 }
876 ffrt_mutex_destroy(&lock);
877 napi_value flag = nullptr;
878 napi_create_double(env, resultEnd, &flag);
879 return flag;
880 }
881
MutexTest007(napi_env env,napi_callback_info info)882 static napi_value MutexTest007(napi_env env, napi_callback_info info)
883 {
884 int resultEnd = 0;
885 int x = 0;
886 ffrt_mutex_t lock;
887 int ret = ffrt_mutex_init(&lock, nullptr);
888 if (ret != ffrt_success) {
889 resultEnd = 1;
890 }
891 std::function<void()>&& func1 = [&]() {
892 ffrt_usleep(50 * 1000);
893 int res = ffrt_mutex_lock(&lock);
894 if (res != ffrt_success) {
895 resultEnd = 2;
896 }
897 x = x * 2;
898 res = ffrt_mutex_unlock(&lock);
899 if (res != ffrt_success) {
900 resultEnd = 3;
901 }
902 };
903 std::function<void()>&& func2 = [&]() {
904 int res = ffrt_mutex_lock(&lock);
905 if (res != ffrt_success) {
906 resultEnd = 4;
907 }
908 x++;
909 res = ffrt_mutex_unlock(&lock);
910 if (res != ffrt_success) {
911 resultEnd = 5;
912 }
913 };
914 ffrt_submit_base(create_function_wrapper(func1), nullptr, nullptr, nullptr);
915 ffrt_submit_base(create_function_wrapper(func2), nullptr, nullptr, nullptr);
916 ffrt_wait();
917 ffrt_mutex_destroy(&lock);
918 napi_value flag = nullptr;
919 napi_create_double(env, resultEnd, &flag);
920 return flag;
921 }
922
MutexTest008(napi_env env,napi_callback_info info)923 static napi_value MutexTest008(napi_env env, napi_callback_info info)
924 {
925 int resultEnd = 0;
926 int x = 0;
927 int y = 0;
928 ffrt_mutex_t lock;
929 int ret = ffrt_mutex_init(&lock, nullptr);
930 if (ret != ffrt_success) {
931 resultEnd = 1;
932 }
933 std::function<void()>&& func1 = [&]() {
934 usleep(30 * 1000);
935 while (ffrt_mutex_trylock(&lock)) {
936 y++;
937 usleep(20 * 1000);
938 }
939 x = x * 2;
940 int res = ffrt_mutex_unlock(&lock);
941 if (res != ffrt_success) {
942 resultEnd = 2;
943 }
944 return;
945 };
946 std::function<void()>&& func2 = [&]() {
947 int res = ffrt_mutex_lock(&lock);
948 if (res != ffrt_success) {
949 resultEnd = 3;
950 }
951 usleep(100 * 1000);
952 x++;
953 res = ffrt_mutex_unlock(&lock);
954 if (res != ffrt_success) {
955 resultEnd = 4;
956 }
957 };
958 ffrt_submit_base(create_function_wrapper(func1), nullptr, nullptr, nullptr);
959 ffrt_submit_base(create_function_wrapper(func2), nullptr, nullptr, nullptr);
960 ffrt_wait();
961 if (x != 2) {
962 resultEnd = 5;
963 }
964 if (y == 0) {
965 resultEnd = 6;
966 }
967 ffrt_mutex_destroy(&lock);
968 napi_value flag = nullptr;
969 napi_create_double(env, resultEnd, &flag);
970 return flag;
971 }
972
QueueApiTest001(napi_env env,napi_callback_info info)973 static napi_value QueueApiTest001(napi_env env, napi_callback_info info)
974 {
975 int result = 0;
976 // ffrt_queue_create接口type为异常值
977 ffrt_queue_attr_t queue_attr;
978 (void)ffrt_queue_attr_init(&queue_attr);
979 ffrt_queue_t queue_handle = ffrt_queue_create(ffrt_queue_max, "test_queue", &queue_attr);
980 if (queue_handle != nullptr) {
981 result = 3;
982 }
983
984 // 销毁队列
985 ffrt_queue_attr_destroy(&queue_attr);
986 ffrt_queue_destroy(queue_handle);
987 napi_value flag = nullptr;
988 napi_create_double(env, result, &flag);
989 return flag;
990 }
991
QueueApiTest002(napi_env env,napi_callback_info info)992 static napi_value QueueApiTest002(napi_env env, napi_callback_info info)
993 {
994 int result = 0;
995 // ffrt_queue_create接口name为空
996 ffrt_queue_attr_t queue_attr;
997 (void)ffrt_queue_attr_init(&queue_attr);
998 ffrt_queue_t queue_handle = ffrt_queue_create(ffrt_queue_serial, nullptr, &queue_attr);
999 if (queue_handle == nullptr) {
1000 result = 3;
1001 }
1002
1003 int a = 0;
1004 ffrt_queue_submit(queue_handle, ffrt_create_function_wrapper(OnePlusForTest, nullptr, &a,
1005 ffrt_function_kind_queue), nullptr);
1006
1007 sleep(1);
1008 if (a != 1) {
1009 result = 1;
1010 }
1011
1012 // 销毁队列
1013 ffrt_queue_attr_destroy(&queue_attr);
1014 ffrt_queue_destroy(queue_handle);
1015 napi_value flag = nullptr;
1016 napi_create_double(env, result, &flag);
1017 return flag;
1018 }
1019
QueueApiTest003(napi_env env,napi_callback_info info)1020 static napi_value QueueApiTest003(napi_env env, napi_callback_info info)
1021 {
1022 int result = 0;
1023 ffrt_queue_t queue_handle = ffrt_queue_create(ffrt_queue_serial, "test_queue", nullptr);
1024 if (queue_handle != nullptr) {
1025 result = 3;
1026 }
1027 napi_value flag = nullptr;
1028 napi_create_double(env, result, &flag);
1029 return flag;
1030 }
1031
QueueApiTest004(napi_env env,napi_callback_info info)1032 static napi_value QueueApiTest004(napi_env env, napi_callback_info info)
1033 {
1034 int result = 0;
1035 (void)ffrt_queue_attr_init(nullptr);
1036 sleep(1);
1037 napi_value flag = nullptr;
1038 napi_create_double(env, result, &flag);
1039 return flag;
1040 }
1041
QueueApiTest005(napi_env env,napi_callback_info info)1042 static napi_value QueueApiTest005(napi_env env, napi_callback_info info)
1043 {
1044 int result = 0;
1045 // ffrt_queue_attr_destroy接口attr为异常值
1046 ffrt_queue_attr_t queue_attr;
1047 (void)ffrt_queue_attr_init(&queue_attr);
1048 ffrt_queue_t queue_handle = ffrt_queue_create(ffrt_queue_serial, "test_queue", &queue_attr);
1049 if (queue_handle == nullptr) {
1050 result = 3;
1051 }
1052
1053 int a = 0;
1054 ffrt_queue_submit(queue_handle, ffrt_create_function_wrapper(OnePlusForTest, nullptr, &a,
1055 ffrt_function_kind_queue), nullptr);
1056 sleep(1);
1057 if (a != 1) {
1058 result = 1;
1059 }
1060
1061 // 销毁队列
1062 ffrt_queue_attr_destroy(nullptr);
1063 ffrt_queue_attr_destroy(&queue_attr);
1064 ffrt_queue_destroy(queue_handle);
1065 napi_value flag = nullptr;
1066 napi_create_double(env, result, &flag);
1067 return flag;
1068 }
1069
QueueApiTest006(napi_env env,napi_callback_info info)1070 static napi_value QueueApiTest006(napi_env env, napi_callback_info info)
1071 {
1072 int result = 0;
1073 // ffrt_queue_attr_set_qos接口attr为异常值
1074 ffrt_queue_attr_t queue_attr;
1075 (void)ffrt_queue_attr_init(&queue_attr);
1076 ffrt_queue_attr_set_qos(nullptr, static_cast<ffrt_qos_t>(ffrt_qos_utility));
1077 ffrt_qos_t qos = ffrt_queue_attr_get_qos(&queue_attr);
1078 if (qos != static_cast<int>(ffrt_qos_default)) {
1079 result = 2;
1080 }
1081 ffrt_queue_t queue_handle = ffrt_queue_create(ffrt_queue_serial, "test_queue", &queue_attr);
1082 if (queue_handle == nullptr) {
1083 result = 3;
1084 }
1085
1086 int a = 0;
1087 ffrt_queue_submit(queue_handle, ffrt_create_function_wrapper(OnePlusForTest, nullptr, &a,
1088 ffrt_function_kind_queue), nullptr);
1089
1090 sleep(1);
1091 if (a != 1) {
1092 result = 1;
1093 }
1094
1095 // 销毁队列
1096 ffrt_queue_attr_destroy(&queue_attr);
1097 ffrt_queue_destroy(queue_handle);
1098 napi_value flag = nullptr;
1099 napi_create_double(env, result, &flag);
1100 return flag;
1101 }
1102
QueueApiTest007(napi_env env,napi_callback_info info)1103 static napi_value QueueApiTest007(napi_env env, napi_callback_info info)
1104 {
1105 int result = 0;
1106 // ffrt_queue_attr_set_qos接口qos为异常值
1107 // 设置qos为-1
1108 ffrt_queue_attr_t queue_attr;
1109 ffrt_queue_t queue_handle;
1110 (void)ffrt_queue_attr_init(&queue_attr);
1111 ffrt_queue_attr_set_qos(&queue_attr, static_cast<ffrt_qos_t>(ffrt_qos_inherit));
1112 ffrt_qos_t ret = ffrt_queue_attr_get_qos(&queue_attr);
1113 if (ret != static_cast<int>(ffrt_qos_inherit)) {
1114 result = 1;
1115 }
1116 queue_handle = ffrt_queue_create(ffrt_queue_serial, "test_queue", &queue_attr);
1117
1118 int a = 0;
1119 ffrt_task_handle_t handle = ffrt_queue_submit_h(queue_handle,
1120 ffrt_create_function_wrapper(OnePlusForTest, nullptr, &a, ffrt_function_kind_queue), nullptr);
1121
1122 ffrt_queue_wait(handle);
1123 if (a != 1) {
1124 result = 2;
1125 }
1126
1127 ffrt_task_handle_destroy(handle);
1128 ffrt_queue_destroy(queue_handle);
1129
1130 // 设置qos为-2
1131 ffrt_queue_attr_set_qos(&queue_attr, static_cast<ffrt_qos_t>(-2));
1132 ret = ffrt_queue_attr_get_qos(&queue_attr);
1133 if (ret != static_cast<int>(ffrt_qos_inherit)) {
1134 result = 1;
1135 }
1136 queue_handle = ffrt_queue_create(ffrt_queue_serial, "test_queue", &queue_attr);
1137
1138 handle = ffrt_queue_submit_h(queue_handle,
1139 ffrt_create_function_wrapper(OnePlusForTest, nullptr, &a, ffrt_function_kind_queue), nullptr);
1140
1141 usleep(2000);
1142 ffrt_queue_wait(handle);
1143 if (a != 2) {
1144 result = 3;
1145 }
1146
1147 ffrt_queue_attr_destroy(&queue_attr);
1148 ffrt_task_handle_destroy(handle);
1149 ffrt_queue_destroy(queue_handle);
1150 napi_value flag = nullptr;
1151 napi_create_double(env, result, &flag);
1152 return flag;
1153 }
1154
QueueApiTest008(napi_env env,napi_callback_info info)1155 static napi_value QueueApiTest008(napi_env env, napi_callback_info info)
1156 {
1157 int result = 0;
1158 // ffrt_queue_attr_get_qos接口attr为异常值
1159 ffrt_queue_attr_t queue_attr;
1160 (void)ffrt_queue_attr_init(&queue_attr);
1161 ffrt_queue_attr_set_qos(&queue_attr, static_cast<ffrt_qos_t>(ffrt_qos_utility));
1162 ffrt_qos_t ret = ffrt_queue_attr_get_qos(nullptr);
1163 if (ret != static_cast<int>(ffrt_qos_default)) {
1164 result = 2;
1165 }
1166 ret = ffrt_queue_attr_get_qos(&queue_attr);
1167 if (ret != static_cast<int>(ffrt_qos_utility)) {
1168 result = 1;
1169 }
1170 ffrt_queue_t queue_handle = ffrt_queue_create(ffrt_queue_serial, "test_queue", &queue_attr);
1171 if (queue_handle == nullptr) {
1172 result = 3;
1173 }
1174
1175 int a = 0;
1176 ffrt_queue_submit(queue_handle, ffrt_create_function_wrapper(OnePlusForTest, nullptr, &a,
1177 ffrt_function_kind_queue), nullptr);
1178 sleep(1);
1179 if (a != 1) {
1180 result = 1;
1181 }
1182
1183 // 销毁队列
1184 ffrt_queue_attr_destroy(&queue_attr);
1185 ffrt_queue_destroy(queue_handle);
1186 napi_value flag = nullptr;
1187 napi_create_double(env, result, &flag);
1188 return flag;
1189 }
1190
QueueApiTest009(napi_env env,napi_callback_info info)1191 static napi_value QueueApiTest009(napi_env env, napi_callback_info info)
1192 {
1193 int result = 0;
1194 // ffrt_queue_destroy接口queue为异常值
1195 ffrt_queue_attr_t queue_attr;
1196 (void)ffrt_queue_attr_init(&queue_attr);
1197 ffrt_queue_t queue_handle = ffrt_queue_create(ffrt_queue_serial, "test_queue", &queue_attr);
1198 if (queue_handle == nullptr) {
1199 result = 3;
1200 }
1201
1202 int a = 0;
1203 ffrt_queue_submit(queue_handle, ffrt_create_function_wrapper(OnePlusForTest, nullptr, &a,
1204 ffrt_function_kind_queue), nullptr);
1205 sleep(1);
1206 if (a != 1) {
1207 result = 1;
1208 }
1209
1210 // 销毁队列
1211 ffrt_queue_attr_destroy(&queue_attr);
1212 ffrt_queue_destroy(nullptr);
1213 ffrt_queue_destroy(queue_handle);
1214 napi_value flag = nullptr;
1215 napi_create_double(env, result, &flag);
1216 return flag;
1217 }
1218
QueueApiTest010(napi_env env,napi_callback_info info)1219 static napi_value QueueApiTest010(napi_env env, napi_callback_info info)
1220 {
1221 int result = 0;
1222 // ffrt_queue_submit接口queue或f为异常值
1223 ffrt_queue_attr_t queue_attr;
1224 (void)ffrt_queue_attr_init(&queue_attr);
1225 ffrt_queue_t queue_handle = ffrt_queue_create(ffrt_queue_serial, "test_queue", &queue_attr);
1226 if (queue_handle == nullptr) {
1227 result = 3;
1228 }
1229
1230 int a = 0;
1231 ffrt_queue_submit(nullptr, ffrt_create_function_wrapper(OnePlusForTest, nullptr, &a,
1232 ffrt_function_kind_queue), nullptr);
1233 ffrt_queue_submit(queue_handle, nullptr, nullptr);
1234 ffrt_queue_submit(queue_handle, ffrt_create_function_wrapper(OnePlusForTest, nullptr, &a,
1235 ffrt_function_kind_queue), nullptr);
1236
1237 sleep(1);
1238 if (a != 1) {
1239 result = 1;
1240 }
1241
1242 // 销毁队列
1243 ffrt_queue_attr_destroy(&queue_attr);
1244 ffrt_queue_destroy(queue_handle);
1245 napi_value flag = nullptr;
1246 napi_create_double(env, result, &flag);
1247 return flag;
1248 }
1249
QueueApiTest011(napi_env env,napi_callback_info info)1250 static napi_value QueueApiTest011(napi_env env, napi_callback_info info)
1251 {
1252 int result = 0;
1253 // ffrt_queue_submit_h接口queue或f为异常值
1254 ffrt_queue_attr_t queue_attr;
1255 (void)ffrt_queue_attr_init(&queue_attr);
1256 ffrt_queue_t queue_handle = ffrt_queue_create(ffrt_queue_serial, "test_queue", &queue_attr);
1257 if (queue_handle == nullptr) {
1258 result = 3;
1259 }
1260
1261 int a = 0;
1262 ffrt_task_handle_t handle = ffrt_queue_submit_h(nullptr,
1263 ffrt_create_function_wrapper(OnePlusForTest, nullptr, &a, ffrt_function_kind_queue), nullptr);
1264 if (handle != nullptr) {
1265 result = 1;
1266 }
1267 handle = ffrt_queue_submit_h(queue_handle, nullptr, nullptr);
1268 if (handle != nullptr) {
1269 result = 2;
1270 }
1271 handle = ffrt_queue_submit_h(queue_handle,
1272 ffrt_create_function_wrapper(OnePlusForTest, nullptr, &a, ffrt_function_kind_queue), nullptr);
1273
1274 ffrt_queue_wait(handle);
1275 if (a != 1) {
1276 result = 1;
1277 }
1278
1279 // 销毁队列
1280 ffrt_queue_attr_destroy(&queue_attr);
1281 ffrt_task_handle_destroy(handle);
1282 ffrt_queue_destroy(queue_handle);
1283 napi_value flag = nullptr;
1284 napi_create_double(env, result, &flag);
1285 return flag;
1286 }
1287
QueueApiTest012(napi_env env,napi_callback_info info)1288 static napi_value QueueApiTest012(napi_env env, napi_callback_info info)
1289 {
1290 int result = 0;
1291 // ffrt_queue_wait接口handle为异常值
1292 ffrt_queue_attr_t queue_attr;
1293 (void)ffrt_queue_attr_init(&queue_attr);
1294 ffrt_queue_t queue_handle = ffrt_queue_create(ffrt_queue_serial, "test_queue", &queue_attr);
1295 if (queue_handle == nullptr) {
1296 result = 3;
1297 }
1298
1299 int a = 0;
1300 ffrt_task_handle_t handle = ffrt_queue_submit_h(queue_handle,
1301 ffrt_create_function_wrapper(OnePlusForTest, nullptr, &a, ffrt_function_kind_queue), nullptr);
1302
1303 ffrt_queue_wait(nullptr);
1304 ffrt_queue_wait(handle);
1305 if (a != 1) {
1306 result = 1;
1307 }
1308
1309 // 销毁队列
1310 ffrt_queue_attr_destroy(&queue_attr);
1311 ffrt_task_handle_destroy(handle);
1312 ffrt_queue_destroy(queue_handle);
1313 napi_value flag = nullptr;
1314 napi_create_double(env, result, &flag);
1315 return flag;
1316 }
1317
QueueApiTest013(napi_env env,napi_callback_info info)1318 static napi_value QueueApiTest013(napi_env env, napi_callback_info info)
1319 {
1320 int result = 0;
1321 // ffrt_queue_cancel接口handle为异常值
1322 ffrt_queue_attr_t queue_attr;
1323 (void)ffrt_queue_attr_init(&queue_attr);
1324 ffrt_queue_t queue_handle = ffrt_queue_create(ffrt_queue_serial, "test_queue", &queue_attr);
1325
1326 int a = 0;
1327 ffrt_task_attr_t task_attr;
1328 (void)ffrt_task_attr_init(&task_attr);
1329 ffrt_task_attr_set_delay(&task_attr, 1000000); // 设置任务1s后才执行
1330 ffrt_task_handle_t task1 = ffrt_queue_submit_h(queue_handle,
1331 ffrt_create_function_wrapper(OnePlusForTest, nullptr, &a, ffrt_function_kind_queue), &task_attr);
1332
1333 int ret = ffrt_queue_cancel(nullptr);
1334 if (ret != -1) {
1335 result = 1;
1336 }
1337 ret = ffrt_queue_cancel(task1);
1338 if (ret != 0) {
1339 result = 2;
1340 }
1341 if (a != 0) {
1342 result = 3;
1343 }
1344
1345 ffrt_task_attr_destroy(&task_attr);
1346 ffrt_task_handle_destroy(task1);
1347
1348 // 销毁队列
1349 ffrt_queue_attr_destroy(&queue_attr);
1350 ffrt_queue_destroy(queue_handle);
1351 if (a != 0) {
1352 result = 4;
1353 }
1354 napi_value flag = nullptr;
1355 napi_create_double(env, result, &flag);
1356 return flag;
1357 }
1358
QueueCancelTest001(napi_env env,napi_callback_info info)1359 static napi_value QueueCancelTest001(napi_env env, napi_callback_info info)
1360 {
1361 int result = 0;
1362 // cancel一个delay的未执行task
1363 ffrt_queue_attr_t queue_attr;
1364 (void)ffrt_queue_attr_init(&queue_attr);
1365 ffrt_queue_t queue_handle = ffrt_queue_create(ffrt_queue_serial, "test_queue", &queue_attr);
1366
1367 int a = 0;
1368 ffrt_task_attr_t task_attr;
1369 (void)ffrt_task_attr_init(&task_attr);
1370 ffrt_task_attr_set_delay(&task_attr, 1000000); // 设置任务1s后才执行
1371 ffrt_task_handle_t task1 = ffrt_queue_submit_h(queue_handle,
1372 ffrt_create_function_wrapper(OnePlusForTest, nullptr, &a, ffrt_function_kind_queue), &task_attr);
1373
1374 int ret = ffrt_queue_cancel(task1);
1375 if (ret != 0) {
1376 result = 2;
1377 }
1378 if (a != 0) {
1379 result = 3;
1380 }
1381
1382 ffrt_task_attr_destroy(&task_attr);
1383 ffrt_task_handle_destroy(task1);
1384
1385 // 销毁队列
1386 ffrt_queue_attr_destroy(&queue_attr);
1387 ffrt_queue_destroy(queue_handle);
1388 if (a != 0) {
1389 result = 4;
1390 }
1391 napi_value flag = nullptr;
1392 napi_create_double(env, result, &flag);
1393 return flag;
1394 }
1395
QueueCancelTest003(napi_env env,napi_callback_info info)1396 static napi_value QueueCancelTest003(napi_env env, napi_callback_info info)
1397 {
1398 int result = 0;
1399 // cancel一个执行中task,ffrt的sleep
1400 ffrt_queue_attr_t queue_attr;
1401 (void)ffrt_queue_attr_init(&queue_attr);
1402 ffrt_queue_t queue_handle = ffrt_queue_create(ffrt_queue_serial, "test_queue", &queue_attr);
1403
1404 int a = 0;
1405 ffrt_task_handle_t task1 = ffrt_queue_submit_h(queue_handle,
1406 ffrt_create_function_wrapper(OnePlusSleepForTest, nullptr, &a, ffrt_function_kind_queue), nullptr);
1407
1408 usleep(2000);
1409 int ret = ffrt_queue_cancel(task1);
1410 if (ret != 1) {
1411 result = 2;
1412 }
1413 if (a != 0) {
1414 result = 3;
1415 }
1416 ffrt_task_handle_destroy(task1);
1417 if (a != 0) {
1418 result = 4;
1419 }
1420
1421 // 销毁队列
1422 ffrt_queue_attr_destroy(&queue_attr);
1423 ffrt_queue_destroy(queue_handle);
1424 if (a != 1) {
1425 result = 5;
1426 }
1427 napi_value flag = nullptr;
1428 napi_create_double(env, result, &flag);
1429 return flag;
1430 }
1431
QueueCancelTest004(napi_env env,napi_callback_info info)1432 static napi_value QueueCancelTest004(napi_env env, napi_callback_info info)
1433 {
1434 int result = 0;
1435 // cancel一个已执行的task
1436 ffrt_queue_attr_t queue_attr;
1437 (void)ffrt_queue_attr_init(&queue_attr);
1438 ffrt_queue_t queue_handle = ffrt_queue_create(ffrt_queue_serial, "test_queue", &queue_attr);
1439
1440 int a = 0;
1441 ffrt_task_handle_t task1 = ffrt_queue_submit_h(queue_handle,
1442 ffrt_create_function_wrapper(OnePlusForTest, nullptr, &a, ffrt_function_kind_queue), nullptr);
1443 ffrt_task_handle_t task2 = ffrt_queue_submit_h(queue_handle,
1444 ffrt_create_function_wrapper(OnePlusSleepForTest, nullptr, &a, ffrt_function_kind_queue), nullptr);
1445
1446 ffrt_queue_wait(task1);
1447 int ret = ffrt_queue_cancel(task1);
1448 if (ret != 1) {
1449 result = 2;
1450 }
1451 if (a != 1) {
1452 result = 3;
1453 }
1454 ffrt_queue_wait(task2);
1455 if (a != 2) {
1456 result = 4;
1457 }
1458 ffrt_task_handle_destroy(task1);
1459 ffrt_task_handle_destroy(task2);
1460
1461 // 销毁队列
1462 ffrt_queue_attr_destroy(&queue_attr);
1463 ffrt_queue_destroy(queue_handle);
1464 napi_value flag = nullptr;
1465 napi_create_double(env, result, &flag);
1466 return flag;
1467 }
1468
QueueDelayTest001(napi_env env,napi_callback_info info)1469 static napi_value QueueDelayTest001(napi_env env, napi_callback_info info)
1470 {
1471 int resultEnd = 0;
1472 // 验证delay时间的正确性,先提交一个非延时task,再提交一个delay 5s的task,再提交一个delay 2s的task
1473 int result = 0;
1474 ffrt_task_attr_t task_attr1;
1475 ffrt_task_attr_t task_attr2;
1476 (void)ffrt_task_attr_init(&task_attr1);
1477 (void)ffrt_task_attr_init(&task_attr2);
1478 ffrt_task_attr_set_delay(&task_attr1, 5000000);
1479 ffrt_task_attr_set_delay(&task_attr2, 2000000);
1480
1481 std::function<void()>&& MultipleFunc = [&result]() { MultipleForTest(static_cast<void*>(&result)); };
1482 ffrt_queue_attr_t queue_attr;
1483 (void)ffrt_queue_attr_init(&queue_attr);
1484 ffrt_queue_t queue_handle = ffrt_queue_create(ffrt_queue_serial, "test_queue", &queue_attr);
1485 ffrt_queue_submit(queue_handle, create_function_wrapper(MultipleFunc, ffrt_function_kind_queue), nullptr);
1486 double t;
1487 auto start = std::chrono::high_resolution_clock::now();
1488 std::function<void()>&& OnePlusFunc = [&result]() { OnePlusForTest(static_cast<void*>(&result)); };
1489 std::function<void()>&& OneSubFunc = [&result]() { SubForTest(static_cast<void*>(&result)); };
1490 ffrt_task_handle_t handle1 = ffrt_queue_submit_h(queue_handle,
1491 create_function_wrapper(OneSubFunc, ffrt_function_kind_queue), &task_attr1);
1492 ffrt_task_handle_t handle2 = ffrt_queue_submit_h(queue_handle,
1493 create_function_wrapper(OnePlusFunc, ffrt_function_kind_queue), &task_attr2);
1494
1495 ffrt_queue_wait(handle2);
1496 auto end = std::chrono::high_resolution_clock::now();
1497 std::chrono::duration<double, std::milli> elapsed = end-start;
1498 t = elapsed.count();
1499 if (result != 1) {
1500 resultEnd = 1;
1501 }
1502 if (t <= 2000 || t >= 3000) {
1503 resultEnd = 2;
1504 }
1505
1506 ffrt_queue_wait(handle1);
1507 end = std::chrono::high_resolution_clock::now();
1508 elapsed = end-start;
1509 t = elapsed.count();
1510 if (result != 0) {
1511 resultEnd = 3;
1512 }
1513 if (t <= 5000 || t >= 6000) {
1514 resultEnd = 4;
1515 }
1516 ffrt_task_handle_destroy(handle1);
1517 ffrt_task_handle_destroy(handle2);
1518 ffrt_queue_attr_destroy(&queue_attr);
1519 ffrt_queue_destroy(queue_handle);
1520 napi_value flag = nullptr;
1521 napi_create_double(env, resultEnd, &flag);
1522 return flag;
1523 }
1524
QueueDelayTest002(napi_env env,napi_callback_info info)1525 static napi_value QueueDelayTest002(napi_env env, napi_callback_info info)
1526 {
1527 int result = 0;
1528 // 验证delay时间的正确性,提交一个delay 5ms的task
1529 ffrt_queue_attr_t queue_attr;
1530 (void)ffrt_queue_attr_init(&queue_attr);
1531 ffrt_queue_t queue_handle = ffrt_queue_create(ffrt_queue_serial, "test_queue", &queue_attr);
1532
1533 int a = 0;
1534 ffrt_task_attr_t task_attr;
1535 (void)ffrt_task_attr_init(&task_attr);
1536 ffrt_task_attr_set_delay(&task_attr, 5000); // 设置任务5ms后才执行
1537
1538 double t;
1539 auto start = std::chrono::high_resolution_clock::now();
1540 std::function<void()>&& OnePlusFunc = [&a]() { OnePlusForTest((void *)(&a)); };
1541 ffrt_task_handle_t task1 = ffrt_queue_submit_h(queue_handle,
1542 create_function_wrapper(OnePlusFunc, ffrt_function_kind_queue), &task_attr);
1543 ffrt_queue_wait(task1);
1544 auto end = std::chrono::high_resolution_clock::now();
1545 std::chrono::duration<double, std::micro> elapsed = end-start;
1546 t = elapsed.count();
1547 if (a != 1) {
1548 result = 1;
1549 }
1550 if (t <= 5000 || t >= 10000) {
1551 result = 2;
1552 }
1553 uint64_t delay = ffrt_task_attr_get_delay(&task_attr);
1554 if (delay != 5000) {
1555 result = 3;
1556 }
1557 ffrt_task_attr_destroy(&task_attr);
1558 ffrt_task_handle_destroy(task1);
1559 ffrt_queue_attr_destroy(&queue_attr);
1560 ffrt_queue_destroy(queue_handle);
1561 napi_value flag = nullptr;
1562 napi_create_double(env, result, &flag);
1563 return flag;
1564 }
1565
QueueDelayTest005(napi_env env,napi_callback_info info)1566 static napi_value QueueDelayTest005(napi_env env, napi_callback_info info)
1567 {
1568 int result = 0;
1569 // 等待delay任务时提交一个task可以快速调度
1570 ffrt_queue_attr_t queue_attr;
1571 (void)ffrt_queue_attr_init(&queue_attr);
1572 ffrt_queue_t queue_handle = ffrt_queue_create(ffrt_queue_serial, "test_queue", &queue_attr);
1573
1574 int a = 0;
1575 ffrt_task_attr_t task_attr;
1576 (void)ffrt_task_attr_init(&task_attr);
1577 ffrt_task_attr_set_delay(&task_attr, 5000000);
1578 std::function<void()>&& MultipleFunc = [&a]() { MultipleForTest(static_cast<void*>(&a)); };
1579 ffrt_task_handle_t task1 = ffrt_queue_submit_h(queue_handle,
1580 create_function_wrapper(MultipleFunc, ffrt_function_kind_queue), &task_attr);
1581
1582 sleep(1);
1583 double t;
1584 auto start = std::chrono::high_resolution_clock::now();
1585 std::function<void()>&& OnePlusFunc = [&a]() { OnePlusForTest(static_cast<void*>(&a)); };
1586 ffrt_task_handle_t task2 = ffrt_queue_submit_h(queue_handle,
1587 create_function_wrapper(OnePlusFunc, ffrt_function_kind_queue), nullptr);
1588 ffrt_queue_wait(task2);
1589 auto end = std::chrono::high_resolution_clock::now();
1590 std::chrono::duration<double, std::milli> elapsed = end-start;
1591 t = elapsed.count();
1592 if (a != 1) {
1593 result = 1;
1594 }
1595 if (t >= 5) {
1596 result = 2;
1597 }
1598
1599 ffrt_queue_wait(task1);
1600 if (a != 10) {
1601 result = 3;
1602 }
1603 uint64_t delay = ffrt_task_attr_get_delay(&task_attr);
1604 if (delay != 5000000) {
1605 result = 4;
1606 }
1607 ffrt_task_attr_destroy(&task_attr);
1608 ffrt_task_handle_destroy(task1);
1609 ffrt_task_handle_destroy(task2);
1610
1611 // 销毁队列
1612 ffrt_queue_attr_destroy(&queue_attr);
1613 ffrt_queue_destroy(queue_handle);
1614 napi_value flag = nullptr;
1615 napi_create_double(env, result, &flag);
1616 return flag;
1617 }
1618
QueueDfxTest001(napi_env env,napi_callback_info info)1619 static napi_value QueueDfxTest001(napi_env env, napi_callback_info info)
1620 {
1621 int result = 0;
1622 // ffrt_queue_attr_set_timeout接口attr为异常值
1623 ffrt_queue_attr_t queue_attr;
1624 (void)ffrt_queue_attr_init(&queue_attr);
1625 ffrt_queue_attr_set_timeout(nullptr, 10000);
1626 uint64_t time = ffrt_queue_attr_get_timeout(&queue_attr);
1627 if (time != 0) {
1628 result = 1;
1629 }
1630 ffrt_queue_t queue_handle = ffrt_queue_create(ffrt_queue_serial, "test_queue", &queue_attr);
1631 if (queue_handle == nullptr) {
1632 result = 2;
1633 }
1634 // 销毁队列
1635 ffrt_queue_attr_destroy(&queue_attr);
1636 ffrt_queue_destroy(queue_handle);
1637 napi_value flag = nullptr;
1638 napi_create_double(env, result, &flag);
1639 return flag;
1640 }
1641
QueueDfxTest002(napi_env env,napi_callback_info info)1642 static napi_value QueueDfxTest002(napi_env env, napi_callback_info info)
1643 {
1644 int result = 0;
1645 // ffrt_queue_attr_get_timeout接口attr为异常值
1646 ffrt_queue_attr_t queue_attr;
1647 (void)ffrt_queue_attr_init(&queue_attr);
1648 ffrt_queue_attr_set_timeout(&queue_attr, 10000);
1649 uint64_t time = ffrt_queue_attr_get_timeout(nullptr);
1650 if (time != 0) {
1651 result = 1;
1652 }
1653 time = ffrt_queue_attr_get_timeout(&queue_attr);
1654 if (time != 10000) {
1655 result = 2;
1656 }
1657 ffrt_queue_t queue_handle = ffrt_queue_create(ffrt_queue_serial, "test_queue", &queue_attr);
1658 if (queue_handle == nullptr) {
1659 result = 3;
1660 }
1661
1662 // 销毁队列
1663 ffrt_queue_attr_destroy(&queue_attr);
1664 ffrt_queue_destroy(queue_handle);
1665 napi_value flag = nullptr;
1666 napi_create_double(env, result, &flag);
1667 return flag;
1668 }
1669
QueueDfxTest003(napi_env env,napi_callback_info info)1670 static napi_value QueueDfxTest003(napi_env env, napi_callback_info info)
1671 {
1672 int result = 0;
1673 // ffrt_queue_attr_set_callback接口attr为异常值
1674 int end = 0;
1675 std::function<void()> cbOne = [&end]() {
1676 end++;
1677 };
1678 ffrt_queue_attr_t queue_attr;
1679 (void)ffrt_queue_attr_init(&queue_attr);
1680 ffrt_queue_attr_set_callback(nullptr, create_function_wrapper(cbOne, ffrt_function_kind_queue));
1681 ffrt_queue_t queue_handle = ffrt_queue_create(ffrt_queue_serial, "test_queue", &queue_attr);
1682 if (queue_handle == nullptr) {
1683 result = 3;
1684 }
1685
1686 // 销毁队列
1687 ffrt_queue_attr_destroy(&queue_attr);
1688 ffrt_queue_destroy(queue_handle);
1689 napi_value flag = nullptr;
1690 napi_create_double(env, result, &flag);
1691 return flag;
1692 }
1693
QueueDfxTest004(napi_env env,napi_callback_info info)1694 static napi_value QueueDfxTest004(napi_env env, napi_callback_info info)
1695 {
1696 int result = 0;
1697 int end = 0;
1698 std::function<void()> cbOne = [&end]() {
1699 end++;
1700 };
1701 ffrt_queue_attr_t queue_attr;
1702 (void)ffrt_queue_attr_init(&queue_attr);
1703 ffrt_queue_attr_set_callback(&queue_attr, create_function_wrapper(cbOne, ffrt_function_kind_queue));
1704 ffrt_function_header_t* func = ffrt_queue_attr_get_callback(nullptr);
1705 if (func != nullptr) {
1706 result = 1;
1707 }
1708 func = ffrt_queue_attr_get_callback(&queue_attr);
1709 if (func == nullptr) {
1710 result = 2;
1711 }
1712 ffrt_queue_t queue_handle = ffrt_queue_create(ffrt_queue_serial, "test_queue", &queue_attr);
1713 if (queue_handle == nullptr) {
1714 result = 3;
1715 }
1716
1717 // 销毁队列
1718 ffrt_queue_destroy(queue_handle);
1719 ffrt_queue_attr_destroy(&queue_attr);
1720 napi_value flag = nullptr;
1721 napi_create_double(env, result, &flag);
1722 return flag;
1723 }
1724
QueueDfxTest005(napi_env env,napi_callback_info info)1725 static napi_value QueueDfxTest005(napi_env env, napi_callback_info info)
1726 {
1727 int resultEnd = 0;
1728 int x = 0;
1729 int end = 0;
1730 std::function<void()> cbOne = [&end]() {
1731 end++;
1732 };
1733 ffrt_queue_attr_t queue_attr;
1734 (void)ffrt_queue_attr_init(&queue_attr);
1735 ffrt_queue_attr_set_timeout(&queue_attr, 10000);
1736 ffrt_queue_attr_set_callback(&queue_attr, create_function_wrapper(cbOne, ffrt_function_kind_queue));
1737 ffrt_queue_t queue_handle = ffrt_queue_create(ffrt_queue_serial, "test_queue", &queue_attr);
1738 std::function<void()>&& basicFunc1 = [&] {
1739 x++;
1740 usleep(500 * 1000);
1741 };
1742 ffrt_task_handle_t handle = ffrt_queue_submit_h(queue_handle,
1743 create_function_wrapper(basicFunc1, ffrt_function_kind_queue), nullptr);
1744 ffrt_queue_wait(handle);
1745 if (x != 1) {
1746 resultEnd = 1;
1747 }
1748 if (end != 1) {
1749 resultEnd = 2;
1750 }
1751
1752 std::function<void()>&& basicFunc2 = [&] {
1753 x++;
1754 ffrt_usleep(500 * 1000);
1755 };
1756 ffrt_task_handle_t handle1 = ffrt_queue_submit_h(queue_handle,
1757 create_function_wrapper(basicFunc2, ffrt_function_kind_queue), nullptr);
1758 ffrt_queue_wait(handle1);
1759 if (x != 2) {
1760 resultEnd = 3;
1761 }
1762 if (end != 2) {
1763 resultEnd = 4;
1764 }
1765
1766 ffrt_task_handle_destroy(handle);
1767 ffrt_task_handle_destroy(handle1);
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
QueueDfxTest006(napi_env env,napi_callback_info info)1775 static napi_value QueueDfxTest006(napi_env env, napi_callback_info info)
1776 {
1777 int resultEnd = 0;
1778 int x = 0;
1779 int end = 0;
1780 std::function<void()> cbOne = [&end]() {
1781 end++;
1782 };
1783 ffrt_queue_attr_t queue_attr;
1784 (void)ffrt_queue_attr_init(&queue_attr);
1785 ffrt_queue_attr_set_timeout(&queue_attr, 10000);
1786 ffrt_queue_attr_set_callback(&queue_attr, create_function_wrapper(cbOne, ffrt_function_kind_queue));
1787 ffrt_queue_t queue_handle = ffrt_queue_create(ffrt_queue_serial, "test_queue", &queue_attr);
1788
1789 ffrt_task_handle_t handle[5];
1790 std::function<void()>&& basicFunc = [&] {
1791 x++;
1792 };
1793 for (int i = 0; i < 5; ++i) {
1794 handle[i] = ffrt_queue_submit_h(queue_handle,
1795 create_function_wrapper(basicFunc, ffrt_function_kind_queue), nullptr);
1796 }
1797 ffrt_queue_wait(handle[4]);
1798 if (x != 5) {
1799 resultEnd = 1;
1800 }
1801 if (end != 0) {
1802 resultEnd = 2;
1803 }
1804 for (int i = 0; i < 5; i++) {
1805 ffrt_task_handle_destroy(handle[i]);
1806 }
1807 ffrt_queue_attr_destroy(&queue_attr);
1808 ffrt_queue_destroy(queue_handle);
1809 napi_value flag = nullptr;
1810 napi_create_double(env, resultEnd, &flag);
1811 return flag;
1812 }
1813
QueueTest001(napi_env env,napi_callback_info info)1814 static napi_value QueueTest001(napi_env env, napi_callback_info info)
1815 {
1816 ffrt_queue_attr_t queue_attr;
1817 (void)ffrt_queue_attr_init(&queue_attr);
1818 ffrt_queue_t queue_handle = ffrt_queue_create(ffrt_queue_serial, "test_queue", &queue_attr);
1819 int result = 0;
1820 ffrt_queue_submit(queue_handle, ffrt_create_function_wrapper(OnePlusForTest, nullptr, &result,
1821 ffrt_function_kind_queue), nullptr);
1822 ffrt_queue_submit(queue_handle, ffrt_create_function_wrapper(MultipleForTest, nullptr, &result,
1823 ffrt_function_kind_queue), nullptr);
1824 ffrt_queue_submit(queue_handle, ffrt_create_function_wrapper(SubForTest, nullptr, &result,
1825 ffrt_function_kind_queue), nullptr);
1826 napi_value flag = nullptr;
1827 sleep(2);
1828 napi_create_double(env, result, &flag);
1829 ffrt_queue_attr_destroy(&queue_attr);
1830 ffrt_queue_destroy(queue_handle);
1831 return flag;
1832 }
1833
QueueTest002(napi_env env,napi_callback_info info)1834 static napi_value QueueTest002(napi_env env, napi_callback_info info)
1835 {
1836 const int maxNum = (int)ffrt_qos_user_initiated + 1;
1837 ffrt_queue_attr_t queue_attr[maxNum];
1838 ffrt_queue_t queue_handle[maxNum];
1839 for (int num = 0; num < maxNum; num++) {
1840 (void)ffrt_queue_attr_init(&queue_attr[num]);
1841 ffrt_queue_attr_set_qos(&queue_attr[num], num);
1842 queue_handle[num] = ffrt_queue_create(ffrt_queue_serial, "test_queue", &queue_attr[num]);
1843 }
1844
1845 int a = 0;
1846 int result[maxNum] = {0};
1847 ffrt_task_handle_t task[maxNum][10];
1848 for (int i = 0; i < 10; i++) {
1849 for (int num = 0; num < maxNum; num++) {
1850 task[num][i] = ffrt_queue_submit_h(queue_handle[num],
1851 ffrt_create_function_wrapper(OnePlusForTest, NULL, &result[num], ffrt_function_kind_queue), nullptr);
1852 }
1853 }
1854 for (int num = 0; num < maxNum; num++) {
1855 ffrt_queue_wait(task[num][9]);
1856 HiLogPrint(LOG_APP, LOG_INFO, 1, "FFRT QUEUE", "result in queue %{public}d is %{public}d", num, result[num]);
1857 if (result[num] != 10) {
1858 a = 1;
1859 }
1860 }
1861 for (int i = 0; i < 10; i++) {
1862 for (int num = 0; num < maxNum; num++) {
1863 ffrt_task_handle_destroy(task[num][i]);
1864 }
1865 }
1866 for (int num = 0; num < maxNum; num++) {
1867 HiLogPrint(LOG_APP, LOG_INFO, 1, "FFRT QUEUE", "qos in queue task %{public}d is %{public}d", num,
1868 ffrt_queue_attr_get_qos(&queue_attr[num]));
1869 if (ffrt_queue_attr_get_qos(&queue_attr[num]) != num) {
1870 a = 1;
1871 }
1872 ffrt_queue_attr_destroy(&queue_attr[num]);
1873 ffrt_queue_destroy(queue_handle[num]);
1874 }
1875 napi_value flag = nullptr;
1876 napi_create_double(env, a, &flag);
1877 return flag;
1878 }
1879
QueueTest003(napi_env env,napi_callback_info info)1880 static napi_value QueueTest003(napi_env env, napi_callback_info info)
1881 {
1882 int resultEnd = 0;
1883 // 创建多个相同qos队列,分别调度执行task
1884 ffrt_queue_attr_t queue_attr;
1885 (void)ffrt_queue_attr_init(&queue_attr);
1886 ffrt_queue_t queue_handle[10];
1887 for (int num = 0; num < 10; num++) {
1888 queue_handle[num] = ffrt_queue_create(ffrt_queue_serial, "test_queue", &queue_attr);
1889 }
1890
1891 int result[10] = {0};
1892 void *addr;
1893 ffrt_task_handle_t task[10][10];
1894 for (int i = 0; i < 10; i++) {
1895 for (int num = 0; num < 10; num++) {
1896 addr = static_cast<void *>(&result[num]);
1897 std::function<void()> basicFunc = [=]() { OnePlusForTest(addr); };
1898 task[num][i] = ffrt_queue_submit_h(queue_handle[num],
1899 create_function_wrapper(basicFunc, ffrt_function_kind_queue), nullptr);
1900 }
1901 }
1902 for (int num = 0; num < 10; num++) {
1903 ffrt_queue_wait(task[num][9]);
1904 if (result[num] != 10) {
1905 resultEnd = num + 1;
1906 }
1907 }
1908
1909 for (int i = 0; i < 10; i++) {
1910 for (int num = 0; num < 10; num++) {
1911 ffrt_task_handle_destroy(task[num][i]);
1912 }
1913 }
1914
1915 ffrt_queue_attr_destroy(&queue_attr);
1916 for (int num = 0; num < 10; num++) {
1917 ffrt_queue_destroy(queue_handle[num]);
1918 }
1919 napi_value flag = nullptr;
1920 napi_create_double(env, resultEnd, &flag);
1921 return flag;
1922 }
1923
QueueWaitTest001(napi_env env,napi_callback_info info)1924 static napi_value QueueWaitTest001(napi_env env, napi_callback_info info)
1925 {
1926 int result = 0;
1927 // wait一个delay的未执行task
1928 ffrt_queue_attr_t queue_attr;
1929 (void)ffrt_queue_attr_init(&queue_attr);
1930 ffrt_queue_t queue_handle = ffrt_queue_create(ffrt_queue_serial, "test_queue", &queue_attr);
1931
1932 int a = 0;
1933 ffrt_task_attr_t task_attr;
1934 (void)ffrt_task_attr_init(&task_attr);
1935 ffrt_task_attr_set_delay(&task_attr, 1000000);
1936 std::function<void()>&& OnePlusFunc = [&a]() { OnePlusForTest(static_cast<void*>(&a)); };
1937 ffrt_task_handle_t task1 = ffrt_queue_submit_h(queue_handle,
1938 create_function_wrapper(OnePlusFunc, ffrt_function_kind_queue), &task_attr);
1939
1940 ffrt_queue_wait(task1);
1941 if (a != 1) {
1942 result = 1;
1943 }
1944
1945 ffrt_task_attr_destroy(&task_attr);
1946 ffrt_task_handle_destroy(task1);
1947
1948 // 销毁队列
1949 ffrt_queue_attr_destroy(&queue_attr);
1950 ffrt_queue_destroy(queue_handle);
1951 napi_value flag = nullptr;
1952 napi_create_double(env, result, &flag);
1953 return flag;
1954 }
1955
SubmitAbnormalTest(napi_env env,napi_callback_info info)1956 static napi_value SubmitAbnormalTest(napi_env env, napi_callback_info info)
1957 {
1958 int result = 0;
1959 int x = 0;
1960 std::function<void()>&& func = [&]() { x = x + 1;};
1961 const std::vector<ffrt_dependence_t> in_deps = {{ffrt_dependence_data, &x}};
1962 ffrt_deps_t in{static_cast<uint32_t>(in_deps.size()), in_deps.data()};
1963 const std::vector<ffrt_dependence_t> out_deps = {{ffrt_dependence_data, &x}};
1964 ffrt_deps_t out{static_cast<uint32_t>(out_deps.size()), out_deps.data()};
1965 ffrt_function_header_t* ffrt_header_t = create_function_wrapper((func));
1966
1967 ffrt_submit_base(nullptr, &in, &out, nullptr);
1968 ffrt_submit_h_base(nullptr, &in, &out, nullptr);
1969 ffrt_task_handle_destroy(nullptr);
1970 ffrt_submit_base(ffrt_header_t, &in, &out, nullptr);
1971 ffrt_wait();
1972 if (x != 1) {
1973 result = 1;
1974 }
1975 napi_value flag = nullptr;
1976 napi_create_double(env, result, &flag);
1977 return flag;
1978 }
1979
SubmitBasicTest001(napi_env env,napi_callback_info info)1980 static napi_value SubmitBasicTest001(napi_env env, napi_callback_info info)
1981 {
1982 int result = 0;
1983 int x = 0;
1984 std::function<void()>&& func = [&]() { x = x + 1;};
1985 const std::vector<ffrt_dependence_t> in_deps = {{ffrt_dependence_data, &x}};
1986 ffrt_deps_t in{static_cast<uint32_t>(in_deps.size()), in_deps.data()};
1987 const std::vector<ffrt_dependence_t> out_deps = {{ffrt_dependence_data, &x}};
1988 ffrt_deps_t out{static_cast<uint32_t>(out_deps.size()), out_deps.data()};
1989 ffrt_function_header_t* ffrt_header_t = create_function_wrapper((func));
1990 ffrt_submit_base(ffrt_header_t, &in, &out, nullptr);
1991 ffrt_wait();
1992 if (x != 1) {
1993 result = 1;
1994 }
1995 napi_value flag = nullptr;
1996 napi_create_double(env, result, &flag);
1997 return flag;
1998 }
1999
SubmitBasicTest002(napi_env env,napi_callback_info info)2000 static napi_value SubmitBasicTest002(napi_env env, napi_callback_info info)
2001 {
2002 int result = 0;
2003 const uint32_t sleepTime = 5 * 1000;
2004 int a = 0;
2005 ffrt_task_attr_t attr;
2006 ffrt_task_attr_init(&attr);
2007 ffrt_submit_base(ffrt_create_function_wrapper(OnePlusForTest, NULL, &a), NULL, NULL, &attr);
2008 ffrt_wait();
2009 usleep(sleepTime);
2010 if (a != 1) {
2011 result = 3;
2012 }
2013 ffrt_task_attr_destroy(&attr);
2014 napi_value flag = nullptr;
2015 napi_create_double(env, result, &flag);
2016 return flag;
2017 }
2018
SubmitInDependEmptyTest(napi_env env,napi_callback_info info)2019 static napi_value SubmitInDependEmptyTest(napi_env env, napi_callback_info info)
2020 {
2021 int result = 0;
2022 const uint32_t sleepTime = 10 * 1000;
2023 int x = 0;
2024 int y = 0;
2025 std::function<void()>&& basic1Func = [&]() {
2026 x = x + 1;
2027 usleep(sleepTime);
2028 };
2029 std::function<void()>&& basic2Func = [&]() {
2030 y = y + 1;
2031 usleep(sleepTime);
2032 };
2033 ffrt_task_attr_t attr1;
2034 ffrt_task_attr_init(&attr1);
2035 ffrt_task_attr_set_qos(&attr1, static_cast<int>(ffrt_qos_background));
2036 ffrt_task_attr_t attr2;
2037 ffrt_task_attr_init(&attr2);
2038 ffrt_task_attr_set_qos(&attr2, static_cast<int>(ffrt_qos_utility));
2039 ffrt_function_header_t* basic1Func_ht = create_function_wrapper((basic1Func));
2040 ffrt_function_header_t* basic2Func_ht = create_function_wrapper((basic2Func));
2041 const std::vector<ffrt_dependence_t> in1_deps = {};
2042 ffrt_deps_t in1{static_cast<uint32_t>(in1_deps.size()), in1_deps.data()};
2043 const std::vector<ffrt_dependence_t> in2_deps = {};
2044 ffrt_deps_t in2{static_cast<uint32_t>(in2_deps.size()), in2_deps.data()};
2045 ffrt_submit_base(basic1Func_ht, &in1, nullptr, &attr1);
2046 ffrt_submit_base(basic2Func_ht, &in2, nullptr, &attr2);
2047 ffrt_wait();
2048 if (x != 1) {
2049 result = 1;
2050 }
2051 if (y != 1) {
2052 result = 2;
2053 }
2054 ffrt_task_attr_destroy(&attr1);
2055 ffrt_task_attr_destroy(&attr2);
2056 napi_value flag = nullptr;
2057 napi_create_double(env, result, &flag);
2058 return flag;
2059 }
2060
SubmitInDependNullptrTest(napi_env env,napi_callback_info info)2061 static napi_value SubmitInDependNullptrTest(napi_env env, napi_callback_info info)
2062 {
2063 int result = 0;
2064 const uint32_t sleepTime = 10 * 1000;
2065 int x = 0;
2066 int y = 0;
2067 std::function<void()>&& basic1Func = [&]() {
2068 x = x + 1;
2069 usleep(sleepTime);
2070 };
2071 std::function<void()>&& basic2Func = [&]() {
2072 y = y + 1;
2073 usleep(sleepTime);
2074 };
2075 ffrt_function_header_t* basic1Func_ht = create_function_wrapper((basic1Func));
2076 ffrt_function_header_t* basic2Func_ht = create_function_wrapper((basic2Func));
2077 const std::vector<ffrt_dependence_t> in1_deps = {{ffrt_dependence_data, NULL}};
2078 ffrt_deps_t in1{static_cast<uint32_t>(in1_deps.size()), in1_deps.data()};
2079 const std::vector<ffrt_dependence_t> in2_deps = {{ffrt_dependence_data, NULL}};
2080 ffrt_deps_t in2{static_cast<uint32_t>(in2_deps.size()), in2_deps.data()};
2081 ffrt_submit_base(basic1Func_ht, &in1, nullptr, nullptr);
2082 ffrt_submit_base(basic2Func_ht, &in2, nullptr, nullptr);
2083 ffrt_wait();
2084 if (x != 1) {
2085 result = 1;
2086 }
2087 if (y != 1) {
2088 result = 2;
2089 }
2090 napi_value flag = nullptr;
2091 napi_create_double(env, result, &flag);
2092 return flag;
2093 }
2094
SubmitOuDependEmptyTest(napi_env env,napi_callback_info info)2095 static napi_value SubmitOuDependEmptyTest(napi_env env, napi_callback_info info)
2096 {
2097 int result = 0;
2098 const uint32_t sleepTime = 10 * 1000;
2099 int x = 0;
2100 int y = 0;
2101 std::function<void()>&& basic1Func = [&]() {
2102 x = x + 1;
2103 usleep(sleepTime);
2104 };
2105 std::function<void()>&& basic2Func = [&]() {
2106 y = y + 1;
2107 usleep(sleepTime);
2108 };
2109 ffrt_function_header_t* basic1Func_ht = create_function_wrapper((basic1Func));
2110 ffrt_function_header_t* basic2Func_ht = create_function_wrapper((basic2Func));
2111 const std::vector<ffrt_dependence_t> in1_deps = {};
2112 ffrt_deps_t in1{static_cast<uint32_t>(in1_deps.size()), in1_deps.data()};
2113 const std::vector<ffrt_dependence_t> in2_deps = {};
2114 ffrt_deps_t in2{static_cast<uint32_t>(in2_deps.size()), in2_deps.data()};
2115 const std::vector<ffrt_dependence_t> ou1_deps = {};
2116 ffrt_deps_t ou1{static_cast<uint32_t>(ou1_deps.size()), ou1_deps.data()};
2117 const std::vector<ffrt_dependence_t> ou2_deps = {};
2118 ffrt_deps_t ou2{static_cast<uint32_t>(ou2_deps.size()), ou2_deps.data()};
2119 ffrt_submit_base(basic1Func_ht, &in1, &ou1, nullptr);
2120 ffrt_submit_base(basic2Func_ht, &in2, &ou2, nullptr);
2121 ffrt_wait();
2122 if (x != 1) {
2123 result = 1;
2124 }
2125 if (y != 1) {
2126 result = 2;
2127 }
2128 napi_value flag = nullptr;
2129 napi_create_double(env, result, &flag);
2130 return flag;
2131 }
2132
SubmitOuDependNullptrTest(napi_env env,napi_callback_info info)2133 static napi_value SubmitOuDependNullptrTest(napi_env env, napi_callback_info info)
2134 {
2135 int result = 0;
2136 const uint32_t sleepTime = 10 * 1000;
2137 int x = 0;
2138 int y = 0;
2139 std::function<void()>&& basic1Func = [&]() {
2140 x = x + 1;
2141 usleep(sleepTime);
2142 if (y != 0) {
2143 result = 1;
2144 }
2145 };
2146 std::function<void()>&& basic2Func = [&]() {
2147 y = y + 1;
2148 usleep(sleepTime);
2149 if (x != 1) {
2150 result = 2;
2151 }
2152 };
2153 ffrt_function_header_t* basic1Func_ht = create_function_wrapper((basic1Func));
2154 ffrt_function_header_t* basic2Func_ht = create_function_wrapper((basic2Func));
2155 const std::vector<ffrt_dependence_t> ou1_deps = {{ffrt_dependence_data, NULL}};
2156 ffrt_deps_t ou1{static_cast<uint32_t>(ou1_deps.size()), ou1_deps.data()};
2157 const std::vector<ffrt_dependence_t> ou2_deps = {{ffrt_dependence_data, NULL}};
2158 ffrt_deps_t ou2{static_cast<uint32_t>(ou2_deps.size()), ou2_deps.data()};
2159 ffrt_submit_base(basic1Func_ht, nullptr, &ou1, nullptr);
2160 ffrt_submit_base(basic2Func_ht, nullptr, &ou2, nullptr);
2161 ffrt_wait();
2162 if (x != 1) {
2163 result = 3;
2164 }
2165 if (y != 1) {
2166 result = 4;
2167 }
2168 napi_value flag = nullptr;
2169 napi_create_double(env, result, &flag);
2170 return flag;
2171 }
2172
SubmitIODependTest001(napi_env env,napi_callback_info info)2173 static napi_value SubmitIODependTest001(napi_env env, napi_callback_info info)
2174 {
2175 int result = 0;
2176 int x = 0;
2177 int y = 0;
2178 int z = 0;
2179 std::function<void()>&& basic1Func = [&]() {
2180 ffrt_usleep(10 * 1000);
2181 x = x + 1;
2182 };
2183 std::function<void()>&& basic2Func = [&]() {
2184 ffrt_usleep(5 * 1000);
2185 y = y + 1;
2186 };
2187 std::function<void()>&& basic3Func = [&]() {
2188 z = x + y;
2189 };
2190 const std::vector<ffrt_dependence_t> in3_deps = {{ffrt_dependence_data, &x}, {ffrt_dependence_data, &y}};
2191 ffrt_deps_t in3{static_cast<uint32_t>(in3_deps.size()), in3_deps.data()};
2192 const std::vector<ffrt_dependence_t> ou1_deps = {{ffrt_dependence_data, &x}};
2193 ffrt_deps_t ou1{static_cast<uint32_t>(ou1_deps.size()), ou1_deps.data()};
2194 const std::vector<ffrt_dependence_t> ou2_deps = {{ffrt_dependence_data, &y}};
2195 ffrt_deps_t ou2{static_cast<uint32_t>(ou2_deps.size()), ou2_deps.data()};
2196 const std::vector<ffrt_dependence_t> ou3_deps = {{ffrt_dependence_data, &z}};
2197 ffrt_deps_t ou3{static_cast<uint32_t>(ou3_deps.size()), ou3_deps.data()};
2198 ffrt_submit_base(create_function_wrapper(basic1Func), nullptr, &ou1, nullptr);
2199 ffrt_submit_base(create_function_wrapper(basic2Func), nullptr, &ou2, nullptr);
2200 ffrt_submit_base(create_function_wrapper(basic3Func), &in3, &ou3, nullptr);
2201 ffrt_wait();
2202 if (z != 2) {
2203 result = 1;
2204 }
2205 napi_value flag = nullptr;
2206 napi_create_double(env, result, &flag);
2207 return flag;
2208 }
2209
SubmitIODependTest002(napi_env env,napi_callback_info info)2210 static napi_value SubmitIODependTest002(napi_env env, napi_callback_info info)
2211 {
2212 int result = 0;
2213 int x = 0;
2214 int y = 0;
2215 int z = 0;
2216 int t = 0;
2217 std::function<void()>&& basic1Func = [&]() {
2218 usleep(10 * 1000);
2219 x = x + 1;
2220 y = y + 1;
2221 };
2222 std::function<void()>&& basic2Func = [&]() {
2223 z = x * 5;
2224 };
2225 std::function<void()>&& basic3Func = [&]() {
2226 t = y * 10;
2227 };
2228 const std::vector<ffrt_dependence_t> in2_deps = {{ffrt_dependence_data, &x}};
2229 ffrt_deps_t in2{static_cast<uint32_t>(in2_deps.size()), in2_deps.data()};
2230 const std::vector<ffrt_dependence_t> in3_deps = {{ffrt_dependence_data, &y}};
2231 ffrt_deps_t in3{static_cast<uint32_t>(in3_deps.size()), in3_deps.data()};
2232 const std::vector<ffrt_dependence_t> ou1_deps = {{ffrt_dependence_data, &x}, {ffrt_dependence_data, &y}};
2233 ffrt_deps_t ou1{static_cast<uint32_t>(ou1_deps.size()), ou1_deps.data()};
2234 const std::vector<ffrt_dependence_t> ou2_deps = {{ffrt_dependence_data, &z}};
2235 ffrt_deps_t ou2{static_cast<uint32_t>(ou2_deps.size()), ou2_deps.data()};
2236 const std::vector<ffrt_dependence_t> ou3_deps = {{ffrt_dependence_data, &t}};
2237 ffrt_deps_t ou3{static_cast<uint32_t>(ou3_deps.size()), ou3_deps.data()};
2238 ffrt_submit_base(create_function_wrapper(basic1Func), nullptr, &ou1, nullptr);
2239 ffrt_submit_base(create_function_wrapper(basic2Func), &in2, &ou2, nullptr);
2240 ffrt_submit_base(create_function_wrapper(basic3Func), &in3, &ou3, nullptr);
2241 ffrt_wait();
2242 if (z != 5) {
2243 result = 1;
2244 }
2245 if (t != 10) {
2246 result = 2;
2247 }
2248 napi_value flag = nullptr;
2249 napi_create_double(env, result, &flag);
2250 return flag;
2251 }
2252
SubmitHIODependTest001(napi_env env,napi_callback_info info)2253 static napi_value SubmitHIODependTest001(napi_env env, napi_callback_info info)
2254 {
2255 int result = 0;
2256 int x = 0;
2257 int y = 0;
2258 int z = 0;
2259 std::function<void()>&& basic1Func = [&]() {
2260 ffrt_usleep(10 * 1000);
2261 x = x + 1;
2262 };
2263 std::function<void()>&& basic2Func = [&]() {
2264 ffrt_usleep(5 * 1000);
2265 y = y + 1;
2266 };
2267 std::function<void()>&& basic3Func = [&]() {
2268 z = x + y;
2269 };
2270 const std::vector<ffrt_dependence_t> in3_deps = {
2271 {ffrt_dependence_data, &x}, {ffrt_dependence_data, &y}};
2272 ffrt_deps_t in3{static_cast<uint32_t>(in3_deps.size()), in3_deps.data()};
2273 const std::vector<ffrt_dependence_t> ou1_deps = {{ffrt_dependence_data, &x}};
2274 ffrt_deps_t ou1{static_cast<uint32_t>(ou1_deps.size()), ou1_deps.data()};
2275 const std::vector<ffrt_dependence_t> ou2_deps = {{ffrt_dependence_data, &y}};
2276 ffrt_deps_t ou2{static_cast<uint32_t>(ou2_deps.size()), ou2_deps.data()};
2277 const std::vector<ffrt_dependence_t> ou3_deps = {{ffrt_dependence_data, &z}};
2278 ffrt_deps_t ou3{static_cast<uint32_t>(ou3_deps.size()), ou3_deps.data()};
2279 ffrt_task_handle_t task1 = ffrt_submit_h_base(
2280 create_function_wrapper(basic1Func), nullptr, &ou1, nullptr);
2281 ffrt_task_handle_t task2 = ffrt_submit_h_base(
2282 create_function_wrapper(basic2Func), nullptr, &ou2, nullptr);
2283 ffrt_task_handle_t task3 = ffrt_submit_h_base(
2284 create_function_wrapper(basic3Func), &in3, &ou3, nullptr);
2285 const std::vector<ffrt_dependence_t> wait_deps = {{ffrt_dependence_task, task3}};
2286 ffrt_deps_t wait{static_cast<uint32_t>(wait_deps.size()), wait_deps.data()};
2287 ffrt_wait_deps(&wait);
2288 if (z != 2) {
2289 result = 1;
2290 }
2291 ffrt_task_handle_destroy(task1);
2292 ffrt_task_handle_destroy(task2);
2293 ffrt_task_handle_destroy(task3);
2294 napi_value flag = nullptr;
2295 napi_create_double(env, result, &flag);
2296 return flag;
2297 }
2298
SubmitHIODependTest002(napi_env env,napi_callback_info info)2299 static napi_value SubmitHIODependTest002(napi_env env, napi_callback_info info)
2300 {
2301 int result = 0;
2302 int x = 0;
2303 int y = 0;
2304 int z = 0;
2305 int t = 0;
2306 std::function<void()>&& basic1Func = [&]() {
2307 usleep(10 * 1000);
2308 x = x + 1;
2309 y = y + 1;
2310 };
2311 std::function<void()>&& basic2Func = [&]() {
2312 z = x * 5;
2313 };
2314 std::function<void()>&& basic3Func = [&]() {
2315 t = y * 10;
2316 };
2317 const std::vector<ffrt_dependence_t> in2_deps = {{ffrt_dependence_data, &x}};
2318 ffrt_deps_t in2{static_cast<uint32_t>(in2_deps.size()), in2_deps.data()};
2319 const std::vector<ffrt_dependence_t> in3_deps = {{ffrt_dependence_data, &y}};
2320 ffrt_deps_t in3{static_cast<uint32_t>(in3_deps.size()), in3_deps.data()};
2321 const std::vector<ffrt_dependence_t> ou1_deps = {{ffrt_dependence_data, &x}, {ffrt_dependence_data, &y}};
2322 ffrt_deps_t ou1{static_cast<uint32_t>(ou1_deps.size()), ou1_deps.data()};
2323 const std::vector<ffrt_dependence_t> ou2_deps = {{ffrt_dependence_data, &z}};
2324 ffrt_deps_t ou2{static_cast<uint32_t>(ou2_deps.size()), ou2_deps.data()};
2325 const std::vector<ffrt_dependence_t> ou3_deps = {{ffrt_dependence_data, &t}};
2326 ffrt_deps_t ou3{static_cast<uint32_t>(ou3_deps.size()), ou3_deps.data()};
2327 ffrt_task_handle_t task1 = ffrt_submit_h_base(create_function_wrapper(basic1Func), nullptr, &ou1, nullptr);
2328 ffrt_task_handle_t task2 = ffrt_submit_h_base(create_function_wrapper(basic2Func), &in2, &ou2, nullptr);
2329 ffrt_task_handle_t task3 = ffrt_submit_h_base(create_function_wrapper(basic3Func), &in3, &ou3, nullptr);
2330 const std::vector<ffrt_dependence_t> wait2_deps = {{ffrt_dependence_task, task2}};
2331 ffrt_deps_t wait2{static_cast<uint32_t>(wait2_deps.size()), wait2_deps.data()};
2332 ffrt_wait_deps(&wait2);
2333 if (z != 5) {
2334 result = 1;
2335 }
2336 const std::vector<ffrt_dependence_t> wait3_deps = {{ffrt_dependence_task, task3}};
2337 ffrt_deps_t wait3{static_cast<uint32_t>(wait3_deps.size()), wait3_deps.data()};
2338 ffrt_wait_deps(&wait3);
2339 if (t != 10) {
2340 result = 2;
2341 }
2342 ffrt_task_handle_destroy(task1);
2343 ffrt_task_handle_destroy(task2);
2344 ffrt_task_handle_destroy(task3);
2345 napi_value flag = nullptr;
2346 napi_create_double(env, result, &flag);
2347 return flag;
2348 }
2349
SubmitIn0Ou0WaitNullTask1Test(napi_env env,napi_callback_info info)2350 static napi_value SubmitIn0Ou0WaitNullTask1Test(napi_env env, napi_callback_info info)
2351 {
2352 int result = 0;
2353 const uint32_t sleepTime = 30 * 1000;
2354 int x = 0;
2355 ffrt_task_attr_t attr;
2356 ffrt_task_attr_init(&attr);
2357 std::function<void()>&& basicFunc = [&]() {
2358 if (x != 0) {
2359 result = 1;
2360 }
2361 usleep(sleepTime);
2362 x = x + 1;
2363 };
2364 ffrt_function_header_t* basicFunc_ht = create_function_wrapper((basicFunc));
2365 const std::vector<ffrt_dependence_t> in_deps = {};
2366 ffrt_deps_t in{static_cast<uint32_t>(in_deps.size()), in_deps.data()};
2367 const std::vector<ffrt_dependence_t> ou_deps = {};
2368 ffrt_deps_t ou{static_cast<uint32_t>(ou_deps.size()), ou_deps.data()};
2369 const std::vector<ffrt_dependence_t> wait_deps = {};
2370 ffrt_deps_t wait{static_cast<uint32_t>(wait_deps.size()), wait_deps.data()};
2371 const ffrt_deps_t *wait_null = nullptr;
2372 ffrt_submit_base(basicFunc_ht, &in, &ou, &attr);
2373 if (x != 0) {
2374 result = 2;
2375 }
2376 ffrt_wait_deps(wait_null);
2377 if (x != 0) {
2378 result = 3;
2379 }
2380 ffrt_wait_deps(&wait);
2381 if (x != 0) {
2382 result = 4;
2383 }
2384 ffrt_wait();
2385 if (x != 1) {
2386 result = 5;
2387 }
2388 ffrt_task_attr_destroy(&attr);
2389 napi_value flag = nullptr;
2390 napi_create_double(env, result, &flag);
2391 return flag;
2392 }
2393
SubmitHBasicTest001(napi_env env,napi_callback_info info)2394 static napi_value SubmitHBasicTest001(napi_env env, napi_callback_info info)
2395 {
2396 int result = 0;
2397 int x = 0;
2398 std::function<void()>&& func = [&]() { x = x + 1;};
2399 const std::vector<ffrt_dependence_t> in_deps = {{ffrt_dependence_data, &x}};
2400 ffrt_deps_t in{static_cast<uint32_t>(in_deps.size()), in_deps.data()};
2401 const std::vector<ffrt_dependence_t> out_deps = {{ffrt_dependence_data, &x}};
2402 ffrt_deps_t out{static_cast<uint32_t>(out_deps.size()), out_deps.data()};
2403 ffrt_function_header_t* ffrt_header_t = create_function_wrapper((func));
2404 ffrt_task_handle_t task = ffrt_submit_h_base(ffrt_header_t, &in, &out, nullptr);
2405 const std::vector<ffrt_dependence_t> wait_deps = {{ffrt_dependence_data, &x}};
2406 ffrt_deps_t wait{static_cast<uint32_t>(wait_deps.size()), wait_deps.data()};
2407 ffrt_wait_deps(&wait);
2408 if (x != 1) {
2409 result = 1;
2410 }
2411 ffrt_task_handle_destroy(task);
2412 napi_value flag = nullptr;
2413 napi_create_double(env, result, &flag);
2414 return flag;
2415 }
2416
SubmitHBasicTest002(napi_env env,napi_callback_info info)2417 static napi_value SubmitHBasicTest002(napi_env env, napi_callback_info info)
2418 {
2419 int result = 0;
2420 const uint32_t sleepTime = 5 * 1000;
2421 int a = 0;
2422 ffrt_task_attr_t attr;
2423 ffrt_task_attr_init(&attr);
2424 ffrt_task_handle_t task = ffrt_submit_h_base(
2425 ffrt_create_function_wrapper(OnePlusForTest, NULL, &a), NULL, NULL, &attr);
2426 const std::vector<ffrt_dependence_t> wait_deps = {{ffrt_dependence_task, task}};
2427 ffrt_deps_t wait{static_cast<uint32_t>(wait_deps.size()), wait_deps.data()};
2428 ffrt_wait_deps(&wait);
2429 usleep(sleepTime);
2430 if (a != 1) {
2431 result = 3;
2432 }
2433 ffrt_task_attr_destroy(&attr);
2434 ffrt_task_handle_destroy(task);
2435 napi_value flag = nullptr;
2436 napi_create_double(env, result, &flag);
2437 return flag;
2438 }
2439
SubmitHInDependEmptyTest(napi_env env,napi_callback_info info)2440 static napi_value SubmitHInDependEmptyTest(napi_env env, napi_callback_info info)
2441 {
2442 int result = 0;
2443 const uint32_t sleepTime = 10 * 1000;
2444 int x = 0;
2445 int y = 0;
2446 std::function<void()>&& basic1Func = [&]() {
2447 x = x + 1;
2448 usleep(sleepTime);
2449 };
2450 std::function<void()>&& basic2Func = [&]() {
2451 y = y + 1;
2452 usleep(sleepTime);
2453 };
2454 ffrt_task_attr_t attr1;
2455 ffrt_task_attr_init(&attr1);
2456 ffrt_task_attr_set_qos(&attr1, static_cast<int>(ffrt_qos_background));
2457 ffrt_task_attr_t attr2;
2458 ffrt_task_attr_init(&attr2);
2459 ffrt_task_attr_set_qos(&attr2, static_cast<int>(ffrt_qos_utility));
2460 ffrt_function_header_t* basic1Func_ht = create_function_wrapper((basic1Func));
2461 ffrt_function_header_t* basic2Func_ht = create_function_wrapper((basic2Func));
2462 const std::vector<ffrt_dependence_t> in1_deps = {};
2463 ffrt_deps_t in1{static_cast<uint32_t>(in1_deps.size()), in1_deps.data()};
2464 const std::vector<ffrt_dependence_t> in2_deps = {};
2465 ffrt_deps_t in2{static_cast<uint32_t>(in2_deps.size()), in2_deps.data()};
2466 ffrt_task_handle_t task1 = ffrt_submit_h_base(basic1Func_ht, &in1, nullptr, &attr1);
2467 ffrt_task_handle_t task2 = ffrt_submit_h_base(basic2Func_ht, &in2, nullptr, &attr2);
2468 const std::vector<ffrt_dependence_t> wait_deps1 = {{ffrt_dependence_task, task1}};
2469 ffrt_deps_t wait1{static_cast<uint32_t>(wait_deps1.size()), wait_deps1.data()};
2470 const std::vector<ffrt_dependence_t> wait_deps2 = {{ffrt_dependence_task, task2}};
2471 ffrt_deps_t wait2{static_cast<uint32_t>(wait_deps2.size()), wait_deps2.data()};
2472 ffrt_wait_deps(&wait1);
2473 if (x != 1) {
2474 result = 1;
2475 }
2476 ffrt_wait_deps(&wait2);
2477 if (y != 1) {
2478 result = 2;
2479 }
2480 ffrt_task_attr_destroy(&attr1);
2481 ffrt_task_attr_destroy(&attr2);
2482 ffrt_task_handle_destroy(task1);
2483 ffrt_task_handle_destroy(task2);
2484 napi_value flag = nullptr;
2485 napi_create_double(env, result, &flag);
2486 return flag;
2487 }
2488
SubmitHInDependNullptrTest(napi_env env,napi_callback_info info)2489 static napi_value SubmitHInDependNullptrTest(napi_env env, napi_callback_info info)
2490 {
2491 int result = 0;
2492 const uint32_t sleepTime = 10 * 1000;
2493 int x = 0;
2494 int y = 0;
2495 std::function<void()>&& basic1Func = [&]() {
2496 x = x + 1;
2497 usleep(sleepTime);
2498 };
2499 std::function<void()>&& basic2Func = [&]() {
2500 y = y + 1;
2501 usleep(sleepTime);
2502 };
2503 ffrt_function_header_t* basic1Func_ht = create_function_wrapper((basic1Func));
2504 ffrt_function_header_t* basic2Func_ht = create_function_wrapper((basic2Func));
2505 const std::vector<ffrt_dependence_t> in1_deps = {{ffrt_dependence_data, NULL}};
2506 ffrt_deps_t in1{static_cast<uint32_t>(in1_deps.size()), in1_deps.data()};
2507 const std::vector<ffrt_dependence_t> in2_deps = {{ffrt_dependence_data, NULL}};
2508 ffrt_deps_t in2{static_cast<uint32_t>(in2_deps.size()), in2_deps.data()};
2509 ffrt_task_handle_t task1 = ffrt_submit_h_base(basic1Func_ht, &in1, nullptr, nullptr);
2510 ffrt_task_handle_t task2 = ffrt_submit_h_base(basic2Func_ht, &in2, nullptr, nullptr);
2511 const std::vector<ffrt_dependence_t> wait_deps1 = {{ffrt_dependence_task, task1}};
2512 ffrt_deps_t wait1{static_cast<uint32_t>(wait_deps1.size()), wait_deps1.data()};
2513 const std::vector<ffrt_dependence_t> wait_deps2 = {{ffrt_dependence_task, task2}};
2514 ffrt_deps_t wait2{static_cast<uint32_t>(wait_deps2.size()), wait_deps2.data()};
2515 ffrt_wait_deps(&wait1);
2516 if (x != 1) {
2517 result = 1;
2518 }
2519 ffrt_wait_deps(&wait2);
2520 if (y != 1) {
2521 result = 2;
2522 }
2523 ffrt_task_handle_destroy(task1);
2524 ffrt_task_handle_destroy(task2);
2525 napi_value flag = nullptr;
2526 napi_create_double(env, result, &flag);
2527 return flag;
2528 }
2529
SubmitHOuDependEmptyTest(napi_env env,napi_callback_info info)2530 static napi_value SubmitHOuDependEmptyTest(napi_env env, napi_callback_info info)
2531 {
2532 int result = 0;
2533 const uint32_t sleepTime = 10 * 1000;
2534 int x = 0;
2535 int y = 0;
2536 std::function<void()>&& basic1Func = [&]() {
2537 x = x + 1;
2538 usleep(sleepTime);
2539 };
2540 std::function<void()>&& basic2Func = [&]() {
2541 y = y + 1;
2542 usleep(sleepTime);
2543 };
2544 ffrt_function_header_t* basic1Func_ht = create_function_wrapper((basic1Func));
2545 ffrt_function_header_t* basic2Func_ht = create_function_wrapper((basic2Func));
2546 const std::vector<ffrt_dependence_t> in1_deps = {};
2547 ffrt_deps_t in1{static_cast<uint32_t>(in1_deps.size()), in1_deps.data()};
2548 const std::vector<ffrt_dependence_t> in2_deps = {};
2549 ffrt_deps_t in2{static_cast<uint32_t>(in2_deps.size()), in2_deps.data()};
2550 const std::vector<ffrt_dependence_t> ou1_deps = {};
2551 ffrt_deps_t ou1{static_cast<uint32_t>(ou1_deps.size()), ou1_deps.data()};
2552 const std::vector<ffrt_dependence_t> ou2_deps = {};
2553 ffrt_deps_t ou2{static_cast<uint32_t>(ou2_deps.size()), ou2_deps.data()};
2554 ffrt_task_handle_t task1 = ffrt_submit_h_base(basic1Func_ht, &in1, &ou1, nullptr);
2555 ffrt_task_handle_t task2 = ffrt_submit_h_base(basic2Func_ht, &in2, &ou2, nullptr);
2556 const std::vector<ffrt_dependence_t> wait_deps1 = {{ffrt_dependence_task, task1}};
2557 ffrt_deps_t wait1{static_cast<uint32_t>(wait_deps1.size()), wait_deps1.data()};
2558 const std::vector<ffrt_dependence_t> wait_deps2 = {{ffrt_dependence_task, task2}};
2559 ffrt_deps_t wait2{static_cast<uint32_t>(wait_deps2.size()), wait_deps2.data()};
2560 ffrt_wait_deps(&wait1);
2561 if (x != 1) {
2562 result = 1;
2563 }
2564 ffrt_wait_deps(&wait2);
2565 if (y != 1) {
2566 result = 2;
2567 }
2568 ffrt_task_handle_destroy(task1);
2569 ffrt_task_handle_destroy(task2);
2570 napi_value flag = nullptr;
2571 napi_create_double(env, result, &flag);
2572 return flag;
2573 }
2574
SubmitHOuDependNullptrTest(napi_env env,napi_callback_info info)2575 static napi_value SubmitHOuDependNullptrTest(napi_env env, napi_callback_info info)
2576 {
2577 int result = 0;
2578 const uint32_t sleepTime = 10 * 1000;
2579 int x = 0;
2580 int y = 0;
2581 std::function<void()>&& basic1Func = [&]() {
2582 x = x + 1;
2583 usleep(sleepTime);
2584 if (y != 0) {
2585 result = 1;
2586 }
2587 };
2588 std::function<void()>&& basic2Func = [&]() {
2589 y = y + 1;
2590 usleep(sleepTime);
2591 if (x != 1) {
2592 result = 2;
2593 }
2594 };
2595 ffrt_function_header_t* basic1Func_ht = create_function_wrapper((basic1Func));
2596 ffrt_function_header_t* basic2Func_ht = create_function_wrapper((basic2Func));
2597 const std::vector<ffrt_dependence_t> ou1_deps = {{ffrt_dependence_data, NULL}};
2598 ffrt_deps_t ou1{static_cast<uint32_t>(ou1_deps.size()), ou1_deps.data()};
2599 const std::vector<ffrt_dependence_t> ou2_deps = {{ffrt_dependence_data, NULL}};
2600 ffrt_deps_t ou2{static_cast<uint32_t>(ou2_deps.size()), ou2_deps.data()};
2601 ffrt_task_handle_t task1 = ffrt_submit_h_base(basic1Func_ht, nullptr, &ou1, nullptr);
2602 ffrt_task_handle_t task2 = ffrt_submit_h_base(basic2Func_ht, nullptr, &ou2, nullptr);
2603 const std::vector<ffrt_dependence_t> wait_deps1 = {{ffrt_dependence_task, task1}};
2604 ffrt_deps_t wait1{static_cast<uint32_t>(wait_deps1.size()), wait_deps1.data()};
2605 const std::vector<ffrt_dependence_t> wait_deps2 = {{ffrt_dependence_task, task2}};
2606 ffrt_deps_t wait2{static_cast<uint32_t>(wait_deps2.size()), wait_deps2.data()};
2607 ffrt_wait_deps(&wait1);
2608 if (x != 1) {
2609 result = 3;
2610 }
2611 ffrt_wait_deps(&wait2);
2612 if (y != 1) {
2613 result = 4;
2614 }
2615 ffrt_task_handle_destroy(task1);
2616 ffrt_task_handle_destroy(task2);
2617 napi_value flag = nullptr;
2618 napi_create_double(env, result, &flag);
2619 return flag;
2620 }
2621
2622
SleepForTest000(napi_env env,napi_callback_info info)2623 static napi_value SleepForTest000(napi_env env, napi_callback_info info)
2624 {
2625 int resultEnd = 0;
2626 // sleep 1ms,验证sleep时间的正确性
2627 double t;
2628 std::function<void()>&& func = [&]() {
2629 auto start = std::chrono::high_resolution_clock::now();
2630 ffrt_usleep(0);
2631 auto end = std::chrono::high_resolution_clock::now();
2632 std::chrono::duration<double, std::milli> elapsed = end-start;
2633 t = elapsed.count();
2634 };
2635 ffrt_submit_base(create_function_wrapper(func), nullptr, nullptr, nullptr);
2636 ffrt_wait();
2637 if (t <= 0 || t > 10) {
2638 resultEnd = 1;
2639 }
2640 napi_value flag = nullptr;
2641 napi_create_double(env, resultEnd, &flag);
2642 return flag;
2643 }
2644
SleepForTest001(napi_env env,napi_callback_info info)2645 static napi_value SleepForTest001(napi_env env, napi_callback_info info)
2646 {
2647 int resultEnd = 0;
2648 // sleep 1ms,验证sleep时间的正确性
2649 double t;
2650 std::function<void()>&& func = [&]() {
2651 auto start = std::chrono::high_resolution_clock::now();
2652 ffrt_usleep(1000);
2653 auto end = std::chrono::high_resolution_clock::now();
2654 std::chrono::duration<double, std::milli> elapsed = end-start;
2655 t = elapsed.count();
2656 };
2657 ffrt_submit_base(create_function_wrapper(func), nullptr, nullptr, nullptr);
2658 ffrt_wait();
2659 if (t <= 1 || t > 10) {
2660 resultEnd = 1;
2661 }
2662 napi_value flag = nullptr;
2663 napi_create_double(env, resultEnd, &flag);
2664 return flag;
2665 }
2666
TaskAttrAbnormalTest(napi_env env,napi_callback_info info)2667 static napi_value TaskAttrAbnormalTest(napi_env env, napi_callback_info info)
2668 {
2669 int result = 0;
2670 ffrt_task_attr_t attr;
2671 int ret = ffrt_task_attr_init(nullptr);
2672 if (ret != -1) {
2673 result = 1;
2674 }
2675 ret = ffrt_task_attr_init(&attr);
2676 ffrt_task_attr_set_qos(nullptr, static_cast<int>(ffrt_qos_default));
2677 ffrt_task_attr_set_name(nullptr, nullptr);
2678 ffrt_task_attr_set_delay(nullptr, 0);
2679 ffrt_qos_t ffrt_qos = ffrt_task_attr_get_qos(nullptr);
2680 if (ffrt_qos != ffrt_qos_default) {
2681 result = 2;
2682 }
2683 const char* name = ffrt_task_attr_get_name(nullptr);
2684 if (name != nullptr) {
2685 result = 3;
2686 }
2687 uint64_t delay = ffrt_task_attr_get_delay(nullptr);
2688 if (delay != 0) {
2689 result = 4;
2690 }
2691 ffrt_task_attr_destroy(nullptr);
2692 ffrt_task_attr_destroy(&attr);
2693 napi_value flag = nullptr;
2694 napi_create_double(env, result, &flag);
2695 return flag;
2696 }
2697
TaskAttrQosIllegalTest(napi_env env,napi_callback_info info)2698 static napi_value TaskAttrQosIllegalTest(napi_env env, napi_callback_info info)
2699 {
2700 int result = 0;
2701 ffrt_task_attr_t attr;
2702 ffrt_task_attr_init(&attr);
2703 int minVal = static_cast<int>(ffrt_qos_inherit) - 1;
2704 ffrt_task_attr_set_qos(&attr, minVal);
2705 int queryVal = int(ffrt_task_attr_get_qos(&attr));
2706 if (queryVal != -1) {
2707 result = 1;
2708 }
2709 ffrt_task_attr_destroy(&attr);
2710 napi_value flag = nullptr;
2711 napi_create_double(env, result, &flag);
2712 return flag;
2713 }
2714
TaskAttrQosQueryTest(napi_env env,napi_callback_info info)2715 static napi_value TaskAttrQosQueryTest(napi_env env, napi_callback_info info)
2716 {
2717 int result = 0;
2718 ffrt_task_attr_t attr;
2719 ffrt_task_attr_get_qos(&attr);
2720 int ret = ffrt_task_attr_init(&attr);
2721 if (ret != 0) {
2722 result = 1;
2723 }
2724 int qosVal = ffrt_task_attr_get_qos(&attr);
2725 if (qosVal != ffrt_qos_default) {
2726 result = 2;
2727 }
2728 ffrt_task_attr_destroy(&attr);
2729 napi_value flag = nullptr;
2730 napi_create_double(env, result, &flag);
2731 return flag;
2732 }
2733
TaskAttrSetNameTest(napi_env env,napi_callback_info info)2734 static napi_value TaskAttrSetNameTest(napi_env env, napi_callback_info info)
2735 {
2736 int result = 0;
2737 ffrt_task_attr_t attr;
2738 (void)ffrt_task_attr_init(&attr);
2739 std::string name(ffrt_task_attr_get_name(&attr));
2740 if (name != "") {
2741 result = 1;
2742 }
2743 ffrt_task_attr_set_name(&attr, "Task Name");
2744 std::string reName(ffrt_task_attr_get_name(&attr));
2745 if (reName != "Task Name") {
2746 result = 2;
2747 }
2748 ffrt_task_attr_destroy(&attr);
2749 std::string desName(ffrt_task_attr_get_name(&attr));
2750 napi_value flag = nullptr;
2751 napi_create_double(env, result, &flag);
2752 return flag;
2753 }
2754
TaskAttrSetQosTest(napi_env env,napi_callback_info info)2755 static napi_value TaskAttrSetQosTest(napi_env env, napi_callback_info info)
2756 {
2757 int result = 0;
2758 ffrt_task_attr_t attr;
2759 ffrt_task_attr_init(&attr);
2760 int minLevel = static_cast<int>(ffrt_qos_inherit);
2761 int maxLevel = static_cast<int>(ffrt_qos_user_initiated);
2762 for (int idx = minLevel; idx <= maxLevel; idx++) {
2763 ffrt_task_attr_set_qos(&attr, idx);
2764 int qosVal = int(ffrt_task_attr_get_qos(&attr));
2765 if (qosVal != idx) {
2766 result = idx + 2;
2767 }
2768 }
2769 ffrt_task_attr_destroy(&attr);
2770 napi_value flag = nullptr;
2771 napi_create_double(env, result, &flag);
2772 return flag;
2773 }
2774
2775 EXTERN_C_START
Init(napi_env env,napi_value exports)2776 static napi_value Init(napi_env env, napi_value exports)
2777 {
2778 napi_property_descriptor desc[] = {
2779 { "conditionVariableTest001", nullptr, ConditionVariableTest001, nullptr, nullptr, nullptr,
2780 napi_default, nullptr },
2781 { "conditionVariableTest002", nullptr, ConditionVariableTest002, nullptr, nullptr, nullptr,
2782 napi_default, nullptr },
2783 { "conditionVariableTest003", nullptr, ConditionVariableTest003, nullptr, nullptr, nullptr,
2784 napi_default, nullptr },
2785 { "conditionVariableTest004", nullptr, ConditionVariableTest004, nullptr, nullptr, nullptr,
2786 napi_default, nullptr },
2787 { "conditionVariableApiTest001", nullptr, ConditionVariableApiTest001, nullptr, nullptr, nullptr,
2788 napi_default, nullptr },
2789 { "conditionVariableApiTest002", nullptr, ConditionVariableApiTest002, nullptr, nullptr, nullptr,
2790 napi_default, nullptr },
2791 { "conditionVariableApiTest003", nullptr, ConditionVariableApiTest003, nullptr, nullptr, nullptr,
2792 napi_default, nullptr },
2793 { "conditionVariableApiTest004", nullptr, ConditionVariableApiTest004, nullptr, nullptr, nullptr,
2794 napi_default, nullptr },
2795 { "delayCTest001", nullptr, DelayCTest001, nullptr, nullptr, nullptr, napi_default, nullptr },
2796 { "ffrtYieldC0001", nullptr, FfrtYieldC0001, nullptr, nullptr, nullptr, napi_default, nullptr },
2797 { "mutexAbnormalParamTest001", nullptr, MutexAbnormalParamTest001, nullptr, nullptr, nullptr, napi_default, nullptr },
2798 { "mutexAbnormalParamTest002", nullptr, MutexAbnormalParamTest002, nullptr, nullptr, nullptr, napi_default, nullptr },
2799 { "mutexTest006", nullptr, MutexTest006, nullptr, nullptr, nullptr, napi_default, nullptr },
2800 { "mutexTest007", nullptr, MutexTest007, nullptr, nullptr, nullptr, napi_default, nullptr },
2801 { "mutexTest008", nullptr, MutexTest008, nullptr, nullptr, nullptr, napi_default, nullptr },
2802 { "queueApiTest001", nullptr, QueueApiTest001, nullptr, nullptr, nullptr, napi_default, nullptr },
2803 { "queueApiTest002", nullptr, QueueApiTest002, nullptr, nullptr, nullptr, napi_default, nullptr },
2804 { "queueApiTest003", nullptr, QueueApiTest003, nullptr, nullptr, nullptr, napi_default, nullptr },
2805 { "queueApiTest004", nullptr, QueueApiTest004, nullptr, nullptr, nullptr, napi_default, nullptr },
2806 { "queueApiTest005", nullptr, QueueApiTest005, nullptr, nullptr, nullptr, napi_default, nullptr },
2807 { "queueApiTest006", nullptr, QueueApiTest006, nullptr, nullptr, nullptr, napi_default, nullptr },
2808 { "queueApiTest007", nullptr, QueueApiTest007, nullptr, nullptr, nullptr, napi_default, nullptr },
2809 { "queueApiTest008", nullptr, QueueApiTest008, nullptr, nullptr, nullptr, napi_default, nullptr },
2810 { "queueApiTest009", nullptr, QueueApiTest009, nullptr, nullptr, nullptr, napi_default, nullptr },
2811 { "queueApiTest010", nullptr, QueueApiTest010, nullptr, nullptr, nullptr, napi_default, nullptr },
2812 { "queueApiTest011", nullptr, QueueApiTest011, nullptr, nullptr, nullptr, napi_default, nullptr },
2813 { "queueApiTest012", nullptr, QueueApiTest012, nullptr, nullptr, nullptr, napi_default, nullptr },
2814 { "queueApiTest013", nullptr, QueueApiTest013, nullptr, nullptr, nullptr, napi_default, nullptr },
2815 { "queueCancelTest001", nullptr, QueueCancelTest001, nullptr, nullptr, nullptr, napi_default, nullptr },
2816 { "queueCancelTest003", nullptr, QueueCancelTest003, nullptr, nullptr, nullptr, napi_default, nullptr },
2817 { "queueCancelTest004", nullptr, QueueCancelTest004, nullptr, nullptr, nullptr, napi_default, nullptr },
2818 { "queueDelayTest001", nullptr, QueueDelayTest001, nullptr, nullptr, nullptr, napi_default, nullptr },
2819 { "queueDelayTest002", nullptr, QueueDelayTest002, nullptr, nullptr, nullptr, napi_default, nullptr },
2820 { "queueDelayTest005", nullptr, QueueDelayTest005, nullptr, nullptr, nullptr, napi_default, nullptr },
2821 { "queueDfxTest001", nullptr, QueueDfxTest001, nullptr, nullptr, nullptr, napi_default, nullptr },
2822 { "queueDfxTest002", nullptr, QueueDfxTest002, nullptr, nullptr, nullptr, napi_default, nullptr },
2823 { "queueDfxTest003", nullptr, QueueDfxTest003, nullptr, nullptr, nullptr, napi_default, nullptr },
2824 { "queueDfxTest004", nullptr, QueueDfxTest004, nullptr, nullptr, nullptr, napi_default, nullptr },
2825 { "queueDfxTest005", nullptr, QueueDfxTest005, nullptr, nullptr, nullptr, napi_default, nullptr },
2826 { "queueDfxTest006", nullptr, QueueDfxTest006, nullptr, nullptr, nullptr, napi_default, nullptr },
2827 { "queueTest001", nullptr, QueueTest001, nullptr, nullptr, nullptr, napi_default, nullptr },
2828 { "queueTest002", nullptr, QueueTest002, nullptr, nullptr, nullptr, napi_default, nullptr },
2829 { "queueTest003", nullptr, QueueTest003, nullptr, nullptr, nullptr, napi_default, nullptr },
2830 { "queueWaitTest001", nullptr, QueueWaitTest001, nullptr, nullptr, nullptr, napi_default, nullptr },
2831 { "submitAbnormalTest", nullptr, SubmitAbnormalTest, nullptr, nullptr, nullptr, napi_default, nullptr },
2832 { "submitBasicTest001", nullptr, SubmitBasicTest001, nullptr, nullptr, nullptr, napi_default, nullptr },
2833 { "submitBasicTest002", nullptr, SubmitBasicTest002, nullptr, nullptr, nullptr, napi_default, nullptr },
2834 { "submitInDependEmptyTest", nullptr, SubmitInDependEmptyTest, nullptr, nullptr, nullptr,
2835 napi_default, nullptr },
2836 { "submitInDependNullptrTest", nullptr, SubmitInDependNullptrTest, nullptr, nullptr, nullptr,
2837 napi_default, nullptr },
2838 { "submitOuDependEmptyTest", nullptr, SubmitOuDependEmptyTest, nullptr, nullptr, nullptr,
2839 napi_default, nullptr },
2840 { "submitOuDependNullptrTest", nullptr, SubmitOuDependNullptrTest, nullptr, nullptr, nullptr,
2841 napi_default, nullptr },
2842 { "submitIODependTest001", nullptr, SubmitIODependTest001, nullptr, nullptr, nullptr,
2843 napi_default, nullptr },
2844 { "submitIODependTest002", nullptr, SubmitIODependTest002, nullptr, nullptr, nullptr,
2845 napi_default, nullptr },
2846 { "submitIn0Ou0WaitNullTask1Test", nullptr, SubmitIn0Ou0WaitNullTask1Test, nullptr, nullptr, nullptr,
2847 napi_default, nullptr },
2848 { "submitHBasicTest001", nullptr, SubmitHBasicTest001, nullptr, nullptr, nullptr, napi_default, nullptr },
2849 { "submitHBasicTest002", nullptr, SubmitHBasicTest002, nullptr, nullptr, nullptr, napi_default, nullptr },
2850 { "submitHInDependEmptyTest", nullptr, SubmitHInDependEmptyTest, nullptr, nullptr, nullptr,
2851 napi_default, nullptr },
2852 { "submitHInDependNullptrTest", nullptr, SubmitHInDependNullptrTest, nullptr, nullptr, nullptr,
2853 napi_default, nullptr },
2854 { "submitHOuDependEmptyTest", nullptr, SubmitHOuDependEmptyTest, nullptr, nullptr, nullptr,
2855 napi_default, nullptr },
2856 { "submitHOuDependNullptrTest", nullptr, SubmitHOuDependNullptrTest, nullptr, nullptr, nullptr,
2857 napi_default, nullptr },
2858 { "submitHIODependTest001", nullptr, SubmitHIODependTest001, nullptr, nullptr, nullptr,
2859 napi_default, nullptr },
2860 { "submitHIODependTest002", nullptr, SubmitHIODependTest002, nullptr, nullptr, nullptr,
2861 napi_default, nullptr },
2862 { "sleepForTest000", nullptr, SleepForTest000, nullptr, nullptr, nullptr, napi_default, nullptr },
2863 { "sleepForTest001", nullptr, SleepForTest001, nullptr, nullptr, nullptr, napi_default, nullptr },
2864 { "taskAttrAbnormalTest", nullptr, TaskAttrAbnormalTest, nullptr, nullptr, nullptr, napi_default, nullptr },
2865 { "taskAttrQosIllegalTest", nullptr, TaskAttrQosIllegalTest, nullptr, nullptr, nullptr, napi_default, nullptr },
2866 { "taskAttrQosQueryTest", nullptr, TaskAttrQosQueryTest, nullptr, nullptr, nullptr, napi_default, nullptr },
2867 { "taskAttrSetNameTest", nullptr, TaskAttrSetNameTest, nullptr, nullptr, nullptr, napi_default, nullptr },
2868 { "taskAttrSetQosTest", nullptr, TaskAttrSetQosTest, nullptr, nullptr, nullptr, napi_default, nullptr }
2869 };
2870 napi_define_properties(env, exports, sizeof(desc) / sizeof(desc[0]), desc);
2871 return exports;
2872 }
2873 EXTERN_C_END
2874
2875 static napi_module demoModule = {
2876 .nm_version =1,
2877 .nm_flags = 0,
2878 .nm_filename = nullptr,
2879 .nm_register_func = Init,
2880 .nm_modname = "ffrtndk",
2881 .nm_priv = ((void*)0),
2882 .reserved = { 0 },
2883 };
2884
RegisterEntryModule(void)2885 extern "C" __attribute__((constructor)) void RegisterEntryModule(void)
2886 {
2887 napi_module_register(&demoModule);
2888 }
2889