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