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(¶m.cond, nullptr);
616 pthread_mutex_init(¶m.mutex, nullptr);
617 pthread_create(&threadIdA, nullptr, PThreadCondTimedWaitThreadA, ¶m);
618 pthread_create(&threadIdB, nullptr, PThreadCondTimedWaitThreadB, ¶m);
619 pthread_join(threadIdA, (void **)&ret);
620 pthread_join(threadIdB, nullptr);
621 pthread_cond_destroy(¶m.cond);
622 pthread_mutex_destroy(¶m.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(¶m.cond, nullptr);
656 pthread_mutex_init(¶m.mutex, nullptr);
657 pthread_create(&threadIdA, nullptr, PThreadCondWaitThreadA, ¶m);
658 pthread_create(&threadIdB, nullptr, PThreadCondWaitThreadB, ¶m);
659 pthread_join(threadIdA, (void **)&ret);
660 pthread_join(threadIdB, nullptr);
661 pthread_cond_destroy(¶m.cond);
662 pthread_mutex_destroy(¶m.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, ¶m);
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