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(¶m.cond, nullptr);
617 pthread_mutex_init(¶m.mutex, nullptr);
618 pthread_create(&threadIdA, nullptr, PThreadCondTimedWaitThreadA, ¶m);
619 pthread_create(&threadIdB, nullptr, PThreadCondTimedWaitThreadB, ¶m);
620 pthread_join(threadIdA, nullptr);
621 pthread_join(threadIdB, nullptr);
622 pthread_cond_destroy(¶m.cond);
623 pthread_mutex_destroy(¶m.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(¶m.cond, nullptr);
663 pthread_mutex_init(¶m.mutex, nullptr);
664 pthread_create(&threadIdA, nullptr, PThreadCondWaitThreadA, ¶m);
665 pthread_create(&threadIdB, nullptr, PThreadCondWaitThreadB, ¶m);
666 pthread_join(threadIdA, nullptr);
667 pthread_join(threadIdB, nullptr);
668 pthread_cond_destroy(¶m.cond);
669 pthread_mutex_destroy(¶m.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, ¶m);
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