• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
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 <cerrno>
18 #include <climits>
19 #include <csignal>
20 #include <cstdlib>
21 #include <cstring>
22 #include <pthread.h>
23 #include <semaphore.h>
24 #include <unistd.h>
25 #include <atomic>
26 
27 #define PARAM_0 0
28 #define PARAM_1 1
29 #define PARAM_2 2
30 #define PARAM_3 3
31 #define PARAM_128 128
32 #define MPARAM_1 (-1)
33 #define PARAM_4 4
34 #define PARAM_5 5
35 #define PARAM_0x4001 0x4001
36 #define PARAM_4069 4069
37 #define SLEEP_10_MS 10
38 
39 struct pthreadAtForkParam {
40     pthread_mutex_t mutex;
41     int prepare;
42     int parent;
43     int child;
44 };
45 static pthreadAtForkParam gPthreadAtForkParam;
PthreadAtForkPrepare()46 static void PthreadAtForkPrepare()
47 {
48     pthread_mutex_lock(&gPthreadAtForkParam.mutex);
49     gPthreadAtForkParam.prepare++;
50 }
PthreadAtForkParent()51 static void PthreadAtForkParent()
52 {
53     pthread_mutex_unlock(&gPthreadAtForkParam.mutex);
54     gPthreadAtForkParam.parent++;
55 }
PthreadAtForkChild()56 static void PthreadAtForkChild()
57 {
58     pthread_mutex_unlock(&gPthreadAtForkParam.mutex);
59     gPthreadAtForkParam.child++;
60 }
PthreadAtForkThread(void * arg)61 static void *PthreadAtForkThread(void *arg)
62 {
63     pthread_mutex_lock(&gPthreadAtForkParam.mutex);
64     sleep(PARAM_3);
65     pthread_mutex_unlock(&gPthreadAtForkParam.mutex);
66     return nullptr;
67 }
PThreadAtFork(napi_env env,napi_callback_info info)68 static napi_value PThreadAtFork(napi_env env, napi_callback_info info)
69 {
70     pthread_t threadId;
71     gPthreadAtForkParam.mutex = PTHREAD_MUTEX_INITIALIZER;
72     gPthreadAtForkParam.prepare = PARAM_0;
73     gPthreadAtForkParam.parent = PARAM_0;
74     gPthreadAtForkParam.child = PARAM_0;
75     pthread_create(&threadId, nullptr, PthreadAtForkThread, nullptr);
76     int ret = pthread_atfork(PthreadAtForkPrepare, PthreadAtForkParent, PthreadAtForkChild);
77     sleep(PARAM_1);
78     pid_t processId = fork();
79     if (processId == PARAM_0) {
80         pthread_mutex_lock(&gPthreadAtForkParam.mutex);
81         sleep(PARAM_1);
82         pthread_mutex_unlock(&gPthreadAtForkParam.mutex);
83         _exit(PARAM_0);
84     } else if (processId > PARAM_0) {
85         pthread_join(threadId, nullptr);
86     }
87     napi_value result = nullptr;
88     napi_create_int32(env, ret, &result);
89     return result;
90 }
91 
PThreadAttrDestroy(napi_env env,napi_callback_info info)92 static napi_value PThreadAttrDestroy(napi_env env, napi_callback_info info)
93 {
94     pthread_attr_t attr;
95     int ret = pthread_attr_destroy(&attr);
96     napi_value result = nullptr;
97     napi_create_int32(env, ret, &result);
98     return result;
99 }
100 
PThreadAttrGetDetachState(napi_env env,napi_callback_info info)101 static napi_value PThreadAttrGetDetachState(napi_env env, napi_callback_info info)
102 {
103     pthread_attr_t attr;
104     int state;
105     pthread_attr_init(&attr);
106     pthread_attr_setdetachstate(&attr, PTHREAD_CREATE_DETACHED);
107     int ret = pthread_attr_getdetachstate(&attr, &state);
108     pthread_attr_destroy(&attr);
109     ret |= state != PTHREAD_CREATE_DETACHED;
110     napi_value result = nullptr;
111     napi_create_int32(env, ret, &result);
112     return result;
113 }
114 
PThreadAttrGetGuardSize(napi_env env,napi_callback_info info)115 static napi_value PThreadAttrGetGuardSize(napi_env env, napi_callback_info info)
116 {
117     const size_t testSize = PARAM_128;
118     pthread_attr_t attr;
119     size_t size;
120     pthread_attr_init(&attr);
121     pthread_attr_setguardsize(&attr, testSize);
122     int ret = pthread_attr_getguardsize(&attr, &size);
123     pthread_attr_destroy(&attr);
124     ret |= size != testSize;
125     napi_value result = nullptr;
126     napi_create_int32(env, ret, &result);
127     return result;
128 }
129 
PThreadAttrGetInheritSched(napi_env env,napi_callback_info info)130 static napi_value PThreadAttrGetInheritSched(napi_env env, napi_callback_info info)
131 {
132     pthread_attr_t attr;
133     int sched;
134     pthread_attr_init(&attr);
135     pthread_attr_setinheritsched(&attr, PTHREAD_EXPLICIT_SCHED);
136     int ret = pthread_attr_getinheritsched(&attr, &sched);
137     pthread_attr_destroy(&attr);
138     ret |= sched != PTHREAD_EXPLICIT_SCHED;
139     napi_value result = nullptr;
140     napi_create_int32(env, ret, &result);
141     return result;
142 }
143 
PThreadAttrGetSchedParam(napi_env env,napi_callback_info info)144 static napi_value PThreadAttrGetSchedParam(napi_env env, napi_callback_info info)
145 {
146     const int testSchedPriority = PARAM_1;
147     pthread_attr_t attr;
148     sched_param setparam;
149     sched_param getparam;
150     setparam.sched_priority = testSchedPriority;
151     pthread_attr_init(&attr);
152     pthread_attr_setschedparam(&attr, &setparam);
153     int ret = pthread_attr_getschedparam(&attr, &getparam);
154     pthread_attr_destroy(&attr);
155     ret |= getparam.sched_priority != testSchedPriority;
156     napi_value result = nullptr;
157     napi_create_int32(env, ret, &result);
158     return result;
159 }
160 
PThreadAttrGetSchedPolicy(napi_env env,napi_callback_info info)161 static napi_value PThreadAttrGetSchedPolicy(napi_env env, napi_callback_info info)
162 {
163     const int testSchedPolicy = PARAM_1;
164     pthread_attr_t attr;
165     int policy;
166     pthread_attr_init(&attr);
167     pthread_attr_setschedpolicy(&attr, testSchedPolicy);
168     int ret = pthread_attr_getschedpolicy(&attr, &policy);
169     pthread_attr_destroy(&attr);
170     ret |= policy != testSchedPolicy;
171     napi_value result = nullptr;
172     napi_create_int32(env, ret, &result);
173     return result;
174 }
175 
PThreadAttrGetScope(napi_env env,napi_callback_info info)176 static napi_value PThreadAttrGetScope(napi_env env, napi_callback_info info)
177 {
178     pthread_attr_t attr;
179     int scope;
180     pthread_attr_init(&attr);
181     pthread_attr_setscope(&attr, PTHREAD_SCOPE_SYSTEM);
182     int ret = pthread_attr_getscope(&attr, &scope);
183     pthread_attr_destroy(&attr);
184     ret |= scope != PTHREAD_SCOPE_SYSTEM;
185     napi_value result = nullptr;
186     napi_create_int32(env, ret, &result);
187     return result;
188 }
189 
PThreadAttrGetStack(napi_env env,napi_callback_info info)190 static napi_value PThreadAttrGetStack(napi_env env, napi_callback_info info)
191 {
192     const size_t testStackSize = PARAM_0x4001;
193     pthread_attr_t attr;
194     void *stackAddr = nullptr;
195     void *getStackAddr = nullptr;
196     size_t getStackSize = PARAM_0;
197     int pageSize = getpagesize();
198     pthread_attr_init(&attr);
199     posix_memalign(&stackAddr, pageSize, testStackSize);
200     pthread_attr_setstack(&attr, stackAddr, testStackSize);
201     int ret = pthread_attr_getstack(&attr, &getStackAddr, &getStackSize);
202     pthread_attr_destroy(&attr);
203     ret |= stackAddr != getStackAddr;
204     ret |= getStackSize != testStackSize;
205     if (stackAddr != nullptr) {
206         free(stackAddr);
207     }
208     napi_value result = nullptr;
209     napi_create_int32(env, ret, &result);
210     return result;
211 }
212 
PThreadAttrGetStackSize(napi_env env,napi_callback_info info)213 static napi_value PThreadAttrGetStackSize(napi_env env, napi_callback_info info)
214 {
215     const size_t testStackSize = PARAM_4069;
216     pthread_attr_t attr;
217     size_t stackSize = PARAM_0;
218     pthread_attr_init(&attr);
219     pthread_attr_setstacksize(&attr, testStackSize);
220     int ret = pthread_attr_getstacksize(&attr, &stackSize);
221     pthread_attr_destroy(&attr);
222     ret |= stackSize != testStackSize;
223     napi_value result = nullptr;
224     napi_create_int32(env, ret, &result);
225     return result;
226 }
227 
PThreadAttrInit(napi_env env,napi_callback_info info)228 static napi_value PThreadAttrInit(napi_env env, napi_callback_info info)
229 {
230     pthread_attr_t attr;
231     int ret = pthread_attr_init(&attr);
232     pthread_attr_destroy(&attr);
233     napi_value result = nullptr;
234     napi_create_int32(env, ret, &result);
235     return result;
236 }
237 
PThreadAttrSetDetachState_One(napi_env env,napi_callback_info info)238 static napi_value PThreadAttrSetDetachState_One(napi_env env, napi_callback_info info)
239 {
240     pthread_attr_t attr;
241     int state;
242     pthread_attr_init(&attr);
243     int ret = pthread_attr_setdetachstate(&attr, PTHREAD_CREATE_DETACHED);
244     pthread_attr_getdetachstate(&attr, &state);
245     pthread_attr_destroy(&attr);
246     ret |= state != PTHREAD_CREATE_DETACHED;
247     napi_value result = nullptr;
248     napi_create_int32(env, ret, &result);
249     return result;
250 }
251 
PThreadAttrSetDetachState_Two(napi_env env,napi_callback_info info)252 static napi_value PThreadAttrSetDetachState_Two(napi_env env, napi_callback_info info)
253 {
254     const int errorState = PARAM_2;
255     pthread_attr_t attr;
256     pthread_attr_init(&attr);
257     int ret = pthread_attr_setdetachstate(&attr, errorState);
258     pthread_attr_destroy(&attr);
259     napi_value result = nullptr;
260     napi_create_int32(env, ret, &result);
261     return result;
262 }
263 
PThreadAttrSetGuardSize_One(napi_env env,napi_callback_info info)264 static napi_value PThreadAttrSetGuardSize_One(napi_env env, napi_callback_info info)
265 {
266     const size_t testSize = PARAM_128;
267     pthread_attr_t attr;
268     size_t size;
269     pthread_attr_init(&attr);
270     int ret = pthread_attr_setguardsize(&attr, testSize);
271     pthread_attr_getguardsize(&attr, &size);
272     pthread_attr_destroy(&attr);
273     ret |= size != testSize;
274     napi_value result = nullptr;
275     napi_create_int32(env, ret, &result);
276     return result;
277 }
278 
PThreadAttrSetGuardSize_Two(napi_env env,napi_callback_info info)279 static napi_value PThreadAttrSetGuardSize_Two(napi_env env, napi_callback_info info)
280 {
281     pthread_attr_t attr;
282     pthread_attr_init(&attr);
283     int ret = pthread_attr_setguardsize(&attr, SIZE_MAX);
284     pthread_attr_destroy(&attr);
285     napi_value result = nullptr;
286     napi_create_int32(env, ret, &result);
287     return result;
288 }
289 
PThreadAttrSetInheritSched_One(napi_env env,napi_callback_info info)290 static napi_value PThreadAttrSetInheritSched_One(napi_env env, napi_callback_info info)
291 {
292     pthread_attr_t attr;
293     int sched;
294     pthread_attr_init(&attr);
295     int ret = pthread_attr_setinheritsched(&attr, PTHREAD_EXPLICIT_SCHED);
296     pthread_attr_getinheritsched(&attr, &sched);
297     pthread_attr_destroy(&attr);
298     ret |= sched != PTHREAD_EXPLICIT_SCHED;
299     napi_value result = nullptr;
300     napi_create_int32(env, ret, &result);
301     return result;
302 }
303 
PThreadAttrSetInheritSched_Two(napi_env env,napi_callback_info info)304 static napi_value PThreadAttrSetInheritSched_Two(napi_env env, napi_callback_info info)
305 {
306     const int testInheritSched = PARAM_2;
307     pthread_attr_t attr;
308     pthread_attr_init(&attr);
309     int ret = pthread_attr_setinheritsched(&attr, testInheritSched);
310     pthread_attr_destroy(&attr);
311     napi_value result = nullptr;
312     napi_create_int32(env, ret, &result);
313     return result;
314 }
315 
PThreadAttrSetSchedParam(napi_env env,napi_callback_info info)316 static napi_value PThreadAttrSetSchedParam(napi_env env, napi_callback_info info)
317 {
318     const int testSchedPriority = PARAM_1;
319     pthread_attr_t attr;
320     sched_param setparam;
321     sched_param getparam;
322     setparam.sched_priority = testSchedPriority;
323     pthread_attr_init(&attr);
324     int ret = pthread_attr_setschedparam(&attr, &setparam);
325     pthread_attr_getschedparam(&attr, &getparam);
326     pthread_attr_destroy(&attr);
327     ret |= getparam.sched_priority != testSchedPriority;
328     napi_value result = nullptr;
329     napi_create_int32(env, ret, &result);
330     return result;
331 }
332 
PThreadAttrSetSchedPolicy(napi_env env,napi_callback_info info)333 static napi_value PThreadAttrSetSchedPolicy(napi_env env, napi_callback_info info)
334 {
335     const int testSchedPolicy = PARAM_1;
336     pthread_attr_t attr;
337     int policy;
338     pthread_attr_init(&attr);
339     int ret = pthread_attr_setschedpolicy(&attr, testSchedPolicy);
340     pthread_attr_getschedpolicy(&attr, &policy);
341     pthread_attr_destroy(&attr);
342     ret |= policy != testSchedPolicy;
343     napi_value result = nullptr;
344     napi_create_int32(env, ret, &result);
345     return result;
346 }
347 
PThreadAttrSetScope_One(napi_env env,napi_callback_info info)348 static napi_value PThreadAttrSetScope_One(napi_env env, napi_callback_info info)
349 {
350     pthread_attr_t attr;
351     int scope;
352     pthread_attr_init(&attr);
353     int ret = pthread_attr_setscope(&attr, PTHREAD_SCOPE_SYSTEM);
354     pthread_attr_getscope(&attr, &scope);
355     pthread_attr_destroy(&attr);
356     ret |= scope != PTHREAD_SCOPE_SYSTEM;
357     napi_value result = nullptr;
358     napi_create_int32(env, ret, &result);
359     return result;
360 }
361 
PThreadAttrSetScope_Two(napi_env env,napi_callback_info info)362 static napi_value PThreadAttrSetScope_Two(napi_env env, napi_callback_info info)
363 {
364     const int testScope = PARAM_2;
365     pthread_attr_t attr;
366     pthread_attr_init(&attr);
367     int ret = pthread_attr_setscope(&attr, testScope);
368     pthread_attr_destroy(&attr);
369     napi_value result = nullptr;
370     napi_create_int32(env, ret, &result);
371     return result;
372 }
373 
PThreadAttrSetStack_One(napi_env env,napi_callback_info info)374 static napi_value PThreadAttrSetStack_One(napi_env env, napi_callback_info info)
375 {
376     const size_t testStackSize = PARAM_0x4001;
377     pthread_attr_t attr;
378     void *stackAddr = nullptr;
379     void *getStackAddr = nullptr;
380     size_t getStackSize = PARAM_0;
381     int pageSize = getpagesize();
382     pthread_attr_init(&attr);
383     posix_memalign(&stackAddr, pageSize, testStackSize);
384     int ret = pthread_attr_setstack(&attr, stackAddr, testStackSize);
385     pthread_attr_getstack(&attr, &getStackAddr, &getStackSize);
386     pthread_attr_destroy(&attr);
387     ret |= stackAddr != getStackAddr;
388     ret |= getStackSize != testStackSize;
389     if (stackAddr != nullptr) {
390         free(stackAddr);
391     }
392     napi_value result = nullptr;
393     napi_create_int32(env, ret, &result);
394     return result;
395 }
396 
PThreadAttrSetStack_Two(napi_env env,napi_callback_info info)397 static napi_value PThreadAttrSetStack_Two(napi_env env, napi_callback_info info)
398 {
399     const int testStackSize = MPARAM_1;
400     pthread_attr_t attr;
401     void *stackAddr = nullptr;
402     pthread_attr_init(&attr);
403     int ret = pthread_attr_setstack(&attr, stackAddr, testStackSize);
404     pthread_attr_destroy(&attr);
405     napi_value result = nullptr;
406     napi_create_int32(env, ret, &result);
407     return result;
408 }
409 
PThreadAttrSetStack_Three(napi_env env,napi_callback_info info)410 static napi_value PThreadAttrSetStack_Three(napi_env env, napi_callback_info info)
411 {
412     const int testStackSize = PTHREAD_STACK_MIN - PARAM_1;
413     pthread_attr_t attr;
414     void *stackAddr = nullptr;
415     pthread_attr_init(&attr);
416     int ret = pthread_attr_setstack(&attr, stackAddr, testStackSize);
417     pthread_attr_destroy(&attr);
418     napi_value result = nullptr;
419     napi_create_int32(env, ret, &result);
420     return result;
421 }
422 
PThreadAttrSetStackSize_One(napi_env env,napi_callback_info info)423 static napi_value PThreadAttrSetStackSize_One(napi_env env, napi_callback_info info)
424 {
425     const size_t testStackSize = PARAM_4069;
426     pthread_attr_t attr;
427     size_t stackSize = PARAM_0;
428     pthread_attr_init(&attr);
429     int ret = pthread_attr_setstacksize(&attr, testStackSize);
430     pthread_attr_getstacksize(&attr, &stackSize);
431     pthread_attr_destroy(&attr);
432     ret |= stackSize != testStackSize;
433     napi_value result = nullptr;
434     napi_create_int32(env, ret, &result);
435     return result;
436 }
437 
PThreadAttrSetStackSize_Two(napi_env env,napi_callback_info info)438 static napi_value PThreadAttrSetStackSize_Two(napi_env env, napi_callback_info info)
439 {
440     const size_t testStackSize = MPARAM_1;
441     pthread_attr_t attr;
442     pthread_attr_init(&attr);
443     int ret = pthread_attr_setstacksize(&attr, testStackSize);
444     pthread_attr_destroy(&attr);
445     napi_value result = nullptr;
446     napi_create_int32(env, ret, &result);
447     return result;
448 }
449 
PThreadBarrierDestroy(napi_env env,napi_callback_info info)450 static napi_value PThreadBarrierDestroy(napi_env env, napi_callback_info info)
451 {
452     pthread_barrier_t barrier;
453     unsigned int threadnum = PARAM_4;
454     pthread_barrier_init(&barrier, nullptr, threadnum);
455     int ret = pthread_barrier_destroy(&barrier);
456     napi_value result = nullptr;
457     napi_create_int32(env, ret, &result);
458     return result;
459 }
460 
PThreadBarrierInit(napi_env env,napi_callback_info info)461 static napi_value PThreadBarrierInit(napi_env env, napi_callback_info info)
462 {
463     pthread_barrier_t barrier;
464     unsigned int threadnum = PARAM_4;
465     int ret = pthread_barrier_init(&barrier, nullptr, threadnum);
466     pthread_barrier_destroy(&barrier);
467     napi_value result = nullptr;
468     napi_create_int32(env, ret, &result);
469     return result;
470 }
471 int g_pthreadBarrierWaitResult;
PThreadBarrierWaitThread(void * arg)472 static void *PThreadBarrierWaitThread(void *arg)
473 {
474     pthread_barrier_t *pbarrier = (pthread_barrier_t *)arg;
475     g_pthreadBarrierWaitResult = pthread_barrier_wait(pbarrier);
476     return nullptr;
477 }
478 
PThreadBarrierWait(napi_env env,napi_callback_info info)479 static napi_value PThreadBarrierWait(napi_env env, napi_callback_info info)
480 {
481     const unsigned int threadnum = PARAM_4;
482     pthread_barrier_t barrier;
483     pthread_t threadIds[threadnum];
484     pthread_barrier_init(&barrier, nullptr, threadnum + PARAM_1);
485     for (unsigned int i = PARAM_0; i < threadnum; i++) {
486         pthread_create(&threadIds[i], nullptr, PThreadBarrierWaitThread, &barrier);
487     }
488     int ret = pthread_barrier_wait(&barrier);
489     for (unsigned int i = PARAM_0; i < threadnum; i++) {
490         pthread_join(threadIds[i], nullptr);
491         ret |= g_pthreadBarrierWaitResult;
492     }
493     pthread_barrier_destroy(&barrier);
494     napi_value result = nullptr;
495     napi_create_int32(env, ret, &result);
496     return result;
497 }
498 
PThreadBarrierAttrDestroy(napi_env env,napi_callback_info info)499 static napi_value PThreadBarrierAttrDestroy(napi_env env, napi_callback_info info)
500 {
501     pthread_barrierattr_t attr;
502     pthread_barrierattr_init(&attr);
503     int ret = pthread_barrierattr_destroy(&attr);
504     napi_value result = nullptr;
505     napi_create_int32(env, ret, &result);
506     return result;
507 }
508 
PThreadBarrierAttrInit(napi_env env,napi_callback_info info)509 static napi_value PThreadBarrierAttrInit(napi_env env, napi_callback_info info)
510 {
511     pthread_barrierattr_t attr;
512     int ret = pthread_barrierattr_init(&attr);
513     pthread_barrierattr_destroy(&attr);
514     napi_value result = nullptr;
515     napi_create_int32(env, ret, &result);
516     return result;
517 }
518 
PThreadBarrierAttrGetPShared(napi_env env,napi_callback_info info)519 static napi_value PThreadBarrierAttrGetPShared(napi_env env, napi_callback_info info)
520 {
521     pthread_barrierattr_t attr;
522     int shared;
523     pthread_barrierattr_init(&attr);
524     pthread_barrierattr_setpshared(&attr, PTHREAD_PROCESS_SHARED);
525     int ret = pthread_barrierattr_getpshared(&attr, &shared);
526     pthread_barrierattr_destroy(&attr);
527     ret |= shared != PTHREAD_PROCESS_SHARED;
528     napi_value result = nullptr;
529     napi_create_int32(env, ret, &result);
530     return result;
531 }
532 
PThreadBarrierAttrSetPShared(napi_env env,napi_callback_info info)533 static napi_value PThreadBarrierAttrSetPShared(napi_env env, napi_callback_info info)
534 {
535     pthread_barrierattr_t attr;
536     int shared;
537     pthread_barrierattr_init(&attr);
538     int ret = pthread_barrierattr_setpshared(&attr, PTHREAD_PROCESS_SHARED);
539     pthread_barrierattr_getpshared(&attr, &shared);
540     pthread_barrierattr_destroy(&attr);
541     ret |= shared != PTHREAD_PROCESS_SHARED;
542     napi_value result = nullptr;
543     napi_create_int32(env, ret, &result);
544     return result;
545 }
546 
PThreadCondBroadcast(napi_env env,napi_callback_info info)547 static napi_value PThreadCondBroadcast(napi_env env, napi_callback_info info)
548 {
549     pthread_cond_t cond = PTHREAD_COND_INITIALIZER;
550     int ret = pthread_cond_broadcast(&cond);
551     napi_value result = nullptr;
552     napi_create_int32(env, ret, &result);
553     return result;
554 }
555 
PThreadCondDestroy(napi_env env,napi_callback_info info)556 static napi_value PThreadCondDestroy(napi_env env, napi_callback_info info)
557 {
558     pthread_cond_t cond;
559     pthread_cond_init(&cond, nullptr);
560     int ret = pthread_cond_destroy(&cond);
561     napi_value result = nullptr;
562     napi_create_int32(env, ret, &result);
563     return result;
564 }
565 
PThreadCondInit(napi_env env,napi_callback_info info)566 static napi_value PThreadCondInit(napi_env env, napi_callback_info info)
567 {
568     pthread_cond_t cond = PTHREAD_COND_INITIALIZER;
569     pthread_condattr_t attr;
570     int ret = pthread_cond_init(&cond, &attr);
571     pthread_cond_destroy(&cond);
572     napi_value result = nullptr;
573     napi_create_int32(env, ret, &result);
574     return result;
575 }
576 
PThreadCondSignal(napi_env env,napi_callback_info info)577 static napi_value PThreadCondSignal(napi_env env, napi_callback_info info)
578 {
579     pthread_cond_t cond = PTHREAD_COND_INITIALIZER;
580     int ret = pthread_cond_signal(&cond);
581     napi_value result = nullptr;
582     napi_create_int32(env, ret, &result);
583     return result;
584 }
585 
586 struct pthreadCondTimedWaitParam {
587     pthread_cond_t cond;
588     pthread_mutex_t mutex;
589 };
590 int g_pthreadCondTimedWaitResult;
PThreadCondTimedWaitThreadA(void * arg)591 static void *PThreadCondTimedWaitThreadA(void *arg)
592 {
593     pthreadCondTimedWaitParam *pparam = (pthreadCondTimedWaitParam *)arg;
594     timespec outtime;
595     pthread_mutex_lock(&(pparam->mutex));
596     clock_gettime(CLOCK_REALTIME, &outtime);
597     outtime.tv_sec += PARAM_5;
598     g_pthreadCondTimedWaitResult = pthread_cond_timedwait(&(pparam->cond), &(pparam->mutex), &outtime);
599     pthread_mutex_unlock(&(pparam->mutex));
600     return nullptr;
601 }
PThreadCondTimedWaitThreadB(void * arg)602 static void *PThreadCondTimedWaitThreadB(void *arg)
603 {
604     pthreadCondTimedWaitParam *pparam = (pthreadCondTimedWaitParam *)arg;
605     pthread_mutex_lock(&(pparam->mutex));
606     pthread_cond_signal(&(pparam->cond));
607     pthread_mutex_unlock(&(pparam->mutex));
608     return nullptr;
609 }
610 
PThreadCondTimedWait(napi_env env,napi_callback_info info)611 static napi_value PThreadCondTimedWait(napi_env env, napi_callback_info info)
612 {
613     pthreadCondTimedWaitParam param;
614     pthread_t threadIdA;
615     pthread_t threadIdB;
616     pthread_cond_init(&param.cond, nullptr);
617     pthread_mutex_init(&param.mutex, nullptr);
618     pthread_create(&threadIdA, nullptr, PThreadCondTimedWaitThreadA, &param);
619     pthread_create(&threadIdB, nullptr, PThreadCondTimedWaitThreadB, &param);
620     pthread_join(threadIdA, nullptr);
621     pthread_join(threadIdB, nullptr);
622     pthread_cond_destroy(&param.cond);
623     pthread_mutex_destroy(&param.mutex);
624     napi_value result = nullptr;
625     napi_create_int32(env, g_pthreadCondTimedWaitResult, &result);
626     return result;
627 }
628 
629 struct pthreadCondWaitParam {
630     pthread_cond_t cond;
631     pthread_mutex_t mutex;
632 };
633 std:: atomic<bool> isPthreadRun (false);
634 int g_pthreadCondWaitResult;
PThreadCondWaitThreadA(void * arg)635 static void *PThreadCondWaitThreadA(void *arg)
636 {
637     pthreadCondWaitParam *pparam = (pthreadCondWaitParam *)arg;
638     pthread_mutex_lock(&(pparam->mutex));
639     isPthreadRun = true;
640     g_pthreadCondWaitResult = pthread_cond_wait(&(pparam->cond), &(pparam->mutex));
641     pthread_mutex_unlock(&(pparam->mutex));
642     return nullptr;
643 }
PThreadCondWaitThreadB(void * arg)644 static void *PThreadCondWaitThreadB(void *arg)
645 {
646     pthreadCondWaitParam *pparam = (pthreadCondWaitParam *)arg;
647     while(!isPthreadRun){
648         usleep(SLEEP_10_MS);
649     }
650     pthread_mutex_lock(&(pparam->mutex));
651     pthread_cond_signal(&(pparam->cond));
652     pthread_mutex_unlock(&(pparam->mutex));
653     return nullptr;
654 }
655 
PThreadCondWait(napi_env env,napi_callback_info info)656 static napi_value PThreadCondWait(napi_env env, napi_callback_info info)
657 {
658     isPthreadRun = false;
659     pthreadCondWaitParam param;
660     pthread_t threadIdA;
661     pthread_t threadIdB;
662     pthread_cond_init(&param.cond, nullptr);
663     pthread_mutex_init(&param.mutex, nullptr);
664     pthread_create(&threadIdA, nullptr, PThreadCondWaitThreadA, &param);
665     pthread_create(&threadIdB, nullptr, PThreadCondWaitThreadB, &param);
666     pthread_join(threadIdA, nullptr);
667     pthread_join(threadIdB, nullptr);
668     pthread_cond_destroy(&param.cond);
669     pthread_mutex_destroy(&param.mutex);
670     napi_value result = nullptr;
671     napi_create_int32(env, g_pthreadCondWaitResult, &result);
672     return result;
673 }
674 
PThreadCondAttrDestroy(napi_env env,napi_callback_info info)675 static napi_value PThreadCondAttrDestroy(napi_env env, napi_callback_info info)
676 {
677     pthread_condattr_t attr;
678     pthread_condattr_init(&attr);
679     int ret = pthread_condattr_destroy(&attr);
680     napi_value result = nullptr;
681     napi_create_int32(env, ret, &result);
682     return result;
683 }
684 
PThreadCondAttrGetClock(napi_env env,napi_callback_info info)685 static napi_value PThreadCondAttrGetClock(napi_env env, napi_callback_info info)
686 {
687     pthread_condattr_t attr;
688     int clock;
689     pthread_condattr_init(&attr);
690     pthread_condattr_setclock(&attr, CLOCK_MONOTONIC);
691     int ret = pthread_condattr_getclock(&attr, &clock);
692     pthread_condattr_destroy(&attr);
693     ret |= clock != CLOCK_MONOTONIC;
694     napi_value result = nullptr;
695     napi_create_int32(env, ret, &result);
696     return result;
697 }
698 
PThreadCondAttrGetPShared(napi_env env,napi_callback_info info)699 static napi_value PThreadCondAttrGetPShared(napi_env env, napi_callback_info info)
700 {
701     pthread_condattr_t attr;
702     int shared;
703     pthread_condattr_init(&attr);
704     pthread_condattr_setpshared(&attr, PTHREAD_PROCESS_SHARED);
705     int ret = pthread_condattr_getpshared(&attr, &shared);
706     pthread_condattr_destroy(&attr);
707     ret |= shared != PTHREAD_PROCESS_SHARED;
708     napi_value result = nullptr;
709     napi_create_int32(env, ret, &result);
710     return result;
711 }
712 
PThreadCondAttrInit(napi_env env,napi_callback_info info)713 static napi_value PThreadCondAttrInit(napi_env env, napi_callback_info info)
714 {
715     pthread_condattr_t attr;
716     int ret = pthread_condattr_init(&attr);
717     pthread_condattr_destroy(&attr);
718     napi_value result = nullptr;
719     napi_create_int32(env, ret, &result);
720     return result;
721 }
722 
PThreadCondAttrSetClock(napi_env env,napi_callback_info info)723 static napi_value PThreadCondAttrSetClock(napi_env env, napi_callback_info info)
724 {
725     pthread_condattr_t attr;
726     int clock;
727     pthread_condattr_init(&attr);
728     int ret = pthread_condattr_setclock(&attr, CLOCK_MONOTONIC);
729     pthread_condattr_getclock(&attr, &clock);
730     pthread_condattr_destroy(&attr);
731     ret |= clock != CLOCK_MONOTONIC;
732     napi_value result = nullptr;
733     napi_create_int32(env, ret, &result);
734     return result;
735 }
736 
PThreadCondAttrSetPShared(napi_env env,napi_callback_info info)737 static napi_value PThreadCondAttrSetPShared(napi_env env, napi_callback_info info)
738 {
739     pthread_condattr_t attr;
740     int shared;
741     pthread_condattr_init(&attr);
742     int ret = pthread_condattr_setpshared(&attr, PTHREAD_PROCESS_SHARED);
743     pthread_condattr_getpshared(&attr, &shared);
744     pthread_condattr_destroy(&attr);
745     ret |= shared != PTHREAD_PROCESS_SHARED;
746     napi_value result = nullptr;
747     napi_create_int32(env, ret, &result);
748     return result;
749 }
750 
PThreadCreateThread(void * arg)751 static void *PThreadCreateThread(void *arg)
752 {
753     int *pret = static_cast<int *>(arg);
754     (*pret)++;
755     return pret;
756 }
757 
PThreadCreate(napi_env env,napi_callback_info info)758 static napi_value PThreadCreate(napi_env env, napi_callback_info info)
759 {
760     int count = PARAM_0;
761     pthread_t threadId;
762     int ret = pthread_create(&threadId, nullptr, PThreadCreateThread, &count);
763     pthread_join(threadId, nullptr);
764     ret |= count != PARAM_1;
765     napi_value result = nullptr;
766     napi_create_int32(env, ret, &result);
767     return result;
768 }
769 
PThreadDetachThread(void * arg)770 static void *PThreadDetachThread(void *arg)
771 {
772     int *pret = static_cast<int *>(arg);
773     (*pret)++;
774     pthread_exit(PARAM_0);
775     return pret;
776 }
777 
PThreadDetach(napi_env env,napi_callback_info info)778 static napi_value PThreadDetach(napi_env env, napi_callback_info info)
779 {
780     int count = PARAM_0;
781     pthread_t threadId;
782     pthread_create(&threadId, nullptr, PThreadDetachThread, &count);
783     int ret = pthread_detach(threadId);
784     sleep(PARAM_1);
785     ret |= count != PARAM_1;
786     napi_value result = nullptr;
787     napi_create_int32(env, ret, &result);
788     return result;
789 }
790 
PThreadEqualThread(void * arg)791 static void *PThreadEqualThread(void *arg)
792 {
793     pthread_t *pthreadId = (pthread_t *)arg;
794     *pthreadId = pthread_self();
795     return nullptr;
796 }
797 
PThreadEqual(napi_env env,napi_callback_info info)798 static napi_value PThreadEqual(napi_env env, napi_callback_info info)
799 {
800     pthread_t threadId;
801     pthread_t threadId2;
802     pthread_create(&threadId, nullptr, PThreadEqualThread, &threadId2);
803     pthread_join(threadId, nullptr);
804     int ret = pthread_equal(threadId, threadId2);
805     napi_value result = nullptr;
806     napi_create_int32(env, ret, &result);
807     return result;
808 }
809 int g_pthreadExitResult;
PThreadExitThread(void * arg)810 static void *PThreadExitThread(void *arg)
811 {
812     g_pthreadExitResult = *static_cast<int *>(arg);
813     pthread_exit((void *)&g_pthreadExitResult);
814     return nullptr;
815 }
816 
PThreadExit(napi_env env,napi_callback_info info)817 static napi_value PThreadExit(napi_env env, napi_callback_info info)
818 {
819     pthread_t threadId;
820     int count = PARAM_1;
821     pthread_create(&threadId, nullptr, PThreadExitThread, &count);
822     pthread_join(threadId, nullptr);
823     int ret = count != g_pthreadExitResult;
824     napi_value result = nullptr;
825     napi_create_int32(env, ret, &result);
826     return result;
827 }
828 
PThreadGetAttrNpThread(void * arg)829 static void *PThreadGetAttrNpThread(void *arg) { return arg; }
830 
PThreadGetAttrNp(napi_env env,napi_callback_info info)831 static napi_value PThreadGetAttrNp(napi_env env, napi_callback_info info)
832 {
833     pthread_t threadId;
834     pthread_attr_t attr;
835     pthread_attr_init(&attr);
836     pthread_create(&threadId, nullptr, PThreadGetAttrNpThread, nullptr);
837     int ret = pthread_getattr_np(threadId, &attr);
838     pthread_join(threadId, nullptr);
839     pthread_attr_destroy(&attr);
840     napi_value result = nullptr;
841     napi_create_int32(env, ret, &result);
842     return result;
843 }
844 
PThreadGetCpuClockId(napi_env env,napi_callback_info info)845 static napi_value PThreadGetCpuClockId(napi_env env, napi_callback_info info)
846 {
847     clockid_t clockid;
848     int ret = pthread_getcpuclockid(pthread_self(), &clockid);
849     napi_value result = nullptr;
850     napi_create_int32(env, ret, &result);
851     return result;
852 }
853 
PThreadGetSchedParam(napi_env env,napi_callback_info info)854 static napi_value PThreadGetSchedParam(napi_env env, napi_callback_info info)
855 {
856     int policy = PARAM_0;
857     sched_param param;
858     int ret = pthread_getschedparam(pthread_self(), &policy, &param);
859     napi_value result = nullptr;
860     napi_create_int32(env, ret, &result);
861     return result;
862 }
863 
PThreadGetSpecific(napi_env env,napi_callback_info info)864 static napi_value PThreadGetSpecific(napi_env env, napi_callback_info info)
865 {
866     int value = PARAM_1;
867     pthread_key_t key;
868     pthread_key_create(&key, nullptr);
869     pthread_setspecific(key, static_cast<void *>(&value));
870     int keyRet = *static_cast<int *>(pthread_getspecific(key));
871     pthread_key_delete(key);
872     int ret = value != keyRet;
873     napi_value result = nullptr;
874     napi_create_int32(env, ret, &result);
875     return result;
876 }
877 int g_pthreadJoinResult;
PThreadJoinThread(void * arg)878 static void *PThreadJoinThread(void *arg)
879 {
880     g_pthreadJoinResult = *static_cast<int *>(arg);
881     g_pthreadJoinResult++;
882     return nullptr;
883 }
884 
PThreadJoin(napi_env env,napi_callback_info info)885 static napi_value PThreadJoin(napi_env env, napi_callback_info info)
886 {
887     pthread_t threadId;
888     int value = PARAM_0;
889     pthread_create(&threadId, nullptr, PThreadJoinThread, static_cast<void *>(&value));
890     int ret = pthread_join(threadId, nullptr);
891     napi_value result = nullptr;
892     napi_create_int32(env, ret, &result);
893     return result;
894 }
895 
PThreadKeyCreate(napi_env env,napi_callback_info info)896 static napi_value PThreadKeyCreate(napi_env env, napi_callback_info info)
897 {
898     pthread_key_t key;
899     int ret = pthread_key_create(&key, nullptr);
900     pthread_key_delete(key);
901     napi_value result = nullptr;
902     napi_create_int32(env, ret, &result);
903     return result;
904 }
905 
PThreadKeyDelete(napi_env env,napi_callback_info info)906 static napi_value PThreadKeyDelete(napi_env env, napi_callback_info info)
907 {
908     pthread_key_t key;
909     pthread_key_create(&key, nullptr);
910     int ret = pthread_key_delete(key);
911     napi_value result = nullptr;
912     napi_create_int32(env, ret, &result);
913     return result;
914 }
915 
PThreadKillHandler(int sig)916 static void PThreadKillHandler(int sig) { return; }
917 
918 struct sigaction actold;
919 int g_pthreadKillResult;
PThreadKillThread(void * arg)920 static void *PThreadKillThread(void *arg)
921 {
922     struct sigaction act;
923     memset(&act, PARAM_0, sizeof(act));
924     act.sa_flags = PARAM_0;
925     act.sa_handler = PThreadKillHandler;
926     sigemptyset(&act.sa_mask);
927     sigaction(SIGUSR1, &act, &actold);
928     int sigret = sigpause(SIGUSR1);
929     g_pthreadKillResult = (sigret == -1) && (errno == EINTR);
930     sigaction(SIGUSR1, &actold, nullptr);
931     return nullptr;
932 }
933 
PThreadKill(napi_env env,napi_callback_info info)934 static napi_value PThreadKill(napi_env env, napi_callback_info info)
935 {
936     pthread_t threadId;
937     pthread_create(&threadId, nullptr, PThreadKillThread, nullptr);
938     sleep(PARAM_1);
939     int killRet = pthread_kill(threadId, SIGUSR1);
940     pthread_join(threadId, nullptr);
941     int ret = (killRet == PARAM_0) && (g_pthreadKillResult == PARAM_1);
942     napi_value result = nullptr;
943     napi_create_int32(env, !ret, &result);
944     return result;
945 }
946 
PThreadMutexDestroy(napi_env env,napi_callback_info info)947 static napi_value PThreadMutexDestroy(napi_env env, napi_callback_info info)
948 {
949     pthread_mutex_t mutex;
950     pthread_mutex_init(&mutex, nullptr);
951     int ret = pthread_mutex_destroy(&mutex);
952     napi_value result = nullptr;
953     napi_create_int32(env, ret, &result);
954     return result;
955 }
956 
PThreadMutexInit(napi_env env,napi_callback_info info)957 static napi_value PThreadMutexInit(napi_env env, napi_callback_info info)
958 {
959     pthread_mutex_t mutex;
960     int ret = pthread_mutex_init(&mutex, nullptr);
961     napi_value result = nullptr;
962     napi_create_int32(env, ret, &result);
963     return result;
964 }
965 
PThreadMutexLock(napi_env env,napi_callback_info info)966 static napi_value PThreadMutexLock(napi_env env, napi_callback_info info)
967 {
968     pthread_mutex_t mutex;
969     pthread_mutex_init(&mutex, nullptr);
970     int ret = pthread_mutex_lock(&mutex);
971     pthread_mutex_unlock(&mutex);
972     pthread_mutex_destroy(&mutex);
973     napi_value result = nullptr;
974     napi_create_int32(env, ret, &result);
975     return result;
976 }
977 
PThreadMutexTimedLock(napi_env env,napi_callback_info info)978 static napi_value PThreadMutexTimedLock(napi_env env, napi_callback_info info)
979 {
980     pthread_mutex_t mutex;
981     timespec ts = {1, 0};
982     pthread_mutex_init(&mutex, nullptr);
983     int ret = pthread_mutex_timedlock(&mutex, &ts);
984     pthread_mutex_unlock(&mutex);
985     pthread_mutex_destroy(&mutex);
986     napi_value result = nullptr;
987     napi_create_int32(env, ret, &result);
988     return result;
989 }
990 
PThreadMutexTryLock(napi_env env,napi_callback_info info)991 static napi_value PThreadMutexTryLock(napi_env env, napi_callback_info info)
992 {
993     pthread_mutex_t mutex;
994     pthread_mutex_init(&mutex, nullptr);
995     int ret = pthread_mutex_trylock(&mutex);
996     pthread_mutex_unlock(&mutex);
997     pthread_mutex_destroy(&mutex);
998     napi_value result = nullptr;
999     napi_create_int32(env, ret, &result);
1000     return result;
1001 }
1002 
PThreadMutexUnlock(napi_env env,napi_callback_info info)1003 static napi_value PThreadMutexUnlock(napi_env env, napi_callback_info info)
1004 {
1005     pthread_mutex_t mutex;
1006     pthread_mutex_init(&mutex, nullptr);
1007     pthread_mutex_lock(&mutex);
1008     int ret = pthread_mutex_unlock(&mutex);
1009     pthread_mutex_destroy(&mutex);
1010     napi_value result = nullptr;
1011     napi_create_int32(env, ret, &result);
1012     return result;
1013 }
1014 
PThreadMutexAttrDestroy(napi_env env,napi_callback_info info)1015 static napi_value PThreadMutexAttrDestroy(napi_env env, napi_callback_info info)
1016 {
1017     pthread_mutexattr_t attr;
1018     pthread_mutexattr_init(&attr);
1019     int ret = pthread_mutexattr_destroy(&attr);
1020     napi_value result = nullptr;
1021     napi_create_int32(env, ret, &result);
1022     return result;
1023 }
1024 
PThreadMutexAttrGetProtocol(napi_env env,napi_callback_info info)1025 static napi_value PThreadMutexAttrGetProtocol(napi_env env, napi_callback_info info)
1026 {
1027     pthread_mutexattr_t attr;
1028     int protocol = PARAM_0;
1029     pthread_mutexattr_init(&attr);
1030     pthread_mutexattr_setprotocol(&attr, PTHREAD_PRIO_INHERIT);
1031     int ret = pthread_mutexattr_getprotocol(&attr, &protocol);
1032     pthread_mutexattr_destroy(&attr);
1033     ret |= protocol != PTHREAD_PRIO_INHERIT;
1034     napi_value result = nullptr;
1035     napi_create_int32(env, ret, &result);
1036     return result;
1037 }
1038 
PThreadMutexAttrGetPShared(napi_env env,napi_callback_info info)1039 static napi_value PThreadMutexAttrGetPShared(napi_env env, napi_callback_info info)
1040 {
1041     pthread_mutexattr_t attr;
1042     int shared = PARAM_0;
1043     pthread_mutexattr_init(&attr);
1044     pthread_mutexattr_setpshared(&attr, PTHREAD_PROCESS_SHARED);
1045     int ret = pthread_mutexattr_getpshared(&attr, &shared);
1046     pthread_mutexattr_destroy(&attr);
1047     ret |= shared != PTHREAD_PROCESS_SHARED;
1048     napi_value result = nullptr;
1049     napi_create_int32(env, ret, &result);
1050     return result;
1051 }
1052 
PThreadMutexAttrGetType(napi_env env,napi_callback_info info)1053 static napi_value PThreadMutexAttrGetType(napi_env env, napi_callback_info info)
1054 {
1055     pthread_mutexattr_t attr;
1056     int type = PARAM_0;
1057     pthread_mutexattr_init(&attr);
1058     pthread_mutexattr_settype(&attr, PTHREAD_MUTEX_RECURSIVE);
1059     int ret = pthread_mutexattr_gettype(&attr, &type);
1060     pthread_mutexattr_destroy(&attr);
1061     ret |= type != PTHREAD_MUTEX_RECURSIVE;
1062     napi_value result = nullptr;
1063     napi_create_int32(env, ret, &result);
1064     return result;
1065 }
1066 
PThreadMutexAttrInit(napi_env env,napi_callback_info info)1067 static napi_value PThreadMutexAttrInit(napi_env env, napi_callback_info info)
1068 {
1069     pthread_mutexattr_t attr;
1070     int ret = pthread_mutexattr_init(&attr);
1071     pthread_mutexattr_destroy(&attr);
1072     napi_value result = nullptr;
1073     napi_create_int32(env, ret, &result);
1074     return result;
1075 }
1076 
PThreadMutexAttrSetProtocol(napi_env env,napi_callback_info info)1077 static napi_value PThreadMutexAttrSetProtocol(napi_env env, napi_callback_info info)
1078 {
1079     pthread_mutexattr_t attr;
1080     int protocol = PARAM_0;
1081     pthread_mutexattr_init(&attr);
1082     int ret = pthread_mutexattr_setprotocol(&attr, PTHREAD_PRIO_INHERIT);
1083     pthread_mutexattr_getprotocol(&attr, &protocol);
1084     pthread_mutexattr_destroy(&attr);
1085     ret |= protocol != PTHREAD_PRIO_INHERIT;
1086     napi_value result = nullptr;
1087     napi_create_int32(env, ret, &result);
1088     return result;
1089 }
1090 
PThreadMutexAttrSetPShared(napi_env env,napi_callback_info info)1091 static napi_value PThreadMutexAttrSetPShared(napi_env env, napi_callback_info info)
1092 {
1093     pthread_mutexattr_t attr;
1094     int shared = PARAM_0;
1095     pthread_mutexattr_init(&attr);
1096     int ret = pthread_mutexattr_setpshared(&attr, PTHREAD_PROCESS_SHARED);
1097     pthread_mutexattr_getpshared(&attr, &shared);
1098     pthread_mutexattr_destroy(&attr);
1099     ret |= shared != PTHREAD_PROCESS_SHARED;
1100     napi_value result = nullptr;
1101     napi_create_int32(env, ret, &result);
1102     return result;
1103 }
1104 
PThreadMutexAttrSetType(napi_env env,napi_callback_info info)1105 static napi_value PThreadMutexAttrSetType(napi_env env, napi_callback_info info)
1106 {
1107     pthread_mutexattr_t attr;
1108     int type = PARAM_0;
1109     pthread_mutexattr_init(&attr);
1110     int ret = pthread_mutexattr_settype(&attr, PTHREAD_MUTEX_RECURSIVE);
1111     pthread_mutexattr_gettype(&attr, &type);
1112     pthread_mutexattr_destroy(&attr);
1113     ret |= type != PTHREAD_MUTEX_RECURSIVE;
1114     napi_value result = nullptr;
1115     napi_create_int32(env, ret, &result);
1116     return result;
1117 }
1118 
1119 struct pthreadOnceParam {
1120     pthread_mutex_t mutex;
1121     pthread_once_t once;
1122     int count;
1123 };
1124 static pthreadOnceParam gOnceParam;
PThreadOnceFunc(void)1125 void PThreadOnceFunc(void)
1126 {
1127     pthread_mutex_lock(&gOnceParam.mutex);
1128     gOnceParam.count++;
1129     pthread_mutex_unlock(&gOnceParam.mutex);
1130 }
1131 int g_pthreadOnceResult;
PThreadOnceThread(void * arg)1132 static void *PThreadOnceThread(void *arg)
1133 {
1134     g_pthreadOnceResult = pthread_once(&gOnceParam.once, PThreadOnceFunc);
1135     return nullptr;
1136 }
PThreadOnce(napi_env env,napi_callback_info info)1137 static napi_value PThreadOnce(napi_env env, napi_callback_info info)
1138 {
1139     pthread_t thread1;
1140     pthread_t thread2;
1141     pthread_t thread3;
1142     pthread_t thread4;
1143     pthread_mutex_init(&gOnceParam.mutex, nullptr);
1144     gOnceParam.once = PTHREAD_ONCE_INIT;
1145     gOnceParam.count = PARAM_0;
1146 
1147     pthread_create(&thread1, nullptr, PThreadOnceThread, nullptr);
1148     pthread_create(&thread2, nullptr, PThreadOnceThread, nullptr);
1149     pthread_create(&thread3, nullptr, PThreadOnceThread, nullptr);
1150     pthread_create(&thread4, nullptr, PThreadOnceThread, nullptr);
1151     pthread_join(thread1, nullptr);
1152     pthread_join(thread2, nullptr);
1153     pthread_join(thread3, nullptr);
1154     pthread_join(thread4, nullptr);
1155     int ret = g_pthreadOnceResult | g_pthreadOnceResult | g_pthreadOnceResult | g_pthreadOnceResult | (gOnceParam.count != 1);
1156     pthread_mutex_destroy(&gOnceParam.mutex);
1157     napi_value result = nullptr;
1158     napi_create_int32(env, ret, &result);
1159     return result;
1160 }
1161 
PThreadRwLockDestroy(napi_env env,napi_callback_info info)1162 static napi_value PThreadRwLockDestroy(napi_env env, napi_callback_info info)
1163 {
1164     pthread_rwlock_t lock;
1165     pthread_rwlock_init(&lock, nullptr);
1166     int ret = pthread_rwlock_destroy(&lock);
1167     napi_value result = nullptr;
1168     napi_create_int32(env, ret, &result);
1169     return result;
1170 }
1171 
PThreadRwLockInit(napi_env env,napi_callback_info info)1172 static napi_value PThreadRwLockInit(napi_env env, napi_callback_info info)
1173 {
1174     pthread_rwlock_t lock;
1175     int ret = pthread_rwlock_init(&lock, nullptr);
1176     pthread_rwlock_destroy(&lock);
1177     napi_value result = nullptr;
1178     napi_create_int32(env, ret, &result);
1179     return result;
1180 }
1181 
PThreadRwLockRdLock(napi_env env,napi_callback_info info)1182 static napi_value PThreadRwLockRdLock(napi_env env, napi_callback_info info)
1183 {
1184     pthread_rwlock_t lock;
1185     pthread_rwlock_init(&lock, nullptr);
1186     int ret = pthread_rwlock_rdlock(&lock);
1187     pthread_rwlock_unlock(&lock);
1188     pthread_rwlock_destroy(&lock);
1189     napi_value result = nullptr;
1190     napi_create_int32(env, ret, &result);
1191     return result;
1192 }
1193 
PThreadRwLockTimedRdLock(napi_env env,napi_callback_info info)1194 static napi_value PThreadRwLockTimedRdLock(napi_env env, napi_callback_info info)
1195 {
1196     pthread_rwlock_t lock;
1197     timespec ts;
1198     pthread_rwlock_init(&lock, nullptr);
1199     clock_gettime(CLOCK_REALTIME, &ts);
1200     ts.tv_sec += PARAM_1;
1201     int ret = pthread_rwlock_timedrdlock(&lock, &ts);
1202     pthread_rwlock_unlock(&lock);
1203     pthread_rwlock_destroy(&lock);
1204     napi_value result = nullptr;
1205     napi_create_int32(env, ret, &result);
1206     return result;
1207 }
1208 
PThreadRwLockTimedWrLock(napi_env env,napi_callback_info info)1209 static napi_value PThreadRwLockTimedWrLock(napi_env env, napi_callback_info info)
1210 {
1211     pthread_rwlock_t lock;
1212     timespec ts;
1213     pthread_rwlock_init(&lock, nullptr);
1214     clock_gettime(CLOCK_REALTIME, &ts);
1215     ts.tv_sec += PARAM_1;
1216     int ret = pthread_rwlock_timedwrlock(&lock, &ts);
1217     pthread_rwlock_unlock(&lock);
1218     pthread_rwlock_destroy(&lock);
1219     napi_value result = nullptr;
1220     napi_create_int32(env, ret, &result);
1221     return result;
1222 }
1223 
PThreadRwLockTryRdLock(napi_env env,napi_callback_info info)1224 static napi_value PThreadRwLockTryRdLock(napi_env env, napi_callback_info info)
1225 {
1226     pthread_rwlock_t lock;
1227     pthread_rwlock_init(&lock, nullptr);
1228     int ret = pthread_rwlock_tryrdlock(&lock);
1229     pthread_rwlock_unlock(&lock);
1230     pthread_rwlock_destroy(&lock);
1231     napi_value result = nullptr;
1232     napi_create_int32(env, ret, &result);
1233     return result;
1234 }
1235 
PThreadRwLockTryWrLock(napi_env env,napi_callback_info info)1236 static napi_value PThreadRwLockTryWrLock(napi_env env, napi_callback_info info)
1237 {
1238     pthread_rwlock_t lock;
1239     pthread_rwlock_init(&lock, nullptr);
1240     int ret = pthread_rwlock_trywrlock(&lock);
1241     pthread_rwlock_unlock(&lock);
1242     pthread_rwlock_destroy(&lock);
1243     napi_value result = nullptr;
1244     napi_create_int32(env, ret, &result);
1245     return result;
1246 }
1247 
PThreadRwLockUnLock(napi_env env,napi_callback_info info)1248 static napi_value PThreadRwLockUnLock(napi_env env, napi_callback_info info)
1249 {
1250     pthread_rwlock_t lock;
1251     pthread_rwlock_init(&lock, nullptr);
1252     pthread_rwlock_rdlock(&lock);
1253     int ret = pthread_rwlock_unlock(&lock);
1254     pthread_rwlock_destroy(&lock);
1255     napi_value result = nullptr;
1256     napi_create_int32(env, ret, &result);
1257     return result;
1258 }
1259 
PThreadRwLockWrLock(napi_env env,napi_callback_info info)1260 static napi_value PThreadRwLockWrLock(napi_env env, napi_callback_info info)
1261 {
1262     pthread_rwlock_t lock;
1263     pthread_rwlock_init(&lock, nullptr);
1264     int ret = pthread_rwlock_wrlock(&lock);
1265     pthread_rwlock_unlock(&lock);
1266     pthread_rwlock_destroy(&lock);
1267     napi_value result = nullptr;
1268     napi_create_int32(env, ret, &result);
1269     return result;
1270 }
1271 
PThreadRwLockAttrDestroy(napi_env env,napi_callback_info info)1272 static napi_value PThreadRwLockAttrDestroy(napi_env env, napi_callback_info info)
1273 {
1274     pthread_rwlockattr_t attr;
1275     pthread_rwlockattr_init(&attr);
1276     int ret = pthread_rwlockattr_destroy(&attr);
1277     napi_value result = nullptr;
1278     napi_create_int32(env, ret, &result);
1279     return result;
1280 }
1281 
PThreadRwLockAttrGetPShared(napi_env env,napi_callback_info info)1282 static napi_value PThreadRwLockAttrGetPShared(napi_env env, napi_callback_info info)
1283 {
1284     pthread_rwlockattr_t attr;
1285     int shared = PARAM_0;
1286     pthread_rwlockattr_init(&attr);
1287     pthread_rwlockattr_setpshared(&attr, PTHREAD_PROCESS_SHARED);
1288     int ret = pthread_rwlockattr_getpshared(&attr, &shared);
1289     pthread_rwlockattr_destroy(&attr);
1290     ret |= shared != PTHREAD_PROCESS_SHARED;
1291     napi_value result = nullptr;
1292     napi_create_int32(env, ret, &result);
1293     return result;
1294 }
1295 
PThreadRwLockAttrInit(napi_env env,napi_callback_info info)1296 static napi_value PThreadRwLockAttrInit(napi_env env, napi_callback_info info)
1297 {
1298     pthread_rwlockattr_t attr;
1299     int ret = pthread_rwlockattr_init(&attr);
1300     pthread_rwlockattr_destroy(&attr);
1301     napi_value result = nullptr;
1302     napi_create_int32(env, ret, &result);
1303     return result;
1304 }
1305 
PThreadRwLockAttrSetPShared(napi_env env,napi_callback_info info)1306 static napi_value PThreadRwLockAttrSetPShared(napi_env env, napi_callback_info info)
1307 {
1308     pthread_rwlockattr_t attr;
1309     int shared = PARAM_0;
1310     pthread_rwlockattr_init(&attr);
1311     int ret = pthread_rwlockattr_setpshared(&attr, PTHREAD_PROCESS_SHARED);
1312     pthread_rwlockattr_getpshared(&attr, &shared);
1313     pthread_rwlockattr_destroy(&attr);
1314     ret |= shared != PTHREAD_PROCESS_SHARED;
1315     napi_value result = nullptr;
1316     napi_create_int32(env, ret, &result);
1317     return result;
1318 }
1319 
PThreadSelfThread(void * arg)1320 static void *PThreadSelfThread(void *arg)
1321 {
1322     pthread_t *pthreadId = (pthread_t *)arg;
1323     *pthreadId = pthread_self();
1324     return nullptr;
1325 }
1326 
PThreadSelf(napi_env env,napi_callback_info info)1327 static napi_value PThreadSelf(napi_env env, napi_callback_info info)
1328 {
1329     pthread_t threadId;
1330     pthread_t threadId2;
1331     pthread_create(&threadId, nullptr, PThreadSelfThread, &threadId2);
1332     pthread_join(threadId, nullptr);
1333     int ret = pthread_equal(threadId, threadId2);
1334     napi_value result = nullptr;
1335     napi_create_int32(env, ret, &result);
1336     return result;
1337 }
1338 
PThreadSetNameNpThread(void * arg)1339 static void *PThreadSetNameNpThread(void *arg)
1340 {
1341     sleep(PARAM_1);
1342     return nullptr;
1343 }
1344 
PThreadSetNameNp(napi_env env,napi_callback_info info)1345 static napi_value PThreadSetNameNp(napi_env env, napi_callback_info info)
1346 {
1347     const char *pname = const_cast<char *>("testThread");
1348     char name[20];
1349     pthread_t threadId;
1350     pthread_create(&threadId, nullptr, PThreadSetNameNpThread, nullptr);
1351     int ret = pthread_setname_np(threadId, pname);
1352     pthread_getname_np(threadId, name, sizeof(name));
1353     pthread_join(threadId, nullptr);
1354     int issame = strncmp(pname, name, sizeof(name));
1355     ret |= issame;
1356     napi_value result = nullptr;
1357     napi_create_int32(env, ret, &result);
1358     return result;
1359 }
1360 
PThreadSetSchedParamThread(void * arg)1361 static void *PThreadSetSchedParamThread(void *arg)
1362 {
1363     sem_t *psem = (sem_t *)arg;
1364     sem_wait(psem);
1365     return nullptr;
1366 }
1367 
PThreadSetSchedParam(napi_env env,napi_callback_info info)1368 static napi_value PThreadSetSchedParam(napi_env env, napi_callback_info info)
1369 {
1370     sem_t sem;
1371     sched_param sched;
1372     sched.sched_priority = PARAM_0;
1373     pthread_t threadId;
1374     sem_init(&sem, PARAM_0, PARAM_0);
1375     pthread_create(&threadId, nullptr, PThreadSetSchedParamThread, &sem);
1376     int ret = pthread_setschedparam(threadId, SCHED_OTHER, &sched);
1377     sem_post(&sem);
1378     pthread_join(threadId, nullptr);
1379     sem_destroy(&sem);
1380     napi_value result = nullptr;
1381     napi_create_int32(env, ret, &result);
1382     return result;
1383 }
1384 
PThreadSetSpecific(napi_env env,napi_callback_info info)1385 static napi_value PThreadSetSpecific(napi_env env, napi_callback_info info)
1386 {
1387     int value = PARAM_1;
1388     pthread_key_t key;
1389     pthread_key_create(&key, nullptr);
1390     int ret = pthread_setspecific(key, static_cast<void *>(&value));
1391     int keyRet = *static_cast<int *>(pthread_getspecific(key));
1392     pthread_key_delete(key);
1393     ret |= value != keyRet;
1394     napi_value result = nullptr;
1395     napi_create_int32(env, ret, &result);
1396     return result;
1397 }
1398 int g_pthreadSigMaskResult;
PThreadSigMaskThread(void * arg)1399 static void *PThreadSigMaskThread(void *arg)
1400 {
1401     sigset_t set;
1402     sigaddset(&set, SIGUSR1);
1403     g_pthreadSigMaskResult = pthread_sigmask(SIG_BLOCK, &set, nullptr);
1404     return nullptr;
1405 }
1406 
PThreadSigMask(napi_env env,napi_callback_info info)1407 static napi_value PThreadSigMask(napi_env env, napi_callback_info info)
1408 {
1409     pthread_t threadId;
1410     pthread_create(&threadId, nullptr, PThreadSigMaskThread, nullptr);
1411     pthread_join(threadId, nullptr);
1412     napi_value result = nullptr;
1413     napi_create_int32(env, g_pthreadSigMaskResult, &result);
1414     return result;
1415 }
1416 
PThreadSpinInit(napi_env env,napi_callback_info info)1417 static napi_value PThreadSpinInit(napi_env env, napi_callback_info info)
1418 {
1419     pthread_spinlock_t lock;
1420     int ret = pthread_spin_init(&lock, PTHREAD_PROCESS_PRIVATE);
1421     pthread_spin_destroy(&lock);
1422     napi_value result = nullptr;
1423     napi_create_int32(env, ret, &result);
1424     return result;
1425 }
1426 
PThreadSpinDestroy(napi_env env,napi_callback_info info)1427 static napi_value PThreadSpinDestroy(napi_env env, napi_callback_info info)
1428 {
1429     pthread_spinlock_t lock;
1430     pthread_spin_init(&lock, PTHREAD_PROCESS_PRIVATE);
1431     int ret = pthread_spin_destroy(&lock);
1432     napi_value result = nullptr;
1433     napi_create_int32(env, ret, &result);
1434     return result;
1435 }
1436 
PThreadSpinLock(napi_env env,napi_callback_info info)1437 static napi_value PThreadSpinLock(napi_env env, napi_callback_info info)
1438 {
1439     pthread_spinlock_t lock;
1440     pthread_spin_init(&lock, PTHREAD_PROCESS_PRIVATE);
1441     int ret = pthread_spin_lock(&lock);
1442     pthread_spin_unlock(&lock);
1443     pthread_spin_destroy(&lock);
1444     napi_value result = nullptr;
1445     napi_create_int32(env, ret, &result);
1446     return result;
1447 }
1448 
PThreadSpinTryLock(napi_env env,napi_callback_info info)1449 static napi_value PThreadSpinTryLock(napi_env env, napi_callback_info info)
1450 {
1451     pthread_spinlock_t lock;
1452     pthread_spin_init(&lock, PTHREAD_PROCESS_PRIVATE);
1453     int ret = pthread_spin_trylock(&lock);
1454     pthread_spin_unlock(&lock);
1455     pthread_spin_destroy(&lock);
1456     napi_value result = nullptr;
1457     napi_create_int32(env, ret, &result);
1458     return result;
1459 }
1460 
PThreadSpinUnLock(napi_env env,napi_callback_info info)1461 static napi_value PThreadSpinUnLock(napi_env env, napi_callback_info info)
1462 {
1463     pthread_spinlock_t lock;
1464     pthread_spin_init(&lock, PTHREAD_PROCESS_PRIVATE);
1465     pthread_spin_lock(&lock);
1466     int ret = pthread_spin_unlock(&lock);
1467     pthread_spin_destroy(&lock);
1468     napi_value result = nullptr;
1469     napi_create_int32(env, ret, &result);
1470     return result;
1471 }
1472 
1473 EXTERN_C_START
Init(napi_env env,napi_value exports)1474 static napi_value Init(napi_env env, napi_value exports)
1475 {
1476     napi_property_descriptor desc[] = {
1477         {"pThreadAtFork", nullptr, PThreadAtFork, nullptr, nullptr, nullptr, napi_default, nullptr},
1478         {"pThreadAttrDestroy", nullptr, PThreadAttrDestroy, nullptr, nullptr, nullptr, napi_default, nullptr},
1479         {"pThreadAttrGetDetachState", nullptr, PThreadAttrGetDetachState, nullptr, nullptr, nullptr, napi_default,
1480          nullptr},
1481         {"pThreadAttrGetGuardSize", nullptr, PThreadAttrGetGuardSize, nullptr, nullptr, nullptr, napi_default, nullptr},
1482         {"pThreadAttrGetInheritSched", nullptr, PThreadAttrGetInheritSched, nullptr, nullptr, nullptr, napi_default,
1483          nullptr},
1484         {"pThreadAttrGetSchedParam", nullptr, PThreadAttrGetSchedParam, nullptr, nullptr, nullptr, napi_default,
1485          nullptr},
1486         {"pThreadAttrGetSchedPolicy", nullptr, PThreadAttrGetSchedPolicy, nullptr, nullptr, nullptr, napi_default,
1487          nullptr},
1488         {"pThreadAttrGetScope", nullptr, PThreadAttrGetScope, nullptr, nullptr, nullptr, napi_default, nullptr},
1489         {"pThreadAttrGetStack", nullptr, PThreadAttrGetStack, nullptr, nullptr, nullptr, napi_default, nullptr},
1490         {"pThreadAttrGetStackSize", nullptr, PThreadAttrGetStackSize, nullptr, nullptr, nullptr, napi_default, nullptr},
1491         {"pThreadAttrInit", nullptr, PThreadAttrInit, nullptr, nullptr, nullptr, napi_default, nullptr},
1492         {"pThreadAttrSetDetachState_One", nullptr, PThreadAttrSetDetachState_One, nullptr, nullptr, nullptr,
1493          napi_default, nullptr},
1494         {"pThreadAttrSetDetachState_Two", nullptr, PThreadAttrSetDetachState_Two, nullptr, nullptr, nullptr,
1495          napi_default, nullptr},
1496         {"pThreadAttrSetGuardSize_One", nullptr, PThreadAttrSetGuardSize_One, nullptr, nullptr, nullptr, napi_default,
1497          nullptr},
1498         {"pThreadAttrSetGuardSize_Two", nullptr, PThreadAttrSetGuardSize_Two, nullptr, nullptr, nullptr, napi_default,
1499          nullptr},
1500         {"pThreadAttrSetInheritSched_One", nullptr, PThreadAttrSetInheritSched_One, nullptr, nullptr, nullptr,
1501          napi_default, nullptr},
1502         {"pThreadAttrSetInheritSched_Two", nullptr, PThreadAttrSetInheritSched_Two, nullptr, nullptr, nullptr,
1503          napi_default, nullptr},
1504         {"pThreadAttrSetSchedParam", nullptr, PThreadAttrSetSchedParam, nullptr, nullptr, nullptr, napi_default,
1505          nullptr},
1506         {"pThreadAttrSetSchedPolicy", nullptr, PThreadAttrSetSchedPolicy, nullptr, nullptr, nullptr, napi_default,
1507          nullptr},
1508         {"pThreadAttrSetScope_One", nullptr, PThreadAttrSetScope_One, nullptr, nullptr, nullptr, napi_default, nullptr},
1509         {"pThreadAttrSetScope_Two", nullptr, PThreadAttrSetScope_Two, nullptr, nullptr, nullptr, napi_default, nullptr},
1510         {"pThreadAttrSetStack_One", nullptr, PThreadAttrSetStack_One, nullptr, nullptr, nullptr, napi_default, nullptr},
1511         {"pThreadAttrSetStack_Two", nullptr, PThreadAttrSetStack_Two, nullptr, nullptr, nullptr, napi_default, nullptr},
1512         {"pThreadAttrSetStack_Three", nullptr, PThreadAttrSetStack_Three, nullptr, nullptr, nullptr, napi_default,
1513          nullptr},
1514         {"pThreadAttrSetStackSize_One", nullptr, PThreadAttrSetStackSize_One, nullptr, nullptr, nullptr, napi_default,
1515          nullptr},
1516         {"pThreadAttrSetStackSize_Two", nullptr, PThreadAttrSetStackSize_Two, nullptr, nullptr, nullptr, napi_default,
1517          nullptr},
1518         {"pThreadBarrierDestroy", nullptr, PThreadBarrierDestroy, nullptr, nullptr, nullptr, napi_default, nullptr},
1519         {"pThreadBarrierInit", nullptr, PThreadBarrierInit, nullptr, nullptr, nullptr, napi_default, nullptr},
1520         {"pThreadBarrierWait", nullptr, PThreadBarrierWait, nullptr, nullptr, nullptr, napi_default, nullptr},
1521         {"pThreadBarrierAttrDestroy", nullptr, PThreadBarrierAttrDestroy, nullptr, nullptr, nullptr, napi_default,
1522          nullptr},
1523         {"pThreadBarrierAttrInit", nullptr, PThreadBarrierAttrInit, nullptr, nullptr, nullptr, napi_default, nullptr},
1524         {"pThreadBarrierAttrGetPShared", nullptr, PThreadBarrierAttrGetPShared, nullptr, nullptr, nullptr, napi_default,
1525          nullptr},
1526         {"pThreadBarrierAttrSetPShared", nullptr, PThreadBarrierAttrSetPShared, nullptr, nullptr, nullptr, napi_default,
1527          nullptr},
1528         {"pThreadCondBroadcast", nullptr, PThreadCondBroadcast, nullptr, nullptr, nullptr, napi_default, nullptr},
1529         {"pThreadCondDestroy", nullptr, PThreadCondDestroy, nullptr, nullptr, nullptr, napi_default, nullptr},
1530         {"pThreadCondInit", nullptr, PThreadCondInit, nullptr, nullptr, nullptr, napi_default, nullptr},
1531         {"pThreadCondSignal", nullptr, PThreadCondSignal, nullptr, nullptr, nullptr, napi_default, nullptr},
1532         {"pThreadCondTimedWait", nullptr, PThreadCondTimedWait, nullptr, nullptr, nullptr, napi_default, nullptr},
1533         {"pThreadCondWait", nullptr, PThreadCondWait, nullptr, nullptr, nullptr, napi_default, nullptr},
1534         {"pThreadCondAttrDestroy", nullptr, PThreadCondAttrDestroy, nullptr, nullptr, nullptr, napi_default, nullptr},
1535         {"pThreadCondAttrGetClock", nullptr, PThreadCondAttrGetClock, nullptr, nullptr, nullptr, napi_default, nullptr},
1536         {"pThreadCondAttrGetPShared", nullptr, PThreadCondAttrGetPShared, nullptr, nullptr, nullptr, napi_default,
1537          nullptr},
1538         {"pThreadCondAttrInit", nullptr, PThreadCondAttrInit, nullptr, nullptr, nullptr, napi_default, nullptr},
1539         {"pThreadCondAttrSetClock", nullptr, PThreadCondAttrSetClock, nullptr, nullptr, nullptr, napi_default, nullptr},
1540         {"pThreadCondAttrSetPShared", nullptr, PThreadCondAttrSetPShared, nullptr, nullptr, nullptr, napi_default,
1541          nullptr},
1542         {"pThreadCreate", nullptr, PThreadCreate, nullptr, nullptr, nullptr, napi_default, nullptr},
1543         {"pThreadDetach", nullptr, PThreadDetach, nullptr, nullptr, nullptr, napi_default, nullptr},
1544         {"pThreadEqual", nullptr, PThreadEqual, nullptr, nullptr, nullptr, napi_default, nullptr},
1545         {"pThreadExit", nullptr, PThreadExit, nullptr, nullptr, nullptr, napi_default, nullptr},
1546         {"pThreadGetAttrNp", nullptr, PThreadGetAttrNp, nullptr, nullptr, nullptr, napi_default, nullptr},
1547         {"pThreadGetCpuClockId", nullptr, PThreadGetCpuClockId, nullptr, nullptr, nullptr, napi_default, nullptr},
1548         {"pThreadGetSchedParam", nullptr, PThreadGetSchedParam, nullptr, nullptr, nullptr, napi_default, nullptr},
1549         {"pThreadGetSpecific", nullptr, PThreadGetSpecific, nullptr, nullptr, nullptr, napi_default, nullptr},
1550         {"pThreadJoin", nullptr, PThreadJoin, nullptr, nullptr, nullptr, napi_default, nullptr},
1551         {"pThreadKeyCreate", nullptr, PThreadKeyCreate, nullptr, nullptr, nullptr, napi_default, nullptr},
1552         {"pThreadKeyDelete", nullptr, PThreadKeyDelete, nullptr, nullptr, nullptr, napi_default, nullptr},
1553         {"pThreadKill", nullptr, PThreadKill, nullptr, nullptr, nullptr, napi_default, nullptr},
1554         {"pThreadMutexDestroy", nullptr, PThreadMutexDestroy, nullptr, nullptr, nullptr, napi_default, nullptr},
1555         {"pThreadMutexInit", nullptr, PThreadMutexInit, nullptr, nullptr, nullptr, napi_default, nullptr},
1556         {"pThreadMutexLock", nullptr, PThreadMutexLock, nullptr, nullptr, nullptr, napi_default, nullptr},
1557         {"pThreadMutexTimedLock", nullptr, PThreadMutexTimedLock, nullptr, nullptr, nullptr, napi_default, nullptr},
1558         {"pThreadMutexTryLock", nullptr, PThreadMutexTryLock, nullptr, nullptr, nullptr, napi_default, nullptr},
1559         {"pThreadMutexUnlock", nullptr, PThreadMutexUnlock, nullptr, nullptr, nullptr, napi_default, nullptr},
1560         {"pThreadMutexAttrDestroy", nullptr, PThreadMutexAttrDestroy, nullptr, nullptr, nullptr, napi_default, nullptr},
1561         {"pThreadMutexAttrGetProtocol", nullptr, PThreadMutexAttrGetProtocol, nullptr, nullptr, nullptr, napi_default,
1562          nullptr},
1563         {"pThreadMutexAttrGetPShared", nullptr, PThreadMutexAttrGetPShared, nullptr, nullptr, nullptr, napi_default,
1564          nullptr},
1565         {"pThreadMutexAttrGetType", nullptr, PThreadMutexAttrGetType, nullptr, nullptr, nullptr, napi_default, nullptr},
1566         {"pThreadMutexAttrInit", nullptr, PThreadMutexAttrInit, nullptr, nullptr, nullptr, napi_default, nullptr},
1567         {"pThreadMutexAttrSetProtocol", nullptr, PThreadMutexAttrSetProtocol, nullptr, nullptr, nullptr, napi_default,
1568          nullptr},
1569         {"pThreadMutexAttrSetPShared", nullptr, PThreadMutexAttrSetPShared, nullptr, nullptr, nullptr, napi_default,
1570          nullptr},
1571         {"pThreadMutexAttrSetType", nullptr, PThreadMutexAttrSetType, nullptr, nullptr, nullptr, napi_default, nullptr},
1572         {"pThreadOnce", nullptr, PThreadOnce, nullptr, nullptr, nullptr, napi_default, nullptr},
1573         {"pThreadRwLockDestroy", nullptr, PThreadRwLockDestroy, nullptr, nullptr, nullptr, napi_default, nullptr},
1574         {"pThreadRwLockInit", nullptr, PThreadRwLockInit, nullptr, nullptr, nullptr, napi_default, nullptr},
1575         {"pThreadRwLockRdLock", nullptr, PThreadRwLockRdLock, nullptr, nullptr, nullptr, napi_default, nullptr},
1576         {"pThreadRwLockTimedRdLock", nullptr, PThreadRwLockTimedRdLock, nullptr, nullptr, nullptr, napi_default,
1577          nullptr},
1578         {"pThreadRwLockTimedWrLock", nullptr, PThreadRwLockTimedWrLock, nullptr, nullptr, nullptr, napi_default,
1579          nullptr},
1580         {"pThreadRwLockTryRdLock", nullptr, PThreadRwLockTryRdLock, nullptr, nullptr, nullptr, napi_default, nullptr},
1581         {"pThreadRwLockTryWrLock", nullptr, PThreadRwLockTryWrLock, nullptr, nullptr, nullptr, napi_default, nullptr},
1582         {"pThreadRwLockUnLock", nullptr, PThreadRwLockUnLock, nullptr, nullptr, nullptr, napi_default, nullptr},
1583         {"pThreadRwLockWrLock", nullptr, PThreadRwLockWrLock, nullptr, nullptr, nullptr, napi_default, nullptr},
1584         {"pThreadRwLockAttrDestroy", nullptr, PThreadRwLockAttrDestroy, nullptr, nullptr, nullptr, napi_default,
1585          nullptr},
1586         {"pThreadRwLockAttrGetPShared", nullptr, PThreadRwLockAttrGetPShared, nullptr, nullptr, nullptr, napi_default,
1587          nullptr},
1588         {"pThreadRwLockAttrInit", nullptr, PThreadRwLockAttrInit, nullptr, nullptr, nullptr, napi_default, nullptr},
1589         {"pThreadRwLockAttrSetPShared", nullptr, PThreadRwLockAttrSetPShared, nullptr, nullptr, nullptr, napi_default,
1590          nullptr},
1591         {"pThreadSelf", nullptr, PThreadSelf, nullptr, nullptr, nullptr, napi_default, nullptr},
1592         {"pThreadSetNameNp", nullptr, PThreadSetNameNp, nullptr, nullptr, nullptr, napi_default, nullptr},
1593         {"pThreadSetSchedParam", nullptr, PThreadSetSchedParam, nullptr, nullptr, nullptr, napi_default, nullptr},
1594         {"pThreadSetSpecific", nullptr, PThreadSetSpecific, nullptr, nullptr, nullptr, napi_default, nullptr},
1595         {"pThreadSigMask", nullptr, PThreadSigMask, nullptr, nullptr, nullptr, napi_default, nullptr},
1596         {"pThreadSpinInit", nullptr, PThreadSpinInit, nullptr, nullptr, nullptr, napi_default, nullptr},
1597         {"pThreadSpinDestroy", nullptr, PThreadSpinDestroy, nullptr, nullptr, nullptr, napi_default, nullptr},
1598         {"pThreadSpinLock", nullptr, PThreadSpinLock, nullptr, nullptr, nullptr, napi_default, nullptr},
1599         {"pThreadSpinTryLock", nullptr, PThreadSpinTryLock, nullptr, nullptr, nullptr, napi_default, nullptr},
1600         {"pThreadSpinUnLock", nullptr, PThreadSpinUnLock, nullptr, nullptr, nullptr, napi_default, nullptr},
1601     };
1602     napi_define_properties(env, exports, sizeof(desc) / sizeof(desc[0]), desc);
1603     return exports;
1604 }
1605 EXTERN_C_END
1606 
1607 static napi_module demoModule = {
1608     .nm_version = 1,
1609     .nm_flags = 0,
1610     .nm_filename = nullptr,
1611     .nm_register_func = Init,
1612     .nm_modname = "pthread1",
1613     .nm_priv = ((void *)0),
1614     .reserved = {0},
1615 };
1616 
RegisterEntryModule(void)1617 extern "C" __attribute__((constructor)) void RegisterEntryModule(void) { napi_module_register(&demoModule); }
1618