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