1 /*
2  * Copyright (c) 2023 Huawei Device Co., Ltd.
3  * Licensed under the Apache License, Version 2.0 (the "License");
4  * you may not use this file except in compliance with the License.
5  * You may obtain a copy of the License at
6  *
7  *     http://www.apache.org/licenses/LICENSE-2.0
8  *
9  * Unless required by applicable law or agreed to in writing, software
10  * distributed under the License is distributed on an "AS IS" BASIS,
11  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
12  * See the License for the specific language governing permissions and
13  * limitations under the License.
14  */
15 
16 #include "napi/native_api.h"
17 #include <csignal>
18 #include <cstdio>
19 #include <cstdlib>
20 #include <ctime>
21 #include <pthread.h>
22 #include <sys/time.h>
23 #include <unistd.h>
24 
25 #define ATTR_INIT_FAIL (-99)
26 #define ATTR_SETSTACK_FAIL (-98)
27 #define BARRIER_INIT_FAIL (-97)
28 #define CREATE_ERROR (-96)
29 #define JOIN_ERROR (-95)
30 #define BARRIERATTR_INIT_FAIL (-94)
31 #define CONDATTR_INIT_FAIL (-93)
32 #define KEY_CREATE_ERROR (-92)
33 #define LOCK_FAIL (-91)
34 #define RWLOCK_INIT_ERROR (-90)
35 #define RWLOCK_RDLOCK_ERROR (-89)
36 #define RWLOCKATTR_INIT_ERROR (-88)
37 #define PAGE_SIZE_GET_FAIL (-87)
38 #define MEMALIGN_ERROR (-86)
39 #define EQUAL_RES 1
40 #define ERROR (-1)
41 #define NORMAL 0
42 #define TRUE 1
43 #define PARAM_0 0
44 #define PARAM_1 1
45 #define ONE 1
46 #define DEFAULTVALUE (-100)
47 
48 #define STACK_SIZE 4096
49 #define THREADNUM 1
50 #define thousand 1000
51 #define THREAD_STACK_LEN 0x4001
52 #define GUARDSIZE 128
53 #define BARRIERNUM 1
54 #define SLEEPTIME 1
55 
intInput(napi_env env, napi_callback_info info)56 static int intInput(napi_env env, napi_callback_info info)
57 {
58     size_t argc = PARAM_1;
59     napi_value args[1] = {nullptr};
60     napi_get_cb_info(env, info, &argc, args, nullptr, nullptr);
61     int expect;
62     napi_get_value_int32(env, args[0], &expect);
63     return expect;
64 }
intOutput(napi_env env, int output)65 static napi_value intOutput(napi_env env, int output)
66 {
67     napi_value result;
68     napi_create_int32(env, output, &result);
69     return result;
70 }
71 static pthread_mutex_t lock = PTHREAD_MUTEX_INITIALIZER;
Prepare()72 static void Prepare() { pthread_mutex_lock(&lock); }
Parent()73 static void Parent() { pthread_mutex_unlock(&lock); }
child()74 static void child() { pthread_mutex_unlock(&lock); }
TestAtFork(int input)75 static int TestAtFork(int input)
76 {
77     int err = DEFAULTVALUE;
78     if (input == NORMAL) {
79         err = pthread_atfork(Prepare, Parent, child);
80     }
81     return err;
82 }
testAttrDestory(int input)83 static int testAttrDestory(int input)
84 {
85     int err = DEFAULTVALUE;
86     pthread_attr_t attr;
87     if (input == NORMAL) {
88         err = pthread_attr_init(&attr);
89         if (err != NORMAL) {
90             return ATTR_INIT_FAIL;
91         }
92     }
93     if (input == NORMAL) {
94         err = pthread_attr_destroy(&attr);
95     }
96     return err;
97 }
PThreadAtFork(napi_env env, napi_callback_info info)98 static napi_value PThreadAtFork(napi_env env, napi_callback_info info)
99 {
100     int input = intInput(env, info);
101     int result = TestAtFork(input);
102     return intOutput(env, result);
103 }
PThreadAttrDestory(napi_env env, napi_callback_info info)104 static napi_value PThreadAttrDestory(napi_env env, napi_callback_info info)
105 {
106     int input = intInput(env, info);
107     int result = testAttrDestory(input);
108     return intOutput(env, result);
109 }
testAttrGetDetachState(int input)110 static int testAttrGetDetachState(int input)
111 {
112     int err = DEFAULTVALUE;
113     pthread_attr_t attr;
114     int state = PARAM_0;
115     if (input == NORMAL) {
116         err = pthread_attr_init(&attr);
117         if (err != NORMAL) {
118             return ATTR_INIT_FAIL;
119         }
120     }
121     if (input == NORMAL) {
122         err = pthread_attr_getdetachstate(&attr, &state);
123     }
124     return err;
125 }
PThreadAttrGetDetachState(napi_env env, napi_callback_info info)126 static napi_value PThreadAttrGetDetachState(napi_env env, napi_callback_info info)
127 {
128     int input = intInput(env, info);
129     int result = testAttrGetDetachState(input);
130     return intOutput(env, result);
131 }
TestAttrGetGuardSize(int input)132 static int TestAttrGetGuardSize(int input)
133 {
134     size_t size = PARAM_0;
135     int err = DEFAULTVALUE;
136     pthread_attr_t attr;
137     if (input == NORMAL) {
138         err = pthread_attr_init(&attr);
139         if (err != NORMAL) {
140             return ATTR_INIT_FAIL;
141         }
142     }
143     if (input == NORMAL) {
144         err = pthread_attr_getguardsize(&attr, &size);
145     }
146     return err;
147 }
PThreadAttrGetGuardSize(napi_env env, napi_callback_info info)148 static napi_value PThreadAttrGetGuardSize(napi_env env, napi_callback_info info)
149 {
150     int input = intInput(env, info);
151     int result = TestAttrGetGuardSize(input);
152     return intOutput(env, result);
153 }
TestAttrGetInheritSched(int input)154 static int TestAttrGetInheritSched(int input)
155 {
156     int result = ERROR;
157     int err = DEFAULTVALUE;
158     pthread_attr_t attr;
159     if (input == NORMAL) {
160         err = pthread_attr_init(&attr);
161         if (err != NORMAL) {
162             return ATTR_INIT_FAIL;
163         }
164     }
165     if (input == NORMAL) {
166         err = pthread_attr_getinheritsched(&attr, &result);
167     }
168     return err;
169 }
PThreadAttrGetInheritSched(napi_env env, napi_callback_info info)170 static napi_value PThreadAttrGetInheritSched(napi_env env, napi_callback_info info)
171 {
172     int input = intInput(env, info);
173     int result = TestAttrGetInheritSched(input);
174     return intOutput(env, result);
175 }
testAttrGetSchedParam(int input)176 static int testAttrGetSchedParam(int input)
177 {
178     struct sched_param getparam;
179     int err = DEFAULTVALUE;
180     pthread_attr_t attr;
181     if (input == NORMAL) {
182         err = pthread_attr_init(&attr);
183         if (err != NORMAL) {
184             return ATTR_INIT_FAIL;
185         }
186     }
187     if (input == NORMAL) {
188         err = pthread_attr_getschedparam(&attr, &getparam);
189     }
190     return err;
191 }
PThreadAttrGetSchedParam(napi_env env, napi_callback_info info)192 static napi_value PThreadAttrGetSchedParam(napi_env env, napi_callback_info info)
193 {
194     int input = intInput(env, info);
195     int result = testAttrGetSchedParam(input);
196     return intOutput(env, result);
197 }
TestAttrGetSchedPolicy(int input)198 static int TestAttrGetSchedPolicy(int input)
199 {
200     int getpolicy = PARAM_0;
201     int err = DEFAULTVALUE;
202     pthread_attr_t attr;
203     if (input == NORMAL) {
204         err = pthread_attr_init(&attr);
205         if (err != NORMAL) {
206             return ATTR_INIT_FAIL;
207         }
208     }
209     if (input == NORMAL) {
210         err = pthread_attr_getschedpolicy(&attr, &getpolicy);
211     }
212     return err;
213 }
PThreadAttrGetSchedPolicy(napi_env env, napi_callback_info info)214 static napi_value PThreadAttrGetSchedPolicy(napi_env env, napi_callback_info info)
215 {
216     int input = intInput(env, info);
217     int result = TestAttrGetSchedPolicy(input);
218     return intOutput(env, result);
219 }
testAttrGetScope(int input)220 static int testAttrGetScope(int input)
221 {
222     int getscope = PARAM_0;
223     int err = DEFAULTVALUE;
224     pthread_attr_t attr;
225     if (input == NORMAL) {
226         err = pthread_attr_init(&attr);
227         if (err != NORMAL) {
228             return ATTR_INIT_FAIL;
229         }
230     }
231     if (input == NORMAL) {
232         err = pthread_attr_getscope(&attr, &getscope);
233     }
234     return err;
235 }
PThreadAttrGetScope(napi_env env, napi_callback_info info)236 static napi_value PThreadAttrGetScope(napi_env env, napi_callback_info info)
237 {
238     int input = intInput(env, info);
239     int result = testAttrGetScope(input);
240     return intOutput(env, result);
241 }
TestAttrGetStack(int input)242 static int TestAttrGetStack(int input)
243 {
244     void *stack = nullptr;
245     size_t stacksize = PARAM_0;
246     int err = DEFAULTVALUE;
247     pthread_attr_t attr;
248     if (input == NORMAL) {
249         err = pthread_attr_init(&attr);
250         if (err != NORMAL) {
251             return ATTR_INIT_FAIL;
252         }
253     }
254     if (input == NORMAL) {
255         err = pthread_attr_setstack(&attr, stack, STACK_SIZE);
256         if (err != NORMAL) {
257             return ATTR_SETSTACK_FAIL;
258         }
259     }
260     if (input == NORMAL) {
261         err = pthread_attr_getstack(&attr, &stack, &stacksize);
262     }
263     return err;
264 }
PThreadAttrGetStack(napi_env env, napi_callback_info info)265 static napi_value PThreadAttrGetStack(napi_env env, napi_callback_info info)
266 {
267     int input = intInput(env, info);
268     int result = TestAttrGetStack(input);
269     return intOutput(env, result);
270 }
TestAttrGetStackSize(int input)271 static int TestAttrGetStackSize(int input)
272 {
273     size_t stacksize = PARAM_0;
274     int err = DEFAULTVALUE;
275     pthread_attr_t attr;
276     if (input == NORMAL) {
277         err = pthread_attr_init(&attr);
278         if (err != NORMAL) {
279             return ATTR_INIT_FAIL;
280         }
281     }
282     if (input == NORMAL) {
283         err = pthread_attr_getstacksize(&attr, &stacksize);
284     }
285     return err;
286 }
PThreadAttrGetStackSize(napi_env env, napi_callback_info info)287 static napi_value PThreadAttrGetStackSize(napi_env env, napi_callback_info info)
288 {
289     int input = intInput(env, info);
290     int result = TestAttrGetStackSize(input);
291     return intOutput(env, result);
292 }
testAttrInit(int input)293 static int testAttrInit(int input)
294 {
295     int err = DEFAULTVALUE;
296     pthread_attr_t attr;
297     if (input == NORMAL) {
298         err = pthread_attr_init(&attr);
299     }
300     return err;
301 }
PThreadAttrInit(napi_env env, napi_callback_info info)302 static napi_value PThreadAttrInit(napi_env env, napi_callback_info info)
303 {
304     int input = intInput(env, info);
305     int result = testAttrInit(input);
306     return intOutput(env, result);
307 }
testAttrSetDetachState(int input)308 static int testAttrSetDetachState(int input)
309 {
310     int err = DEFAULTVALUE;
311     pthread_attr_t attr;
312     if (input == NORMAL) {
313         err = pthread_attr_init(&attr);
314         if (err != NORMAL) {
315             return ATTR_INIT_FAIL;
316         }
317     }
318     if (input == NORMAL) {
319         err = pthread_attr_setdetachstate(&attr, PTHREAD_CREATE_JOINABLE);
320     }
321     return err;
322 }
PThreadAttrSetDetachState(napi_env env, napi_callback_info info)323 static napi_value PThreadAttrSetDetachState(napi_env env, napi_callback_info info)
324 {
325     int input = intInput(env, info);
326     int result = testAttrSetDetachState(input);
327     return intOutput(env, result);
328 }
testAttrSetGuardSize(int input)329 static int testAttrSetGuardSize(int input)
330 {
331     int err = DEFAULTVALUE;
332     pthread_attr_t attr;
333     if (input == NORMAL) {
334         err = pthread_attr_init(&attr);
335         if (err != NORMAL) {
336             return ATTR_INIT_FAIL;
337         }
338     }
339     if (input == NORMAL) {
340         err = pthread_attr_setguardsize(&attr, GUARDSIZE);
341     }
342     return err;
343 }
PThreadAttrSetGuardSize(napi_env env, napi_callback_info info)344 static napi_value PThreadAttrSetGuardSize(napi_env env, napi_callback_info info)
345 {
346     int input = intInput(env, info);
347     int result = testAttrSetGuardSize(input);
348     return intOutput(env, result);
349 }
testAttrSetInheritSched(int input)350 static int testAttrSetInheritSched(int input)
351 {
352     int err = DEFAULTVALUE;
353     pthread_attr_t attr;
354     if (input == NORMAL) {
355         err = pthread_attr_init(&attr);
356         if (err != NORMAL) {
357             return ATTR_INIT_FAIL;
358         }
359     }
360     if (input == NORMAL) {
361         err = pthread_attr_setinheritsched(&attr, PTHREAD_INHERIT_SCHED);
362     }
363     return err;
364 }
PThreadAttrSetInheritSched(napi_env env, napi_callback_info info)365 static napi_value PThreadAttrSetInheritSched(napi_env env, napi_callback_info info)
366 {
367     int input = intInput(env, info);
368     int result = testAttrSetInheritSched(input);
369     return intOutput(env, result);
370 }
testAttrSetSchedParam(int input)371 static int testAttrSetSchedParam(int input)
372 {
373     struct sched_param setparam;
374     int err = DEFAULTVALUE;
375     pthread_attr_t attr;
376     if (input == NORMAL) {
377         err = pthread_attr_init(&attr);
378         if (err != NORMAL) {
379             return ATTR_INIT_FAIL;
380         }
381     }
382     if (input == NORMAL) {
383         err = pthread_attr_setschedparam(&attr, &setparam);
384     }
385     return err;
386 }
PThreadAttrSetSchedParam(napi_env env, napi_callback_info info)387 static napi_value PThreadAttrSetSchedParam(napi_env env, napi_callback_info info)
388 {
389     int input = intInput(env, info);
390     int result = testAttrSetSchedParam(input);
391     return intOutput(env, result);
392 }
testAttrSetSchedPolicy(int input)393 static int testAttrSetSchedPolicy(int input)
394 {
395     int err = DEFAULTVALUE;
396     pthread_attr_t attr;
397     if (input == NORMAL) {
398         err = pthread_attr_init(&attr);
399         if (err != NORMAL) {
400             return ATTR_INIT_FAIL;
401         }
402     }
403     if (input == NORMAL) {
404         err = pthread_attr_setschedpolicy(&attr, ONE);
405     }
406     return err;
407 }
PThreadAttrSetSchedPolicy(napi_env env, napi_callback_info info)408 static napi_value PThreadAttrSetSchedPolicy(napi_env env, napi_callback_info info)
409 {
410     int input = intInput(env, info);
411     int result = testAttrSetSchedPolicy(input);
412     return intOutput(env, result);
413 }
testAttrSetScope(int input)414 static int testAttrSetScope(int input)
415 {
416     int err = DEFAULTVALUE;
417     pthread_attr_t attr;
418     if (input == NORMAL) {
419         err = pthread_attr_init(&attr);
420         if (err != NORMAL) {
421             return ATTR_INIT_FAIL;
422         }
423     }
424     if (input == NORMAL) {
425         err = pthread_attr_setscope(&attr, PARAM_0);
426     }
427     return err;
428 }
PThreadAttrSetScope(napi_env env, napi_callback_info info)429 static napi_value PThreadAttrSetScope(napi_env env, napi_callback_info info)
430 {
431     int input = intInput(env, info);
432     int result = testAttrSetScope(input);
433     return intOutput(env, result);
434 }
testAttrSetStack(int input)435 static int testAttrSetStack(int input)
436 {
437     void *stackAddr = nullptr;
438 
439     int err = DEFAULTVALUE;
440     pthread_attr_t attr;
441     if (input == NORMAL) {
442         err = pthread_attr_init(&attr);
443         if (err != NORMAL) {
444             return ATTR_INIT_FAIL;
445         }
446     }
447     int pageSize = getpagesize();
448     if (pageSize == PARAM_0) {
449         return PAGE_SIZE_GET_FAIL;
450     }
451     if (input == NORMAL) {
452         int ret = posix_memalign(&stackAddr, pageSize, THREAD_STACK_LEN);
453         if (ret != PARAM_0) {
454             return MEMALIGN_ERROR;
455         }
456         err = pthread_attr_setstack(&attr, stackAddr, STACK_SIZE);
457     }
458     return err;
459 }
PThreadAttrSetStack(napi_env env, napi_callback_info info)460 static napi_value PThreadAttrSetStack(napi_env env, napi_callback_info info)
461 {
462     int input = intInput(env, info);
463     int result = testAttrSetStack(input);
464     return intOutput(env, result);
465 }
testAttrSetStackSize(int input)466 static int testAttrSetStackSize(int input)
467 {
468     int err = DEFAULTVALUE;
469     pthread_attr_t attr;
470     if (input == NORMAL) {
471         err = pthread_attr_init(&attr);
472         if (err != NORMAL) {
473             return ATTR_INIT_FAIL;
474         }
475     }
476     if (input == NORMAL) {
477         err = pthread_attr_setstacksize(&attr, STACK_SIZE);
478     }
479     return err;
480 }
PThreadAttrSetStackSize(napi_env env, napi_callback_info info)481 static napi_value PThreadAttrSetStackSize(napi_env env, napi_callback_info info)
482 {
483     int input = intInput(env, info);
484     int result = testAttrSetStackSize(input);
485     return intOutput(env, result);
486 }
TestBarrierInit(int input)487 static int TestBarrierInit(int input)
488 {
489     int err = DEFAULTVALUE;
490     pthread_barrier_t barrierT;
491     pthread_barrierattr_t barrierAttr;
492     if (input == NORMAL) {
493         err = pthread_barrier_init(&barrierT, &barrierAttr, BARRIERNUM);
494     }
495     return err;
496 }
PThreadBarrierInit(napi_env env, napi_callback_info info)497 static napi_value PThreadBarrierInit(napi_env env, napi_callback_info info)
498 {
499     int input = intInput(env, info);
500     int result = TestBarrierInit(input);
501     return intOutput(env, result);
502 }
testBarrierDestroy(int input)503 static int testBarrierDestroy(int input)
504 {
505     unsigned int baInt = BARRIERNUM;
506     int err = DEFAULTVALUE;
507     pthread_barrier_t barrierT;
508     pthread_barrierattr_t barrierAttr;
509     if (input == NORMAL) {
510         err = pthread_barrier_init(&barrierT, &barrierAttr, baInt);
511         if (err != NORMAL) {
512             return BARRIER_INIT_FAIL;
513         }
514     }
515     if (input == NORMAL) {
516         err = pthread_barrier_destroy(&barrierT);
517     }
518     return err;
519 }
PThreadBarrierDestroy(napi_env env, napi_callback_info info)520 static napi_value PThreadBarrierDestroy(napi_env env, napi_callback_info info)
521 {
522     int input = intInput(env, info);
523     int result = testBarrierDestroy(input);
524     return intOutput(env, result);
525 }
526 pthread_barrier_t WaitBarrier;
threadFunc(void *)527 static void *threadFunc(void *)
528 {
529     pthread_barrier_wait(&WaitBarrier);
530     return nullptr;
531 }
testBarrierWait(int input)532 static int testBarrierWait(int input)
533 {
534     int err = DEFAULTVALUE;
535     pthread_t ids[THREADNUM];
536     if (input == NORMAL) {
537         err = pthread_barrier_init(&WaitBarrier, nullptr, THREADNUM);
538         if (err != NORMAL) {
539             return BARRIER_INIT_FAIL;
540         }
541     }
542     for (int i = PARAM_0; i < THREADNUM; i++) {
543         err = pthread_create(static_cast<pthread_t *>((&(ids[i]))), nullptr, threadFunc, nullptr);
544         if (err != NORMAL) {
545             return CREATE_ERROR;
546         }
547     }
548     for (int i = PARAM_0; i < THREADNUM; i++) {
549         err = pthread_join(ids[i], (void **)nullptr);
550         if (err != NORMAL) {
551             return JOIN_ERROR;
552         }
553     }
554     if (input == NORMAL) {
555         err = pthread_barrier_destroy(&WaitBarrier);
556     }
557     return PARAM_0;
558 }
PThreadBarrierWait(napi_env env, napi_callback_info info)559 static napi_value PThreadBarrierWait(napi_env env, napi_callback_info info)
560 {
561     int input = intInput(env, info);
562     int result = testBarrierWait(input);
563     return intOutput(env, result);
564 }
testBarrierAttrInit(int input)565 static int testBarrierAttrInit(int input)
566 {
567     int err = DEFAULTVALUE;
568     pthread_barrierattr_t barrierAttr;
569     if (input == NORMAL) {
570         err = pthread_barrierattr_init(&barrierAttr);
571     }
572     return err;
573 }
PThreadBarrierAttrInit(napi_env env, napi_callback_info info)574 static napi_value PThreadBarrierAttrInit(napi_env env, napi_callback_info info)
575 {
576     int input = intInput(env, info);
577     int result = testBarrierAttrInit(input);
578     return intOutput(env, result);
579 }
testBarrierAttrGetPShared(int input)580 static int testBarrierAttrGetPShared(int input)
581 {
582     int err = DEFAULTVALUE;
583     pthread_barrierattr_t barrierAttr;
584     int shared = PARAM_0;
585     if (input == NORMAL) {
586         err = pthread_barrierattr_init(&barrierAttr);
587         if (err != NORMAL) {
588             return BARRIERATTR_INIT_FAIL;
589         }
590     }
591     if (input == NORMAL) {
592         err = pthread_barrierattr_getpshared(&barrierAttr, &shared);
593     }
594     return err;
595 }
PThreadBarrierAttrGetPShared(napi_env env, napi_callback_info info)596 static napi_value PThreadBarrierAttrGetPShared(napi_env env, napi_callback_info info)
597 {
598     int input = intInput(env, info);
599     int result = testBarrierAttrGetPShared(input);
600     return intOutput(env, result);
601 }
testBarrierAttrDestroy(int input)602 static int testBarrierAttrDestroy(int input)
603 {
604     int err = DEFAULTVALUE;
605     pthread_barrierattr_t barrierAttr;
606     if (input == NORMAL) {
607         err = pthread_barrierattr_init(&barrierAttr);
608         if (err != NORMAL) {
609             return BARRIERATTR_INIT_FAIL;
610         }
611     }
612     if (input == NORMAL) {
613         err = pthread_barrierattr_destroy(&barrierAttr);
614     }
615     return err;
616 }
PThreadBarrierAttrDestroy(napi_env env, napi_callback_info info)617 static napi_value PThreadBarrierAttrDestroy(napi_env env, napi_callback_info info)
618 {
619     int input = intInput(env, info);
620     int result = testBarrierAttrDestroy(input);
621     return intOutput(env, result);
622 }
testBarrierAttrSetPShared(int input)623 static int testBarrierAttrSetPShared(int input)
624 {
625     int err = DEFAULTVALUE;
626     pthread_barrierattr_t barrierAttr;
627     if (input == NORMAL) {
628         err = pthread_barrierattr_init(&barrierAttr);
629         if (err != NORMAL) {
630             return BARRIERATTR_INIT_FAIL;
631         }
632     }
633     if (input == NORMAL) {
634         err = pthread_barrierattr_setpshared(&barrierAttr, PARAM_0);
635     }
636     return err;
637 }
PThreadBarrierAttrSetPShared(napi_env env, napi_callback_info info)638 static napi_value PThreadBarrierAttrSetPShared(napi_env env, napi_callback_info info)
639 {
640     int input = intInput(env, info);
641     int result = testBarrierAttrSetPShared(input);
642     return intOutput(env, result);
643 }
testCondInit(int input)644 static int testCondInit(int input)
645 {
646     int err = DEFAULTVALUE;
647     pthread_cond_t condT;
648     pthread_condattr_t condAttr;
649 
650     if (input == NORMAL) {
651         err = pthread_cond_init(&condT, &condAttr);
652     }
653     return err;
654 }
PThreadCondInit(napi_env env, napi_callback_info info)655 static napi_value PThreadCondInit(napi_env env, napi_callback_info info)
656 {
657     int input = intInput(env, info);
658     int result = testCondInit(input);
659     return intOutput(env, result);
660 }
TestCondDestory(int input)661 static int TestCondDestory(int input)
662 {
663     int err = DEFAULTVALUE;
664     pthread_cond_t condT;
665     pthread_condattr_t condAttr;
666 
667     if (input == NORMAL) {
668         err = pthread_cond_init(&condT, &condAttr);
669         err = pthread_cond_destroy(&condT);
670     }
671     return err;
672 }
PThreadCondDestroy(napi_env env, napi_callback_info info)673 static napi_value PThreadCondDestroy(napi_env env, napi_callback_info info)
674 {
675     int input = intInput(env, info);
676     int result = TestCondDestory(input);
677     return intOutput(env, result);
678 }
testCondBroadcast(int input)679 static int testCondBroadcast(int input)
680 {
681     int err = DEFAULTVALUE;
682     pthread_cond_t condT;
683     if (input == NORMAL) {
684         err = pthread_cond_broadcast(&condT);
685     }
686     return err;
687 }
PThreadCondBroadcast(napi_env env, napi_callback_info info)688 static napi_value PThreadCondBroadcast(napi_env env, napi_callback_info info)
689 {
690     int input = intInput(env, info);
691     int result = testCondBroadcast(input);
692     return intOutput(env, result);
693 }
testCondSignal(int input)694 static int testCondSignal(int input)
695 {
696     int err = DEFAULTVALUE;
697     pthread_cond_t condT;
698     if (input == NORMAL) {
699         err = pthread_cond_signal(&condT);
700     }
701     return err;
702 }
PThreadCondSignal(napi_env env, napi_callback_info info)703 static napi_value PThreadCondSignal(napi_env env, napi_callback_info info)
704 {
705     int input = intInput(env, info);
706     int result = testCondSignal(input);
707     return intOutput(env, result);
708 }
709 pthread_cond_t condTestCondWaits;
710 pthread_cond_t g_condTs;
threadFunc2(void *)711 static void *threadFunc2(void *)
712 {
713     sleep(SLEEPTIME);
714     pthread_cond_broadcast(&condTestCondWaits);
715     return nullptr;
716 }
717 
testCondWait(int input)718 static int testCondWait(int input)
719 {
720     int err = DEFAULTVALUE;
721     pthread_t pid;
722     if (input == NORMAL) {
723         err = pthread_create(&pid, nullptr, threadFunc2, nullptr);
724         if (err != NORMAL) {
725             return CREATE_ERROR;
726         }
727         static pthread_mutex_t gmutex;
728         pthread_mutex_lock(&gmutex);
729         err = pthread_cond_wait(&condTestCondWaits, &gmutex);
730     }
731     return err;
732 }
PThreadCondWait(napi_env env, napi_callback_info info)733 static napi_value PThreadCondWait(napi_env env, napi_callback_info info)
734 {
735     int input = intInput(env, info);
736     int result = testCondWait(input);
737     return intOutput(env, result);
738 }
threadTimedWait(void *)739 static void *threadTimedWait(void *)
740 {
741     pthread_mutex_t gmutex;
742     timeval now;
743     timespec outTime;
744     pthread_mutex_lock(&gmutex);
745     gettimeofday(&now, nullptr);
746     outTime.tv_sec = now.tv_sec + 1;
747     outTime.tv_nsec = now.tv_usec * thousand;
748     pthread_cond_timedwait(&g_condTs, &gmutex, &outTime);
749     return nullptr;
750 }
testCondTimedWait(int input)751 static int testCondTimedWait(int input)
752 {
753     int err = PARAM_0;
754     pthread_t pid;
755     if (input == PARAM_0) {
756         err = pthread_create(&pid, nullptr, threadTimedWait, nullptr);
757         if (err != NORMAL) {
758             return CREATE_ERROR;
759         }
760     }
761     return err;
762 }
PThreadCondTimedWait(napi_env env, napi_callback_info info)763 static napi_value PThreadCondTimedWait(napi_env env, napi_callback_info info)
764 {
765     int input = intInput(env, info);
766     int result = testCondTimedWait(input);
767     return intOutput(env, result);
768 }
testCondAttrInit(int input)769 static int testCondAttrInit(int input)
770 {
771     int err = DEFAULTVALUE;
772     pthread_condattr_t condAttr;
773     if (input == NORMAL) {
774         err = pthread_condattr_init(&condAttr);
775     }
776     return err;
777 }
PThreadCondAttrInit(napi_env env, napi_callback_info info)778 static napi_value PThreadCondAttrInit(napi_env env, napi_callback_info info)
779 {
780     int input = intInput(env, info);
781     int result = testCondAttrInit(input);
782     return intOutput(env, result);
783 }
testCondAttrDestroy(int input)784 static int testCondAttrDestroy(int input)
785 {
786     int err = DEFAULTVALUE;
787     pthread_condattr_t condAttr;
788     if (input == NORMAL) {
789         err = pthread_condattr_init(&condAttr);
790         if (err != NORMAL) {
791             return CONDATTR_INIT_FAIL;
792         }
793         err = pthread_condattr_destroy(&condAttr);
794     }
795     return err;
796 }
PThreadCondAttrDestroy(napi_env env, napi_callback_info info)797 static napi_value PThreadCondAttrDestroy(napi_env env, napi_callback_info info)
798 {
799     int input = intInput(env, info);
800     int result = testCondAttrDestroy(input);
801     return intOutput(env, result);
802 }
TestCondAttrGetClock(int input)803 static int TestCondAttrGetClock(int input)
804 {
805     int err = DEFAULTVALUE;
806     pthread_condattr_t condAttr;
807     clockid_t clockid;
808     if (input == NORMAL) {
809         err = pthread_condattr_init(&condAttr);
810         if (err != NORMAL) {
811             return CONDATTR_INIT_FAIL;
812         }
813         err = pthread_condattr_getclock(&condAttr, &clockid);
814     }
815     return err;
816 }
PThreadCondAttrGetClock(napi_env env, napi_callback_info info)817 static napi_value PThreadCondAttrGetClock(napi_env env, napi_callback_info info)
818 {
819     int input = intInput(env, info);
820     int result = TestCondAttrGetClock(input);
821     return intOutput(env, result);
822 }
TestCondAttrGetPShared(int input)823 static int TestCondAttrGetPShared(int input)
824 {
825     int err = DEFAULTVALUE;
826     pthread_condattr_t condAttr;
827     if (input == NORMAL) {
828         err = pthread_condattr_init(&condAttr);
829         if (err != NORMAL) {
830             return CONDATTR_INIT_FAIL;
831         }
832         err = pthread_condattr_getpshared(&condAttr, PARAM_0);
833     }
834     return err;
835 }
PThreadCondAttrGetPShared(napi_env env, napi_callback_info info)836 static napi_value PThreadCondAttrGetPShared(napi_env env, napi_callback_info info)
837 {
838     int input = intInput(env, info);
839     int result = TestCondAttrGetPShared(input);
840     return intOutput(env, result);
841 }
TestCondAttrSetClock(int input)842 static int TestCondAttrSetClock(int input)
843 {
844     int err = DEFAULTVALUE;
845     pthread_condattr_t condAttr;
846     clockid_t clockid = CLOCK_MONOTONIC;
847     if (input == NORMAL) {
848         err = pthread_condattr_init(&condAttr);
849         if (err != NORMAL) {
850             return CONDATTR_INIT_FAIL;
851         }
852         err = pthread_condattr_setclock(&condAttr, clockid);
853     }
854     return err;
855 }
PThreadCondAttrSetClock(napi_env env, napi_callback_info info)856 static napi_value PThreadCondAttrSetClock(napi_env env, napi_callback_info info)
857 {
858     int input = intInput(env, info);
859     int result = TestCondAttrSetClock(input);
860     return intOutput(env, result);
861 }
testCondAttrSetPShared(int input)862 static int testCondAttrSetPShared(int input)
863 {
864     int err = DEFAULTVALUE;
865     pthread_condattr_t condAttr;
866     int shared = TRUE;
867     if (input == NORMAL) {
868         err = pthread_condattr_init(&condAttr);
869         if (err != NORMAL) {
870             return CONDATTR_INIT_FAIL;
871         }
872         err = pthread_condattr_setpshared(&condAttr, shared);
873     }
874     return err;
875 }
PThreadCondAttrSetPShared(napi_env env, napi_callback_info info)876 static napi_value PThreadCondAttrSetPShared(napi_env env, napi_callback_info info)
877 {
878     int input = intInput(env, info);
879     int result = testCondAttrSetPShared(input);
880     return intOutput(env, result);
881 }
ThreadFunc3(void *)882 static void *ThreadFunc3(void *) { return nullptr; }
testCreate(int input)883 static int testCreate(int input)
884 {
885     int err = DEFAULTVALUE;
886     pthread_t pid;
887     if (input == NORMAL) {
888         err = pthread_create(&pid, nullptr, ThreadFunc3, nullptr);
889     }
890     return err;
891 }
PThreadCreate(napi_env env, napi_callback_info info)892 static napi_value PThreadCreate(napi_env env, napi_callback_info info)
893 {
894     int input = intInput(env, info);
895     int result = testCreate(input);
896     return intOutput(env, result);
897 }
testDetach(int input)898 static int testDetach(int input)
899 {
900     int err = DEFAULTVALUE;
901     pthread_t pid = PARAM_0;
902     if (input == NORMAL) {
903         err = pthread_create(&pid, nullptr, ThreadFunc3, nullptr);
904         if (err != NORMAL) {
905             return CREATE_ERROR;
906         }
907         err = pthread_detach(pid);
908     }
909     return err;
910 }
PThreadDetach(napi_env env, napi_callback_info info)911 static napi_value PThreadDetach(napi_env env, napi_callback_info info)
912 {
913     int input = intInput(env, info);
914     int result = testDetach(input);
915     return intOutput(env, result);
916 }
917 
testEqual(int input)918 static int testEqual(int input)
919 {
920     int err = DEFAULTVALUE;
921     pthread_t pid = PARAM_0;
922     if (input == NORMAL) {
923         err = pthread_create(&pid, nullptr, ThreadFunc3, nullptr);
924         if (err != NORMAL) {
925             return CREATE_ERROR;
926         }
927         err = pthread_equal(pid, pid);
928         if (err != NORMAL) {
929             return EQUAL_RES;
930         }
931     }
932     return err;
933 }
PThreadEqual(napi_env env, napi_callback_info info)934 static napi_value PThreadEqual(napi_env env, napi_callback_info info)
935 {
936     int input = intInput(env, info);
937     int result = testEqual(input);
938     return intOutput(env, result);
939 }
testEqual2(int input)940 static int testEqual2(int input)
941 {
942     int err = DEFAULTVALUE;
943     pthread_t pidFirst = PARAM_0;
944     pthread_t pidsecond = PARAM_0;
945     if (input == NORMAL) {
946         err = pthread_create(&pidFirst, nullptr, ThreadFunc3, nullptr);
947         if (err != NORMAL) {
948             return CREATE_ERROR;
949         }
950         err = pthread_create(&pidsecond, nullptr, ThreadFunc3, nullptr);
951         if (err != NORMAL) {
952             return CREATE_ERROR;
953         }
954         err = pthread_equal(pidFirst, pidsecond);
955     }
956     return err;
957 }
PThreadEqual2(napi_env env, napi_callback_info info)958 static napi_value PThreadEqual2(napi_env env, napi_callback_info info)
959 {
960     int input = intInput(env, info);
961     int result = testEqual2(input);
962     return intOutput(env, result);
963 }
964 int g_exitOne = PARAM_0;
threadFunc4(void *)965 static void *threadFunc4(void *) { pthread_exit(&g_exitOne); }
testExit(int input)966 static int testExit(int input)
967 {
968     int err = DEFAULTVALUE;
969     pthread_t pidFirst = PARAM_0;
970     void *pThreadResult = nullptr;
971     if (input == NORMAL) {
972         err = pthread_create(&pidFirst, nullptr, threadFunc4, nullptr);
973         if (err != NORMAL) {
974             return CREATE_ERROR;
975         }
976         err = pthread_join(pidFirst, &pThreadResult);
977     }
978     return err;
979 }
PThreadExit(napi_env env, napi_callback_info info)980 static napi_value PThreadExit(napi_env env, napi_callback_info info)
981 {
982     int input = intInput(env, info);
983     int result = testExit(input);
984     return intOutput(env, result);
985 }
testGetAttrNp(int input)986 static int testGetAttrNp(int input)
987 {
988     int err = DEFAULTVALUE;
989     pthread_t pidFirst = PARAM_0;
990     pthread_attr_t pthreadAttr;
991     if (input == NORMAL) {
992         err = pthread_create(&pidFirst, nullptr, ThreadFunc3, nullptr);
993         if (err != NORMAL) {
994             return CREATE_ERROR;
995         }
996         err = pthread_getattr_np(pidFirst, &pthreadAttr);
997     }
998     return err;
999 }
PThreadGetAttrNp(napi_env env, napi_callback_info info)1000 static napi_value PThreadGetAttrNp(napi_env env, napi_callback_info info)
1001 {
1002     int input = intInput(env, info);
1003     int result = testGetAttrNp(input);
1004     return intOutput(env, result);
1005 }
testGetCpuClockId(int input)1006 static int testGetCpuClockId(int input)
1007 {
1008     int err = DEFAULTVALUE;
1009     pthread_t pidFirst = PARAM_0;
1010     clockid_t clockid = PARAM_0;
1011     if (input == NORMAL) {
1012         err = pthread_create(&pidFirst, nullptr, ThreadFunc3, nullptr);
1013         if (err != NORMAL) {
1014             return CREATE_ERROR;
1015         }
1016         err = pthread_getcpuclockid(pidFirst, &clockid);
1017     }
1018     return err;
1019 }
PThreadGetCpuClockId(napi_env env, napi_callback_info info)1020 static napi_value PThreadGetCpuClockId(napi_env env, napi_callback_info info)
1021 {
1022     int input = intInput(env, info);
1023     int result = testGetCpuClockId(input);
1024     return intOutput(env, result);
1025 }
testGetSchedParam(int input)1026 static int testGetSchedParam(int input)
1027 {
1028     int err = DEFAULTVALUE;
1029     pthread_t pidFirst = PARAM_0;
1030     int policy = PARAM_0;
1031     struct sched_param schedParam;
1032     if (input == NORMAL) {
1033         err = pthread_create(&pidFirst, nullptr, ThreadFunc3, nullptr);
1034         if (err != NORMAL) {
1035             return CREATE_ERROR;
1036         }
1037         err = pthread_getschedparam(pidFirst, &policy, &schedParam);
1038     }
1039     return err;
1040 }
PThreadGetSchedParam(napi_env env, napi_callback_info info)1041 static napi_value PThreadGetSchedParam(napi_env env, napi_callback_info info)
1042 {
1043     int input = intInput(env, info);
1044     int result = testGetSchedParam(input);
1045     return intOutput(env, result);
1046 }
1047 static pthread_key_t g_testGetSpecificKey;
1048 int32_t *keyRet = nullptr;
1049 int keyRes = PARAM_0;
threadFuncA(void *)1050 void *threadFuncA(void *)
1051 {
1052     int value = PARAM_0;
1053     pthread_setspecific(g_testGetSpecificKey, &value);
1054     keyRet = static_cast<int *>(pthread_getspecific(g_testGetSpecificKey));
1055     keyRes = *keyRet;
1056     pthread_exit(&keyRes);
1057 }
testGetSpecific(int input)1058 static int testGetSpecific(int input)
1059 {
1060     int err = DEFAULTVALUE;
1061     pthread_t pidFirst;
1062     void *pThreadResult = nullptr;
1063     if (input == NORMAL) {
1064         err = pthread_key_create(&g_testGetSpecificKey, nullptr);
1065         if (err != NORMAL) {
1066             return KEY_CREATE_ERROR;
1067         }
1068         err = pthread_create(&pidFirst, nullptr, threadFuncA, nullptr);
1069         if (err != NORMAL) {
1070             return CREATE_ERROR;
1071         }
1072         pthread_join(pidFirst, &pThreadResult);
1073     }
1074     return *(int32_t *)pThreadResult;
1075 }
PThreadGetSpecific(napi_env env, napi_callback_info info)1076 static napi_value PThreadGetSpecific(napi_env env, napi_callback_info info)
1077 {
1078     int input = intInput(env, info);
1079     int result = testGetSpecific(input);
1080     return intOutput(env, result);
1081 }
TestJoin(int input)1082 static int TestJoin(int input)
1083 {
1084     int err = DEFAULTVALUE;
1085     pthread_t pidFirst = PARAM_0;
1086     if (input == NORMAL) {
1087         err = pthread_create(&pidFirst, nullptr, threadFuncA, nullptr);
1088         if (err != NORMAL) {
1089             return CREATE_ERROR;
1090         }
1091         err = pthread_join(pidFirst, nullptr);
1092     }
1093     return err;
1094 }
PThreadJoin(napi_env env, napi_callback_info info)1095 static napi_value PThreadJoin(napi_env env, napi_callback_info info)
1096 {
1097     int input = intInput(env, info);
1098     int result = TestJoin(input);
1099     return intOutput(env, result);
1100 }
testKeyCreate(int input)1101 static int testKeyCreate(int input)
1102 {
1103     int err = DEFAULTVALUE;
1104     if (input == NORMAL) {
1105         err = pthread_key_create(&g_testGetSpecificKey, nullptr);
1106     }
1107     return err;
1108 }
PThreadKeyCreate(napi_env env, napi_callback_info info)1109 static napi_value PThreadKeyCreate(napi_env env, napi_callback_info info)
1110 {
1111     int input = intInput(env, info);
1112     int result = testKeyCreate(input);
1113     return intOutput(env, result);
1114 }
testKeyDelete(int input)1115 static int testKeyDelete(int input)
1116 {
1117     int err = DEFAULTVALUE;
1118     if (input == NORMAL) {
1119         err = pthread_key_create(&g_testGetSpecificKey, nullptr);
1120         if (err != NORMAL) {
1121             return KEY_CREATE_ERROR;
1122         }
1123         err = pthread_key_delete(g_testGetSpecificKey);
1124     }
1125     return err;
1126 }
PThreadKeyDelete(napi_env env, napi_callback_info info)1127 static napi_value PThreadKeyDelete(napi_env env, napi_callback_info info)
1128 {
1129     int input = intInput(env, info);
1130     int result = testKeyDelete(input);
1131     return intOutput(env, result);
1132 }
threadFunc5(void *)1133 static void *threadFunc5(void *)
1134 {
1135     sleep(SLEEPTIME);
1136     return nullptr;
1137 }
1138 
testKill(int input)1139 static int testKill(int input)
1140 {
1141     int err = DEFAULTVALUE;
1142     pthread_t pidFirst;
1143     if (input == NORMAL) {
1144         err = pthread_create(&pidFirst, nullptr, threadFunc5, nullptr);
1145         if (err != NORMAL) {
1146             return CREATE_ERROR;
1147         }
1148         err = pthread_kill(pidFirst, PARAM_0);
1149     }
1150     return err;
1151 }
PThreadKill(napi_env env, napi_callback_info info)1152 static napi_value PThreadKill(napi_env env, napi_callback_info info)
1153 {
1154     int input = intInput(env, info);
1155     int result = testKill(input);
1156     return intOutput(env, result);
1157 }
TestMutexInit(int input)1158 static int TestMutexInit(int input)
1159 {
1160     int err = DEFAULTVALUE;
1161     pthread_mutex_t mutexOne;
1162     pthread_mutexattr_t mutexAttr;
1163     if (input == NORMAL) {
1164         err = pthread_mutex_init(&mutexOne, &mutexAttr);
1165     }
1166     return err;
1167 }
PThreadMutexInit(napi_env env, napi_callback_info info)1168 static napi_value PThreadMutexInit(napi_env env, napi_callback_info info)
1169 {
1170     int input = intInput(env, info);
1171     int result = TestMutexInit(input);
1172     return intOutput(env, result);
1173 }
TestMutexDestroy(int input)1174 static int TestMutexDestroy(int input)
1175 {
1176     int err = DEFAULTVALUE;
1177     pthread_mutex_t mutexOne;
1178     pthread_mutexattr_t mutexAttr;
1179     if (input == NORMAL) {
1180         err = pthread_mutex_init(&mutexOne, &mutexAttr);
1181     }
1182     err = pthread_mutex_destroy(&mutexOne);
1183     return err;
1184 }
PThreadMutexDestroy(napi_env env, napi_callback_info info)1185 static napi_value PThreadMutexDestroy(napi_env env, napi_callback_info info)
1186 {
1187     int input = intInput(env, info);
1188     int result = TestMutexDestroy(input);
1189     return intOutput(env, result);
1190 }
TestMutexLock(int input)1191 static int TestMutexLock(int input)
1192 {
1193     int err = DEFAULTVALUE;
1194     pthread_mutex_t mutexOne;
1195     pthread_mutexattr_t mutexAttr;
1196     if (input == NORMAL) {
1197         err = pthread_mutex_init(&mutexOne, &mutexAttr);
1198     }
1199     err = pthread_mutex_lock(&mutexOne);
1200     return err;
1201 }
PThreadMutexLock(napi_env env, napi_callback_info info)1202 static napi_value PThreadMutexLock(napi_env env, napi_callback_info info)
1203 {
1204     int input = intInput(env, info);
1205     int result = TestMutexLock(input);
1206     return intOutput(env, result);
1207 }
testMutexTimedLock(int input)1208 static int testMutexTimedLock(int input)
1209 {
1210     int err = DEFAULTVALUE;
1211     pthread_mutex_t mutexOne;
1212     pthread_mutexattr_t mutexAttr;
1213     if (input == NORMAL) {
1214         err = pthread_mutex_init(&mutexOne, &mutexAttr);
1215     }
1216     struct timeval now;
1217     struct timespec outTime;
1218     outTime.tv_sec = now.tv_sec + SLEEPTIME;
1219     outTime.tv_nsec = now.tv_usec * thousand;
1220     err = pthread_mutex_timedlock(&mutexOne, &outTime);
1221     return err;
1222 }
PThreadMutexTimedLock(napi_env env, napi_callback_info info)1223 static napi_value PThreadMutexTimedLock(napi_env env, napi_callback_info info)
1224 {
1225     int input = intInput(env, info);
1226     int result = testMutexTimedLock(input);
1227     return intOutput(env, result);
1228 }
TestMutexTryLock(int input)1229 static int TestMutexTryLock(int input)
1230 {
1231     int err = DEFAULTVALUE;
1232     pthread_mutex_t mutexOne;
1233     pthread_mutexattr_t mutexAttr;
1234     if (input == NORMAL) {
1235         err = pthread_mutex_init(&mutexOne, &mutexAttr);
1236     }
1237     err = pthread_mutex_trylock(&mutexOne);
1238     return err;
1239 }
PThreadMutexTryLock(napi_env env, napi_callback_info info)1240 static napi_value PThreadMutexTryLock(napi_env env, napi_callback_info info)
1241 {
1242     int input = intInput(env, info);
1243     int result = TestMutexTryLock(input);
1244     return intOutput(env, result);
1245 }
testMutexUnLock(int input)1246 static int testMutexUnLock(int input)
1247 {
1248     int err = DEFAULTVALUE;
1249     pthread_mutex_t mutexOne;
1250     pthread_mutexattr_t mutexAttr;
1251     if (input == NORMAL) {
1252         err = pthread_mutex_init(&mutexOne, &mutexAttr);
1253     }
1254     err = pthread_mutex_lock(&mutexOne);
1255     if (err != NORMAL) {
1256         return LOCK_FAIL;
1257     }
1258     err = pthread_mutex_unlock(&mutexOne);
1259     return err;
1260 }
PThreadMutexUnLock(napi_env env, napi_callback_info info)1261 static napi_value PThreadMutexUnLock(napi_env env, napi_callback_info info)
1262 {
1263     int input = intInput(env, info);
1264     int result = testMutexUnLock(input);
1265     return intOutput(env, result);
1266 }
TestMutexAttrDestroy(int input)1267 static int TestMutexAttrDestroy(int input)
1268 {
1269     int err = DEFAULTVALUE;
1270     pthread_mutexattr_t mutexAttr;
1271     if (input == NORMAL) {
1272         err = pthread_mutexattr_init(&mutexAttr);
1273         if (err != NORMAL) {
1274             return LOCK_FAIL;
1275         }
1276     }
1277     err = pthread_mutexattr_destroy(&mutexAttr);
1278     return err;
1279 }
PThreadMutexAttrDestroy(napi_env env, napi_callback_info info)1280 static napi_value PThreadMutexAttrDestroy(napi_env env, napi_callback_info info)
1281 {
1282     int input = intInput(env, info);
1283     int result = TestMutexAttrDestroy(input);
1284     return intOutput(env, result);
1285 }
testMutexAttrGetProtocol(int input)1286 static int testMutexAttrGetProtocol(int input)
1287 {
1288     int err = DEFAULTVALUE;
1289     int protocol = PARAM_0;
1290     pthread_mutexattr_t mutexAttr;
1291     if (input == NORMAL) {
1292         err = pthread_mutexattr_init(&mutexAttr);
1293         if (err != NORMAL) {
1294             return LOCK_FAIL;
1295         }
1296     }
1297     err = pthread_mutexattr_getprotocol(&mutexAttr, &protocol);
1298     return err;
1299 }
PThreadMutexAttrGetProtocol(napi_env env, napi_callback_info info)1300 static napi_value PThreadMutexAttrGetProtocol(napi_env env, napi_callback_info info)
1301 {
1302     int input = intInput(env, info);
1303     int result = testMutexAttrGetProtocol(input);
1304     return intOutput(env, result);
1305 }
testMutexAttrGetPshared(int input)1306 static int testMutexAttrGetPshared(int input)
1307 {
1308     int err = DEFAULTVALUE;
1309     int share = PARAM_0;
1310     pthread_mutexattr_t mutexAttr;
1311     if (input == NORMAL) {
1312         err = pthread_mutexattr_init(&mutexAttr);
1313         if (err != NORMAL) {
1314             return LOCK_FAIL;
1315         }
1316     }
1317     err = pthread_mutexattr_getpshared(&mutexAttr, &share);
1318     return err;
1319 }
PThreadMutexAttrGetPShared(napi_env env, napi_callback_info info)1320 static napi_value PThreadMutexAttrGetPShared(napi_env env, napi_callback_info info)
1321 {
1322     int input = intInput(env, info);
1323     int result = testMutexAttrGetPshared(input);
1324     return intOutput(env, result);
1325 }
TestMutexAttrGetType(int input)1326 static int TestMutexAttrGetType(int input)
1327 {
1328     int err = DEFAULTVALUE;
1329     int type = PARAM_0;
1330     pthread_mutexattr_t mutexAttr;
1331     if (input == NORMAL) {
1332         err = pthread_mutexattr_init(&mutexAttr);
1333         if (err != NORMAL) {
1334             return LOCK_FAIL;
1335         }
1336     }
1337     err = pthread_mutexattr_gettype(&mutexAttr, &type);
1338     return err;
1339 }
PThreadMutexAttrGetType(napi_env env, napi_callback_info info)1340 static napi_value PThreadMutexAttrGetType(napi_env env, napi_callback_info info)
1341 {
1342     int input = intInput(env, info);
1343     int result = TestMutexAttrGetType(input);
1344     return intOutput(env, result);
1345 }
TestMutexAttrInit(int input)1346 static int TestMutexAttrInit(int input)
1347 {
1348     int err = DEFAULTVALUE;
1349     pthread_mutexattr_t mutexAttr;
1350     if (input == NORMAL) {
1351         err = pthread_mutexattr_init(&mutexAttr);
1352     }
1353     return err;
1354 }
PThreadMutexAttrInit(napi_env env, napi_callback_info info)1355 static napi_value PThreadMutexAttrInit(napi_env env, napi_callback_info info)
1356 {
1357     int input = intInput(env, info);
1358     int result = TestMutexAttrInit(input);
1359     return intOutput(env, result);
1360 }
testMutexAttrSetProtocol(int input)1361 static int testMutexAttrSetProtocol(int input)
1362 {
1363     int err = DEFAULTVALUE;
1364     int protocol = PARAM_0;
1365     pthread_mutexattr_t mutexAttr;
1366     if (input == NORMAL) {
1367         err = pthread_mutexattr_init(&mutexAttr);
1368         if (err != NORMAL) {
1369             return LOCK_FAIL;
1370         }
1371     }
1372     err = pthread_mutexattr_setprotocol(&mutexAttr, protocol);
1373     return err;
1374 }
PThreadMutexAttrSetProtocol(napi_env env, napi_callback_info info)1375 static napi_value PThreadMutexAttrSetProtocol(napi_env env, napi_callback_info info)
1376 {
1377     int input = intInput(env, info);
1378     int result = testMutexAttrSetProtocol(input);
1379     return intOutput(env, result);
1380 }
testMutexAttrSetPshared(int input)1381 static int testMutexAttrSetPshared(int input)
1382 {
1383     int err = DEFAULTVALUE;
1384     int share = PARAM_0;
1385     pthread_mutexattr_t mutexAttr;
1386     if (input == NORMAL) {
1387         err = pthread_mutexattr_init(&mutexAttr);
1388         if (err != NORMAL) {
1389             return LOCK_FAIL;
1390         }
1391     }
1392     err = pthread_mutexattr_setpshared(&mutexAttr, share);
1393     return err;
1394 }
PThreadMutexAttrSetPShared(napi_env env, napi_callback_info info)1395 static napi_value PThreadMutexAttrSetPShared(napi_env env, napi_callback_info info)
1396 {
1397     int input = intInput(env, info);
1398     int result = testMutexAttrSetPshared(input);
1399     return intOutput(env, result);
1400 }
testMutexAttrSetType(int input)1401 static int testMutexAttrSetType(int input)
1402 {
1403     int err = DEFAULTVALUE;
1404     int type = PARAM_0;
1405     pthread_mutexattr_t mutexAttr;
1406     if (input == NORMAL) {
1407         err = pthread_mutexattr_init(&mutexAttr);
1408         if (err != NORMAL) {
1409             return LOCK_FAIL;
1410         }
1411     }
1412     err = pthread_mutexattr_settype(&mutexAttr, type);
1413     return err;
1414 }
PThreadMutexAttrSetType(napi_env env, napi_callback_info info)1415 static napi_value PThreadMutexAttrSetType(napi_env env, napi_callback_info info)
1416 {
1417     int input = intInput(env, info);
1418     int result = testMutexAttrSetType(input);
1419     return intOutput(env, result);
1420 }
1421 pthread_once_t g_once = PTHREAD_ONCE_INIT;
once_run(void)1422 void once_run(void)
1423 {
1424     int i = PARAM_0;
1425     i = i + 1;
1426 }
1427 int g_pThreadOnceRet = PARAM_0;
threadfunc5(void *)1428 void *threadfunc5(void *)
1429 {
1430     g_pThreadOnceRet = pthread_once(&g_once, once_run);
1431     pthread_exit(&g_pThreadOnceRet);
1432 }
testOnce(int input)1433 static int testOnce(int input)
1434 {
1435     int err = DEFAULTVALUE;
1436     pthread_t pidFirst = PARAM_0;
1437     void *pThreadResult = nullptr;
1438     if (input == NORMAL) {
1439         err = pthread_create(&pidFirst, nullptr, threadfunc5, nullptr);
1440         if (err != NORMAL) {
1441             return CREATE_ERROR;
1442         }
1443         pthread_join(pidFirst, &pThreadResult);
1444     }
1445     return *static_cast<int *>(pThreadResult);
1446 }
PThreadOnce(napi_env env, napi_callback_info info)1447 static napi_value PThreadOnce(napi_env env, napi_callback_info info)
1448 {
1449     int input = intInput(env, info);
1450     int result = testOnce(input);
1451     return intOutput(env, result);
1452 }
testRwLockInit(int input)1453 static int testRwLockInit(int input)
1454 {
1455     int err = DEFAULTVALUE;
1456     pthread_rwlock_t rwLock;
1457     pthread_rwlockattr_t rwLockAttr;
1458     if (input == NORMAL) {
1459         err = pthread_rwlock_init(&rwLock, &rwLockAttr);
1460     }
1461     return err;
1462 }
PThreadRwLockInit(napi_env env, napi_callback_info info)1463 static napi_value PThreadRwLockInit(napi_env env, napi_callback_info info)
1464 {
1465     int input = intInput(env, info);
1466     int result = testRwLockInit(input);
1467     return intOutput(env, result);
1468 }
testRwLockDestroy(int input)1469 static int testRwLockDestroy(int input)
1470 {
1471     int err = DEFAULTVALUE;
1472     pthread_rwlock_t rwLock;
1473     pthread_rwlockattr_t rwLockAttr;
1474     if (input == NORMAL) {
1475         err = pthread_rwlock_init(&rwLock, &rwLockAttr);
1476         if (err != NORMAL) {
1477             return RWLOCK_INIT_ERROR;
1478         }
1479         err = pthread_rwlock_destroy(&rwLock);
1480     }
1481     return err;
1482 }
PThreadRwLockDestroy(napi_env env, napi_callback_info info)1483 static napi_value PThreadRwLockDestroy(napi_env env, napi_callback_info info)
1484 {
1485     int input = intInput(env, info);
1486     int result = testRwLockDestroy(input);
1487     return intOutput(env, result);
1488 }
testRwLockRdLock(int input)1489 static int testRwLockRdLock(int input)
1490 {
1491     int err = DEFAULTVALUE;
1492     pthread_rwlock_t rwLock;
1493     pthread_rwlockattr_t rwLockAttr;
1494     if (input == NORMAL) {
1495         err = pthread_rwlock_init(&rwLock, &rwLockAttr);
1496         if (err != NORMAL) {
1497             return RWLOCK_INIT_ERROR;
1498         }
1499         err = pthread_rwlock_rdlock(&rwLock);
1500     }
1501     return err;
1502 }
PThreadRwLockRdLock(napi_env env, napi_callback_info info)1503 static napi_value PThreadRwLockRdLock(napi_env env, napi_callback_info info)
1504 {
1505     int input = intInput(env, info);
1506     int result = testRwLockRdLock(input);
1507     return intOutput(env, result);
1508 }
testRwLockTimedRdLock(int input)1509 static int testRwLockTimedRdLock(int input)
1510 {
1511     int err = DEFAULTVALUE;
1512     pthread_rwlock_t rwLock;
1513     pthread_rwlockattr_t rwLockAttr;
1514     struct timeval now;
1515     struct timespec outTime;
1516     gettimeofday(&now, nullptr);
1517     outTime.tv_sec = now.tv_sec + SLEEPTIME;
1518     outTime.tv_nsec = now.tv_usec * thousand;
1519     if (input == NORMAL) {
1520         err = pthread_rwlock_init(&rwLock, &rwLockAttr);
1521         if (err != NORMAL) {
1522             return RWLOCK_INIT_ERROR;
1523         }
1524         err = pthread_rwlock_timedrdlock(&rwLock, &outTime);
1525     }
1526     return err;
1527 }
PThreadRwLockTimedRdLock(napi_env env, napi_callback_info info)1528 static napi_value PThreadRwLockTimedRdLock(napi_env env, napi_callback_info info)
1529 {
1530     int input = intInput(env, info);
1531     int result = testRwLockTimedRdLock(input);
1532     return intOutput(env, result);
1533 }
testRwLockTimedWrLock(int input)1534 static int testRwLockTimedWrLock(int input)
1535 {
1536     int err = DEFAULTVALUE;
1537     pthread_rwlock_t rwLock;
1538     pthread_rwlockattr_t rwLockAttr;
1539     struct timeval now;
1540     struct timespec outTime;
1541     gettimeofday(&now, nullptr);
1542     outTime.tv_sec = now.tv_sec + SLEEPTIME;
1543     outTime.tv_nsec = now.tv_usec * thousand;
1544     if (input == NORMAL) {
1545         err = pthread_rwlock_init(&rwLock, &rwLockAttr);
1546         if (err != NORMAL) {
1547             return RWLOCK_INIT_ERROR;
1548         }
1549         err = pthread_rwlock_timedwrlock(&rwLock, &outTime);
1550     }
1551     return err;
1552 }
PThreadRwLockTimedWrLock(napi_env env, napi_callback_info info)1553 static napi_value PThreadRwLockTimedWrLock(napi_env env, napi_callback_info info)
1554 {
1555     int input = intInput(env, info);
1556     int result = testRwLockTimedWrLock(input);
1557     return intOutput(env, result);
1558 }
testRwLockTryRdLock(int input)1559 static int testRwLockTryRdLock(int input)
1560 {
1561     int err = DEFAULTVALUE;
1562     pthread_rwlock_t rwLock;
1563     pthread_rwlockattr_t rwLockAttr;
1564     if (input == NORMAL) {
1565         err = pthread_rwlock_init(&rwLock, &rwLockAttr);
1566         if (err != NORMAL) {
1567             return RWLOCK_INIT_ERROR;
1568         }
1569         err = pthread_rwlock_tryrdlock(&rwLock);
1570     }
1571     return err;
1572 }
PThreadRwLockTryRdLock(napi_env env, napi_callback_info info)1573 static napi_value PThreadRwLockTryRdLock(napi_env env, napi_callback_info info)
1574 {
1575     int input = intInput(env, info);
1576     int result = testRwLockTryRdLock(input);
1577     return intOutput(env, result);
1578 }
testRwLockTryWrLock(int input)1579 static int testRwLockTryWrLock(int input)
1580 {
1581     int err = DEFAULTVALUE;
1582     pthread_rwlock_t rwLock;
1583     pthread_rwlockattr_t rwLockAttr;
1584     if (input == NORMAL) {
1585         err = pthread_rwlock_init(&rwLock, &rwLockAttr);
1586         if (err != NORMAL) {
1587             return RWLOCK_INIT_ERROR;
1588         }
1589         err = pthread_rwlock_trywrlock(&rwLock);
1590     }
1591     return err;
1592 }
PThreadRwLockTryWrLock(napi_env env, napi_callback_info info)1593 static napi_value PThreadRwLockTryWrLock(napi_env env, napi_callback_info info)
1594 {
1595     int input = intInput(env, info);
1596     int result = testRwLockTryWrLock(input);
1597     return intOutput(env, result);
1598 }
TestRwLockUnLock(int input)1599 static int TestRwLockUnLock(int input)
1600 {
1601     int err = DEFAULTVALUE;
1602     pthread_rwlock_t rwLock;
1603     pthread_rwlockattr_t rwLockAttr;
1604     if (input == NORMAL) {
1605         err = pthread_rwlock_init(&rwLock, &rwLockAttr);
1606         if (err != NORMAL) {
1607             return RWLOCK_INIT_ERROR;
1608         }
1609         err = pthread_rwlock_rdlock(&rwLock);
1610         if (err != NORMAL) {
1611             return RWLOCK_RDLOCK_ERROR;
1612         }
1613         err = pthread_rwlock_unlock(&rwLock);
1614     }
1615     return err;
1616 }
PThreadRwLockUnLock(napi_env env, napi_callback_info info)1617 static napi_value PThreadRwLockUnLock(napi_env env, napi_callback_info info)
1618 {
1619     int input = intInput(env, info);
1620     int result = TestRwLockUnLock(input);
1621     return intOutput(env, result);
1622 }
testRwLockWrLock(int input)1623 static int testRwLockWrLock(int input)
1624 {
1625     int err = DEFAULTVALUE;
1626     pthread_rwlock_t rwLock;
1627     pthread_rwlockattr_t rwLockAttr;
1628     if (input == NORMAL) {
1629         err = pthread_rwlock_init(&rwLock, &rwLockAttr);
1630         if (err != NORMAL) {
1631             return RWLOCK_INIT_ERROR;
1632         }
1633         err = pthread_rwlock_wrlock(&rwLock);
1634     }
1635     return err;
1636 }
PThreadRwLockWrLock(napi_env env, napi_callback_info info)1637 static napi_value PThreadRwLockWrLock(napi_env env, napi_callback_info info)
1638 {
1639     int input = intInput(env, info);
1640     int result = testRwLockWrLock(input);
1641     return intOutput(env, result);
1642 }
TestRwLockAttrDestroy(int input)1643 static int TestRwLockAttrDestroy(int input)
1644 {
1645     int err = DEFAULTVALUE;
1646     pthread_rwlockattr_t rwLockAttr;
1647     if (input == NORMAL) {
1648         err = pthread_rwlockattr_init(&rwLockAttr);
1649         if (err != NORMAL) {
1650             return RWLOCKATTR_INIT_ERROR;
1651         }
1652         err = pthread_rwlockattr_destroy(&rwLockAttr);
1653     }
1654     return err;
1655 }
PThreadRwLockAttrDestroy(napi_env env, napi_callback_info info)1656 static napi_value PThreadRwLockAttrDestroy(napi_env env, napi_callback_info info)
1657 {
1658     int input = intInput(env, info);
1659     int result = TestRwLockAttrDestroy(input);
1660     return intOutput(env, result);
1661 }
testRwLockAttrGetPShared(int input)1662 static int testRwLockAttrGetPShared(int input)
1663 {
1664     int err = DEFAULTVALUE;
1665     pthread_rwlockattr_t rwLockAttr;
1666     int shared;
1667     if (input == NORMAL) {
1668         err = pthread_rwlockattr_init(&rwLockAttr);
1669         if (err != NORMAL) {
1670             return RWLOCKATTR_INIT_ERROR;
1671         }
1672         err = pthread_rwlockattr_getpshared(&rwLockAttr, &shared);
1673     }
1674     return err;
1675 }
PThreadRwLockAttrGetPShared(napi_env env, napi_callback_info info)1676 static napi_value PThreadRwLockAttrGetPShared(napi_env env, napi_callback_info info)
1677 {
1678     int input = intInput(env, info);
1679     int result = testRwLockAttrGetPShared(input);
1680     return intOutput(env, result);
1681 }
testRwLockAttrInit(int input)1682 static int testRwLockAttrInit(int input)
1683 {
1684     int err = DEFAULTVALUE;
1685     pthread_rwlockattr_t rwLockAttr;
1686     if (input == NORMAL) {
1687         err = pthread_rwlockattr_init(&rwLockAttr);
1688     }
1689     return err;
1690 }
PThreadRwLockAttrInit(napi_env env, napi_callback_info info)1691 static napi_value PThreadRwLockAttrInit(napi_env env, napi_callback_info info)
1692 {
1693     int input = intInput(env, info);
1694     int result = testRwLockAttrInit(input);
1695     return intOutput(env, result);
1696 }
TestRwLockAttrSetPShared(int input)1697 static int TestRwLockAttrSetPShared(int input)
1698 {
1699     int err = DEFAULTVALUE;
1700     pthread_rwlockattr_t rwLockAttr;
1701     int shared = PARAM_0;
1702     if (input == NORMAL) {
1703         err = pthread_rwlockattr_init(&rwLockAttr);
1704         if (err != NORMAL) {
1705             return RWLOCKATTR_INIT_ERROR;
1706         }
1707         err = pthread_rwlockattr_setpshared(&rwLockAttr, shared);
1708     }
1709     return err;
1710 }
PThreadRwLockAttrSetPShared(napi_env env, napi_callback_info info)1711 static napi_value PThreadRwLockAttrSetPShared(napi_env env, napi_callback_info info)
1712 {
1713     int input = intInput(env, info);
1714     int result = TestRwLockAttrSetPShared(input);
1715     return intOutput(env, result);
1716 }
TestSelf(int input)1717 static int TestSelf(int input)
1718 {
1719     int err = DEFAULTVALUE;
1720     if (input == NORMAL) {
1721         pthread_t pid = pthread_self();
1722         if (pid > NORMAL) {
1723             err = NORMAL;
1724         } else {
1725             err = ERROR;
1726         }
1727     }
1728     return err;
1729 }
PThreadSelf(napi_env env, napi_callback_info info)1730 static napi_value PThreadSelf(napi_env env, napi_callback_info info)
1731 {
1732     int input = intInput(env, info);
1733     int result = TestSelf(input);
1734     return intOutput(env, result);
1735 }
testSetNameNp(int input)1736 static int testSetNameNp(int input)
1737 {
1738     int err = DEFAULTVALUE;
1739     pthread_t pidFirst = PARAM_0;
1740     char setName[16] = "pSet";
1741     if (input == NORMAL) {
1742         err = pthread_create(&pidFirst, nullptr, ThreadFunc3, nullptr);
1743         if (err != NORMAL) {
1744             return CREATE_ERROR;
1745         }
1746         err = pthread_setname_np(pidFirst, setName);
1747     }
1748     return err;
1749 }
PThreadSetNameNp(napi_env env, napi_callback_info info)1750 static napi_value PThreadSetNameNp(napi_env env, napi_callback_info info)
1751 {
1752     int input = intInput(env, info);
1753     int result = testSetNameNp(input);
1754     return intOutput(env, result);
1755 }
testSetSchedParam(int input)1756 static int testSetSchedParam(int input)
1757 {
1758     int err = DEFAULTVALUE;
1759     pthread_t pidFirst = PARAM_0;
1760     struct sched_param schedParam;
1761     schedParam.sched_priority = PARAM_0;
1762 
1763     if (input == NORMAL) {
1764         err = pthread_create(&pidFirst, nullptr, ThreadFunc3, nullptr);
1765         if (err != NORMAL) {
1766             return CREATE_ERROR;
1767         }
1768         err = pthread_setschedparam(pidFirst, SCHED_OTHER, &schedParam);
1769     }
1770     return err;
1771 }
PThreadSetSchedParam(napi_env env, napi_callback_info info)1772 static napi_value PThreadSetSchedParam(napi_env env, napi_callback_info info)
1773 {
1774     int input = intInput(env, info);
1775     int result = testSetSchedParam(input);
1776     return intOutput(env, result);
1777 }
testSetSchedPrio(int input)1778 static int testSetSchedPrio(int input)
1779 {
1780     int err = DEFAULTVALUE;
1781     pthread_t pidFirst = PARAM_0;
1782     int prio = PARAM_0;
1783     if (input == NORMAL) {
1784         err = pthread_create(&pidFirst, nullptr, ThreadFunc3, nullptr);
1785         if (err != NORMAL) {
1786             return CREATE_ERROR;
1787         }
1788         err = pthread_setschedprio(pidFirst, prio);
1789     }
1790     return err;
1791 }
PThreadSetSchedPrio(napi_env env, napi_callback_info info)1792 static napi_value PThreadSetSchedPrio(napi_env env, napi_callback_info info)
1793 {
1794     int input = intInput(env, info);
1795     int result = testSetSchedPrio(input);
1796     return intOutput(env, result);
1797 }
1798 static pthread_key_t testSetSpecificKey;
1799 int setSpecRet = DEFAULTVALUE;
threadfuncB(void *)1800 void *threadfuncB(void *)
1801 {
1802     int32_t value = PARAM_0;
1803     setSpecRet = pthread_setspecific(testSetSpecificKey, &value);
1804     pthread_exit(&setSpecRet);
1805 }
testSetSpecific(int input)1806 static int testSetSpecific(int input)
1807 {
1808     int err = DEFAULTVALUE;
1809     pthread_t pidFirst = PARAM_0;
1810     void *pThreadResult = nullptr;
1811     if (input == NORMAL) {
1812         err = pthread_key_create(&testSetSpecificKey, nullptr);
1813         if (err != NORMAL) {
1814             return KEY_CREATE_ERROR;
1815         }
1816         err = pthread_create(&pidFirst, nullptr, threadfuncB, nullptr);
1817         if (err != NORMAL) {
1818             return CREATE_ERROR;
1819         }
1820         pthread_join(pidFirst, &pThreadResult);
1821         pthread_key_delete(testSetSpecificKey);
1822     }
1823     return *static_cast<int *>(pThreadResult);
1824 }
PThreadSetSpecific(napi_env env, napi_callback_info info)1825 static napi_value PThreadSetSpecific(napi_env env, napi_callback_info info)
1826 {
1827     int input = intInput(env, info);
1828     int result = testSetSpecific(input);
1829     return intOutput(env, result);
1830 }
PthreadSigmask(napi_env env, napi_callback_info info)1831 static napi_value PthreadSigmask(napi_env env, napi_callback_info info)
1832 {
1833     napi_value result = nullptr;
1834     sigset_t set;
1835     sigaddset(&set, SIGINT);
1836     int32_t returnValue = pthread_sigmask(SIG_BLOCK, &set, nullptr);
1837     napi_create_int32(env, returnValue, &result);
1838     return result;
1839 }
1840 
PthreadSpinInit(napi_env env, napi_callback_info info)1841 static napi_value PthreadSpinInit(napi_env env, napi_callback_info info)
1842 {
1843     napi_value result = nullptr;
1844     pthread_spinlock_t spin;
1845     int param = PTHREAD_PROCESS_PRIVATE;
1846     int returnValue = pthread_spin_init(&spin, param);
1847     pthread_spin_destroy(&spin);
1848     napi_create_int32(env, returnValue, &result);
1849     return result;
1850 }
1851 
PthreadSpinDestroy(napi_env env, napi_callback_info info)1852 static napi_value PthreadSpinDestroy(napi_env env, napi_callback_info info)
1853 {
1854     napi_value result = nullptr;
1855     pthread_spinlock_t spinlock;
1856     int param = PTHREAD_PROCESS_PRIVATE;
1857     pthread_spin_init(&spinlock, param);
1858     int returnValue = pthread_spin_destroy(&spinlock);
1859     napi_create_int32(env, returnValue, &result);
1860     return result;
1861 }
1862 
PthreadSpinLock(napi_env env, napi_callback_info info)1863 static napi_value PthreadSpinLock(napi_env env, napi_callback_info info)
1864 {
1865     napi_value result = nullptr;
1866     pthread_spinlock_t spinlock;
1867     int param = PTHREAD_PROCESS_PRIVATE;
1868     pthread_spin_init(&spinlock, param);
1869     int returnValue = pthread_spin_lock(&spinlock);
1870     pthread_spin_unlock(&spinlock);
1871 
1872     napi_create_int32(env, returnValue, &result);
1873     return result;
1874 }
1875 
PthreadSpinTrylock(napi_env env, napi_callback_info info)1876 static napi_value PthreadSpinTrylock(napi_env env, napi_callback_info info)
1877 {
1878     napi_value result = nullptr;
1879     pthread_spinlock_t spinlock;
1880     int param = PTHREAD_PROCESS_PRIVATE;
1881     pthread_spin_init(&spinlock, param);
1882     int returnValue = pthread_spin_trylock(&spinlock);
1883     napi_create_int32(env, returnValue, &result);
1884     return result;
1885 }
1886 
PthreadSpinUnlock(napi_env env, napi_callback_info info)1887 static napi_value PthreadSpinUnlock(napi_env env, napi_callback_info info)
1888 {
1889     napi_value result = nullptr;
1890     pthread_spinlock_t spinlock;
1891     int param = PTHREAD_PROCESS_PRIVATE;
1892     pthread_spin_init(&spinlock, param);
1893     pthread_spin_lock(&spinlock);
1894     int returnValue = pthread_spin_unlock(&spinlock);
1895     napi_create_int32(env, returnValue, &result);
1896     return result;
1897 }
1898 EXTERN_C_START
Init(napi_env env, napi_value exports)1899 static napi_value Init(napi_env env, napi_value exports)
1900 {
1901     napi_property_descriptor desc[] = {
1902         {"pThreadAtFork", nullptr, PThreadAtFork, nullptr, nullptr, nullptr, napi_default, nullptr},
1903         {"pThreadAttrDestory", nullptr, PThreadAttrDestory, nullptr, nullptr, nullptr, napi_default, nullptr},
1904         {"pThreadAttrGetDetachState", nullptr, PThreadAttrGetDetachState, nullptr, nullptr, nullptr, napi_default,
1905          nullptr},
1906         {"pThreadAttrGetGuardSize", nullptr, PThreadAttrGetGuardSize, nullptr, nullptr, nullptr, napi_default, nullptr},
1907         {"pThreadAttrGetInheritSched", nullptr, PThreadAttrGetInheritSched, nullptr, nullptr, nullptr, napi_default,
1908          nullptr},
1909         {"pThreadAttrGetSchedParam", nullptr, PThreadAttrGetSchedParam, nullptr, nullptr, nullptr, napi_default,
1910          nullptr},
1911         {"pThreadAttrGetSchedPolicy", nullptr, PThreadAttrGetSchedPolicy, nullptr, nullptr, nullptr, napi_default,
1912          nullptr},
1913         {"pThreadAttrGetScope", nullptr, PThreadAttrGetScope, nullptr, nullptr, nullptr, napi_default, nullptr},
1914         {"pThreadAttrGetStack", nullptr, PThreadAttrGetStack, nullptr, nullptr, nullptr, napi_default, nullptr},
1915         {"pThreadAttrGetStackSize", nullptr, PThreadAttrGetStackSize, nullptr, nullptr, nullptr, napi_default, nullptr},
1916         {"pThreadAttrInit", nullptr, PThreadAttrInit, nullptr, nullptr, nullptr, napi_default, nullptr},
1917         {"pThreadAttrSetDetachState", nullptr, PThreadAttrSetDetachState, nullptr, nullptr, nullptr, napi_default,
1918          nullptr},
1919         {"pThreadAttrSetGuardSize", nullptr, PThreadAttrSetGuardSize, nullptr, nullptr, nullptr, napi_default, nullptr},
1920         {"pThreadAttrSetInheritSched", nullptr, PThreadAttrSetInheritSched, nullptr, nullptr, nullptr, napi_default,
1921          nullptr},
1922         {"pThreadAttrSetSchedParam", nullptr, PThreadAttrSetSchedParam, nullptr, nullptr, nullptr, napi_default,
1923          nullptr},
1924         {"pThreadAttrSetSchedPolicy", nullptr, PThreadAttrSetSchedPolicy, nullptr, nullptr, nullptr, napi_default,
1925          nullptr},
1926         {"pThreadAttrSetScope", nullptr, PThreadAttrSetScope, nullptr, nullptr, nullptr, napi_default, nullptr},
1927         {"pThreadAttrSetStack", nullptr, PThreadAttrSetStack, nullptr, nullptr, nullptr, napi_default, nullptr},
1928         {"pThreadAttrSetStackSize", nullptr, PThreadAttrSetStackSize, nullptr, nullptr, nullptr, napi_default, nullptr},
1929         {"pThreadBarrierInit", nullptr, PThreadBarrierInit, nullptr, nullptr, nullptr, napi_default, nullptr},
1930         {"pThreadBarrierDestroy", nullptr, PThreadBarrierDestroy, nullptr, nullptr, nullptr, napi_default, nullptr},
1931         {"pThreadBarrierWait", nullptr, PThreadBarrierWait, nullptr, nullptr, nullptr, napi_default, nullptr},
1932         {"pThreadBarrierAttrInit", nullptr, PThreadBarrierAttrInit, nullptr, nullptr, nullptr, napi_default, nullptr},
1933         {"pThreadBarrierAttrGetPShared", nullptr, PThreadBarrierAttrGetPShared, nullptr, nullptr, nullptr, napi_default,
1934          nullptr},
1935         {"pThreadBarrierAttrDestroy", nullptr, PThreadBarrierAttrDestroy, nullptr, nullptr, nullptr, napi_default,
1936          nullptr},
1937         {"pThreadBarrierAttrSetPShared", nullptr, PThreadBarrierAttrSetPShared, nullptr, nullptr, nullptr, napi_default,
1938          nullptr},
1939         {"pThreadCondInit", nullptr, PThreadCondInit, nullptr, nullptr, nullptr, napi_default, nullptr},
1940         {"pThreadCondDestroy", nullptr, PThreadCondDestroy, nullptr, nullptr, nullptr, napi_default, nullptr},
1941         {"pThreadCondBroadcast", nullptr, PThreadCondBroadcast, nullptr, nullptr, nullptr, napi_default, nullptr},
1942         {"pThreadCondSignal", nullptr, PThreadCondSignal, nullptr, nullptr, nullptr, napi_default, nullptr},
1943         {"pThreadCondWait", nullptr, PThreadCondWait, nullptr, nullptr, nullptr, napi_default, nullptr},
1944         {"pThreadCondTimedWait", nullptr, PThreadCondTimedWait, nullptr, nullptr, nullptr, napi_default, nullptr},
1945         {"pThreadCondAttrInit", nullptr, PThreadCondAttrInit, nullptr, nullptr, nullptr, napi_default, nullptr},
1946         {"pThreadCondAttrDestroy", nullptr, PThreadCondAttrDestroy, nullptr, nullptr, nullptr, napi_default, nullptr},
1947         {"pThreadCondAttrGetClock", nullptr, PThreadCondAttrGetClock, nullptr, nullptr, nullptr, napi_default, nullptr},
1948         {"pThreadCondAttrGetPShared", nullptr, PThreadCondAttrGetPShared, nullptr, nullptr, nullptr, napi_default,
1949          nullptr},
1950         {"pThreadCondAttrSetClock", nullptr, PThreadCondAttrSetClock, nullptr, nullptr, nullptr, napi_default, nullptr},
1951         {"pThreadCondAttrSetPShared", nullptr, PThreadCondAttrSetPShared, nullptr, nullptr, nullptr, napi_default,
1952          nullptr},
1953         {"pThreadCreate", nullptr, PThreadCreate, nullptr, nullptr, nullptr, napi_default, nullptr},
1954         {"pThreadDetach", nullptr, PThreadDetach, nullptr, nullptr, nullptr, napi_default, nullptr},
1955         {"pThreadEqual", nullptr, PThreadEqual, nullptr, nullptr, nullptr, napi_default, nullptr},
1956         {"pThreadEqual2", nullptr, PThreadEqual2, nullptr, nullptr, nullptr, napi_default, nullptr},
1957         {"pThreadExit", nullptr, PThreadExit, nullptr, nullptr, nullptr, napi_default, nullptr},
1958         {"pThreadGetAttrNp", nullptr, PThreadGetAttrNp, nullptr, nullptr, nullptr, napi_default, nullptr},
1959         {"pThreadGetCpuClockId", nullptr, PThreadGetCpuClockId, nullptr, nullptr, nullptr, napi_default, nullptr},
1960         {"pThreadGetSchedParam", nullptr, PThreadGetSchedParam, nullptr, nullptr, nullptr, napi_default, nullptr},
1961         {"pThreadGetSpecific", nullptr, PThreadGetSpecific, nullptr, nullptr, nullptr, napi_default, nullptr},
1962         {"pThreadJoin", nullptr, PThreadJoin, nullptr, nullptr, nullptr, napi_default, nullptr},
1963         {"pThreadKeyCreate", nullptr, PThreadKeyCreate, nullptr, nullptr, nullptr, napi_default, nullptr},
1964         {"pThreadKeyDelete", nullptr, PThreadKeyDelete, nullptr, nullptr, nullptr, napi_default, nullptr},
1965         {"pThreadKill", nullptr, PThreadKill, nullptr, nullptr, nullptr, napi_default, nullptr},
1966         {"pThreadMutexInit", nullptr, PThreadMutexInit, nullptr, nullptr, nullptr, napi_default, nullptr},
1967         {"pThreadMutexDestroy", nullptr, PThreadMutexDestroy, nullptr, nullptr, nullptr, napi_default, nullptr},
1968         {"pThreadMutexLock", nullptr, PThreadMutexLock, nullptr, nullptr, nullptr, napi_default, nullptr},
1969         {"pThreadMutexTimedLock", nullptr, PThreadMutexTimedLock, nullptr, nullptr, nullptr, napi_default, nullptr},
1970         {"pThreadMutexTryLock", nullptr, PThreadMutexTryLock, nullptr, nullptr, nullptr, napi_default, nullptr},
1971         {"pThreadMutexUnLock", nullptr, PThreadMutexUnLock, nullptr, nullptr, nullptr, napi_default, nullptr},
1972         {"pThreadMutexAttrDestroy", nullptr, PThreadMutexAttrDestroy, nullptr, nullptr, nullptr, napi_default, nullptr},
1973         {"pThreadMutexAttrGetProtocol", nullptr, PThreadMutexAttrGetProtocol, nullptr, nullptr, nullptr, napi_default,
1974          nullptr},
1975         {"pThreadMutexAttrGetPShared", nullptr, PThreadMutexAttrGetPShared, nullptr, nullptr, nullptr, napi_default,
1976          nullptr},
1977         {"pThreadMutexAttrGetType", nullptr, PThreadMutexAttrGetType, nullptr, nullptr, nullptr, napi_default, nullptr},
1978         {"pThreadMutexAttrInit", nullptr, PThreadMutexAttrInit, nullptr, nullptr, nullptr, napi_default, nullptr},
1979         {"pThreadMutexAttrSetProtocol", nullptr, PThreadMutexAttrSetProtocol, nullptr, nullptr, nullptr, napi_default,
1980          nullptr},
1981         {"pThreadMutexAttrSetPShared", nullptr, PThreadMutexAttrSetPShared, nullptr, nullptr, nullptr, napi_default,
1982          nullptr},
1983         {"pThreadMutexAttrSetType", nullptr, PThreadMutexAttrSetType, nullptr, nullptr, nullptr, napi_default, nullptr},
1984         {"pThreadOnce", nullptr, PThreadOnce, nullptr, nullptr, nullptr, napi_default, nullptr},
1985         {"pThreadRwLockInit", nullptr, PThreadRwLockInit, nullptr, nullptr, nullptr, napi_default, nullptr},
1986         {"pThreadRwLockDestroy", nullptr, PThreadRwLockDestroy, nullptr, nullptr, nullptr, napi_default, nullptr},
1987         {"pThreadRwLockRdLock", nullptr, PThreadRwLockRdLock, nullptr, nullptr, nullptr, napi_default, nullptr},
1988         {"pThreadRwLockTimedRdLock", nullptr, PThreadRwLockTimedRdLock, nullptr, nullptr, nullptr, napi_default,
1989          nullptr},
1990         {"pThreadRwLockTimedWrLock", nullptr, PThreadRwLockTimedWrLock, nullptr, nullptr, nullptr, napi_default,
1991          nullptr},
1992         {"pThreadRwLockTryRdLock", nullptr, PThreadRwLockTryRdLock, nullptr, nullptr, nullptr, napi_default, nullptr},
1993         {"pThreadRwLockTryWrLock", nullptr, PThreadRwLockTryWrLock, nullptr, nullptr, nullptr, napi_default, nullptr},
1994         {"pThreadRwLockUnLock", nullptr, PThreadRwLockUnLock, nullptr, nullptr, nullptr, napi_default, nullptr},
1995         {"pThreadRwLockWrLock", nullptr, PThreadRwLockWrLock, nullptr, nullptr, nullptr, napi_default, nullptr},
1996         {"pThreadRwLockAttrDestroy", nullptr, PThreadRwLockAttrDestroy, nullptr, nullptr, nullptr, napi_default,
1997          nullptr},
1998         {"pThreadRwLockAttrGetPShared", nullptr, PThreadRwLockAttrGetPShared, nullptr, nullptr, nullptr, napi_default,
1999          nullptr},
2000         {"pThreadRwLockAttrInit", nullptr, PThreadRwLockAttrInit, nullptr, nullptr, nullptr, napi_default, nullptr},
2001         {"pThreadRwLockAttrSetPShared", nullptr, PThreadRwLockAttrSetPShared, nullptr, nullptr, nullptr, napi_default,
2002          nullptr},
2003         {"pThreadSelf", nullptr, PThreadSelf, nullptr, nullptr, nullptr, napi_default, nullptr},
2004         {"pThreadSetNameNp", nullptr, PThreadSetNameNp, nullptr, nullptr, nullptr, napi_default, nullptr},
2005         {"pThreadSetSchedParam", nullptr, PThreadSetSchedParam, nullptr, nullptr, nullptr, napi_default, nullptr},
2006         {"pThreadSetSchedPrio", nullptr, PThreadSetSchedPrio, nullptr, nullptr, nullptr, napi_default, nullptr},
2007         {"pThreadSetSpecific", nullptr, PThreadSetSpecific, nullptr, nullptr, nullptr, napi_default, nullptr},
2008         {"pThreadSpinInit", nullptr, PthreadSpinInit, nullptr, nullptr, nullptr, napi_default, nullptr},
2009         {"pThreadSigmask", nullptr, PthreadSigmask, nullptr, nullptr, nullptr, napi_default, nullptr},
2010         {"pThreadSpinDestroy", nullptr, PthreadSpinDestroy, nullptr, nullptr, nullptr, napi_default, nullptr},
2011         {"pThreadSpinLock", nullptr, PthreadSpinLock, nullptr, nullptr, nullptr, napi_default, nullptr},
2012         {"pThreadSpinTrylock", nullptr, PthreadSpinTrylock, nullptr, nullptr, nullptr, napi_default, nullptr},
2013         {"pThreadSpinUnlock", nullptr, PthreadSpinUnlock, nullptr, nullptr, nullptr, napi_default, nullptr},
2014 
2015     };
2016     napi_define_properties(env, exports, sizeof(desc) / sizeof(desc[0]), desc);
2017     return exports;
2018 }
2019 EXTERN_C_END
2020 
2021 static napi_module demoModule = {
2022     .nm_version = 1,
2023     .nm_flags = 0,
2024     .nm_filename = nullptr,
2025     .nm_register_func = Init,
2026     .nm_modname = "pthread1",
2027     .nm_priv = ((void *)0),
2028     .reserved = {0},
2029 };
2030 
RegisterEntryModule(void)2031 extern "C" __attribute__((constructor)) void RegisterEntryModule(void) { napi_module_register(&demoModule); }
2032