1 /**
2  * D header file for POSIX.
3  *
4  * Copyright: Copyright Sean Kelly 2005 - 2009.
5  * License:   $(HTTP www.boost.org/LICENSE_1_0.txt, Boost License 1.0).
6  * Authors:   Sean Kelly, Alex Rønne Petersen
7  * Standards: The Open Group Base Specifications Issue 6, IEEE Std 1003.1, 2004 Edition
8  */
9 
10 /*          Copyright Sean Kelly 2005 - 2009.
11  * Distributed under the Boost Software License, Version 1.0.
12  *    (See accompanying file LICENSE or copy at
13  *          http://www.boost.org/LICENSE_1_0.txt)
14  */
15 module core.sys.posix.pthread;
16 
17 import core.sys.posix.config;
18 public import core.sys.posix.sys.types;
19 public import core.sys.posix.sched;
20 public import core.sys.posix.time;
21 
22 import core.stdc.stdint;
23 
24 version (OSX)
25     version = Darwin;
26 else version (iOS)
27     version = Darwin;
28 else version (TVOS)
29     version = Darwin;
30 else version (WatchOS)
31     version = Darwin;
32 
33 version (Posix):
34 extern (C)
35 nothrow:
36 
37 //
38 // Required
39 //
40 /*
41 PTHREAD_CANCEL_ASYNCHRONOUS
42 PTHREAD_CANCEL_ENABLE
43 PTHREAD_CANCEL_DEFERRED
44 PTHREAD_CANCEL_DISABLE
45 PTHREAD_CANCELED
46 PTHREAD_COND_INITIALIZER
47 PTHREAD_CREATE_DETACHED
48 PTHREAD_CREATE_JOINABLE
49 PTHREAD_EXPLICIT_SCHED
50 PTHREAD_INHERIT_SCHED
51 PTHREAD_MUTEX_INITIALIZER
52 PTHREAD_ONCE_INIT
53 PTHREAD_PROCESS_SHARED
54 PTHREAD_PROCESS_PRIVATE
55 
56 int pthread_atfork(void function(), void function(), void function());
57 int pthread_attr_destroy(pthread_attr_t*);
58 int pthread_attr_getdetachstate(const scope pthread_attr_t*, int*);
59 int pthread_attr_getschedparam(const scope pthread_attr_t*, sched_param*);
60 int pthread_attr_init(pthread_attr_t*);
61 int pthread_attr_setdetachstate(pthread_attr_t*, int);
62 int pthread_attr_setschedparam(const scope pthread_attr_t*, sched_param*);
63 int pthread_cancel(pthread_t);
64 void pthread_cleanup_push(void function(void*), void*);
65 void pthread_cleanup_pop(int);
66 int pthread_cond_broadcast(pthread_cond_t*);
67 int pthread_cond_destroy(pthread_cond_t*);
68 int pthread_cond_init(const scope pthread_cond_t*, pthread_condattr_t*);
69 int pthread_cond_signal(pthread_cond_t*);
70 int pthread_cond_timedwait(pthread_cond_t*, pthread_mutex_t*, const scope timespec*);
71 int pthread_cond_wait(pthread_cond_t*, pthread_mutex_t*);
72 int pthread_condattr_destroy(pthread_condattr_t*);
73 int pthread_condattr_init(pthread_condattr_t*);
74 int pthread_create(pthread_t*, const scope pthread_attr_t*, void* function(void*), void*);
75 int pthread_detach(pthread_t);
76 int pthread_equal(pthread_t, pthread_t);
77 void pthread_exit(void*);
78 void* pthread_getspecific(pthread_key_t);
79 int pthread_join(pthread_t, void**);
80 int pthread_key_create(pthread_key_t*, void function(void*));
81 int pthread_key_delete(pthread_key_t);
82 int pthread_mutex_destroy(pthread_mutex_t*);
83 int pthread_mutex_init(pthread_mutex_t*, pthread_mutexattr_t*);
84 int pthread_mutex_lock(pthread_mutex_t*);
85 int pthread_mutex_trylock(pthread_mutex_t*);
86 int pthread_mutex_unlock(pthread_mutex_t*);
87 int pthread_mutexattr_destroy(pthread_mutexattr_t*);
88 int pthread_mutexattr_init(pthread_mutexattr_t*);
89 int pthread_once(pthread_once_t*, void function());
90 int pthread_rwlock_destroy(pthread_rwlock_t*);
91 int pthread_rwlock_init(pthread_rwlock_t*, const scope pthread_rwlockattr_t*);
92 int pthread_rwlock_rdlock(pthread_rwlock_t*);
93 int pthread_rwlock_tryrdlock(pthread_rwlock_t*);
94 int pthread_rwlock_trywrlock(pthread_rwlock_t*);
95 int pthread_rwlock_unlock(pthread_rwlock_t*);
96 int pthread_rwlock_wrlock(pthread_rwlock_t*);
97 int pthread_rwlockattr_destroy(pthread_rwlockattr_t*);
98 int pthread_rwlockattr_init(pthread_rwlockattr_t*);
99 pthread_t pthread_self();
100 int pthread_setcancelstate(int, int*);
101 int pthread_setcanceltype(int, int*);
102 int pthread_setspecific(pthread_key_t, const scope void*);
103 void pthread_testcancel();
104 */
105 version (CRuntime_Glibc)
106 {
107     enum
108     {
109         PTHREAD_CANCEL_ENABLE,
110         PTHREAD_CANCEL_DISABLE
111     }
112 
113     enum
114     {
115         PTHREAD_CANCEL_DEFERRED,
116         PTHREAD_CANCEL_ASYNCHRONOUS
117     }
118 
119     enum PTHREAD_CANCELED = cast(void*) -1;
120 
121     //enum pthread_mutex_t PTHREAD_COND_INITIALIZER = { __LOCK_ALT_INITIALIZER, 0, "", 0 };
122 
123     enum
124     {
125         PTHREAD_CREATE_JOINABLE,
126         PTHREAD_CREATE_DETACHED
127     }
128 
129     enum
130     {
131         PTHREAD_INHERIT_SCHED,
132         PTHREAD_EXPLICIT_SCHED
133     }
134 
135     enum PTHREAD_MUTEX_INITIALIZER  = pthread_mutex_t.init;
136     enum PTHREAD_ONCE_INIT          = pthread_once_t.init;
137 
138     enum
139     {
140         PTHREAD_PROCESS_PRIVATE,
141         PTHREAD_PROCESS_SHARED
142     }
143 }
144 else version (Darwin)
145 {
146     enum
147     {
148         PTHREAD_CANCEL_ENABLE   = 1,
149         PTHREAD_CANCEL_DISABLE  = 0
150     }
151 
152     enum
153     {
154         PTHREAD_CANCEL_DEFERRED     = 2,
155         PTHREAD_CANCEL_ASYNCHRONOUS = 0
156     }
157 
158     enum PTHREAD_CANCELED = cast(void*) -1;
159 
160     //enum pthread_mutex_t PTHREAD_COND_INITIALIZER = { __LOCK_ALT_INITIALIZER, 0, "", 0 };
161 
162     enum
163     {
164         PTHREAD_CREATE_JOINABLE = 1,
165         PTHREAD_CREATE_DETACHED = 2
166     }
167 
168     enum
169     {
170         PTHREAD_INHERIT_SCHED   = 1,
171         PTHREAD_EXPLICIT_SCHED  = 2
172     }
173 
174     enum PTHREAD_MUTEX_INITIALIZER  = pthread_mutex_t(0x32AAABA7);
175     enum PTHREAD_ONCE_INIT          = pthread_once_t(0x30b1bcba);
176 
177     enum
178     {
179         PTHREAD_PROCESS_PRIVATE = 2,
180         PTHREAD_PROCESS_SHARED  = 1
181     }
182 }
183 else version (FreeBSD)
184 {
185     enum
186     {
187         PTHREAD_DETACHED            = 0x1,
188         PTHREAD_INHERIT_SCHED       = 0x4,
189         PTHREAD_NOFLOAT             = 0x8,
190 
191         PTHREAD_CREATE_DETACHED     = PTHREAD_DETACHED,
192         PTHREAD_CREATE_JOINABLE     = 0,
193         PTHREAD_EXPLICIT_SCHED      = 0,
194     }
195 
196     enum
197     {
198         PTHREAD_PROCESS_PRIVATE     = 0,
199         PTHREAD_PROCESS_SHARED      = 1,
200     }
201 
202     enum
203     {
204         PTHREAD_CANCEL_ENABLE       = 0,
205         PTHREAD_CANCEL_DISABLE      = 1,
206         PTHREAD_CANCEL_DEFERRED     = 0,
207         PTHREAD_CANCEL_ASYNCHRONOUS = 2,
208     }
209 
210     enum PTHREAD_CANCELED = cast(void*) -1;
211 
212     enum PTHREAD_NEEDS_INIT = 0;
213     enum PTHREAD_DONE_INIT  = 1;
214 
215     enum PTHREAD_MUTEX_INITIALIZER              = null;
216     enum PTHREAD_ONCE_INIT                      = null;
217     enum PTHREAD_ADAPTIVE_MUTEX_INITIALIZER_NP  = null;
218     enum PTHREAD_COND_INITIALIZER               = null;
219     enum PTHREAD_RWLOCK_INITIALIZER             = null;
220 }
221 else version (NetBSD)
222 {
223     enum PRI_NONE = -1;
224     enum
225     {
226         PTHREAD_INHERIT_SCHED       = 0x0,
227 
228         PTHREAD_CREATE_DETACHED     = 1,
229         PTHREAD_CREATE_JOINABLE     = 0,
230         PTHREAD_EXPLICIT_SCHED      = 1,
231     }
232 
233     enum
234     {
235         PTHREAD_PROCESS_PRIVATE     = 0,
236         PTHREAD_PROCESS_SHARED      = 1,
237     }
238 
239     enum
240     {
241         PTHREAD_CANCEL_ENABLE       = 0,
242         PTHREAD_CANCEL_DISABLE      = 1,
243         PTHREAD_CANCEL_DEFERRED     = 0,
244         PTHREAD_CANCEL_ASYNCHRONOUS = 1,
245     }
246 
247     enum PTHREAD_CANCELED = cast(void*) 1;
248 
249     enum PTHREAD_DONE_INIT  = 1;
250 
251     enum PTHREAD_MUTEX_INITIALIZER              = pthread_mutex_t(0x33330003);
252 
253     enum PTHREAD_ONCE_INIT                      = pthread_once_t(PTHREAD_MUTEX_INITIALIZER);
254     enum PTHREAD_COND_INITIALIZER               = pthread_cond_t(0x55550005);
255     enum PTHREAD_RWLOCK_INITIALIZER             = pthread_rwlock_t(0x99990009);
256 }
257 else version (OpenBSD)
258 {
259     enum
260     {
261         PTHREAD_DETACHED            = 0x1,
262         PTHREAD_INHERIT_SCHED       = 0x4,
263         PTHREAD_NOFLOAT             = 0x8,
264 
265         PTHREAD_CREATE_DETACHED     = PTHREAD_DETACHED,
266         PTHREAD_CREATE_JOINABLE     = 0,
267         PTHREAD_EXPLICIT_SCHED      = 0,
268     }
269 
270     enum
271     {
272         PTHREAD_PROCESS_PRIVATE     = 0,
273         PTHREAD_PROCESS_SHARED      = 1,
274     }
275 
276     enum
277     {
278         PTHREAD_CANCEL_ENABLE       = 0,
279         PTHREAD_CANCEL_DISABLE      = 1,
280         PTHREAD_CANCEL_DEFERRED     = 0,
281         PTHREAD_CANCEL_ASYNCHRONOUS = 2,
282     }
283 
284     enum PTHREAD_CANCELED = cast(void*) 1;
285 
286     enum
287     {
288         PTHREAD_NEEDS_INIT = 0,
289         PTHREAD_DONE_INIT  = 1,
290     }
291 
292     enum PTHREAD_MUTEX_INITIALIZER              = null;
293     enum PTHREAD_ONCE_INIT                      = pthread_once_t.init;
294     enum PTHREAD_COND_INITIALIZER               = null;
295     enum PTHREAD_RWLOCK_INITIALIZER             = null;
296 }
297 else version (DragonFlyBSD)
298 {
299     enum
300     {
301         PTHREAD_DETACHED            = 0x1,
302         //PTHREAD_SCOPE_SYSTEM        = 0x2,    // defined below
303         PTHREAD_INHERIT_SCHED       = 0x4,
304         PTHREAD_NOFLOAT             = 0x8,
305 
306         PTHREAD_CREATE_DETACHED     = PTHREAD_DETACHED,
307         PTHREAD_CREATE_JOINABLE     = 0,
308         //PTHREAD_SCOPE_PROCESS       = 0,      // defined below
309         PTHREAD_EXPLICIT_SCHED      = 0,
310     }
311 
312     enum
313     {
314         PTHREAD_PROCESS_PRIVATE     = 0,
315         PTHREAD_PROCESS_SHARED      = 1,
316     }
317 
318     enum
319     {
320         PTHREAD_CANCEL_ENABLE       = 0,
321         PTHREAD_CANCEL_DISABLE      = 1,
322         PTHREAD_CANCEL_DEFERRED     = 0,
323         PTHREAD_CANCEL_ASYNCHRONOUS = 2,
324     }
325 
326     enum PTHREAD_CANCELED = cast(void*) -1;
327 
328     enum PTHREAD_NEEDS_INIT = 0;
329     enum PTHREAD_DONE_INIT  = 1;
330 
331     enum PTHREAD_MUTEX_INITIALIZER              = null;
332     enum PTHREAD_ONCE_INIT                      = pthread_once_t.init;
333     enum PTHREAD_COND_INITIALIZER               = null;
334     enum PTHREAD_RWLOCK_INITIALIZER             = null;
335 }
336 else version (Solaris)
337 {
338     enum
339     {
340         PTHREAD_INHERIT_SCHED = 0x01,
341         PTHREAD_NOFLOAT = 0x08,
342         PTHREAD_CREATE_DETACHED = 0x40,
343         PTHREAD_CREATE_JOINABLE = 0x00,
344         PTHREAD_EXPLICIT_SCHED = 0x00,
345     }
346 
347     enum
348     {
349         PTHREAD_PROCESS_PRIVATE = 0,
350         PTHREAD_PROCESS_SHARED = 1,
351     }
352 
353     enum
354     {
355         PTHREAD_CANCEL_ENABLE = 0,
356         PTHREAD_CANCEL_DISABLE = 1,
357         PTHREAD_CANCEL_DEFERRED = 0,
358         PTHREAD_CANCEL_ASYNCHRONOUS = 2,
359     }
360 
361     enum PTHREAD_CANCELED = cast(void*)-19;
362 
363     enum PTHREAD_MUTEX_INITIALIZER  = pthread_mutex_t.init;
364     enum PTHREAD_ONCE_INIT          = pthread_once_t.init;
365 }
366 else version (CRuntime_Bionic)
367 {
368     enum
369     {
370         PTHREAD_CREATE_JOINABLE,
371         PTHREAD_CREATE_DETACHED
372     }
373 
374     enum PTHREAD_MUTEX_INITIALIZER = pthread_mutex_t.init;
375     enum PTHREAD_ONCE_INIT         = pthread_once_t.init;
376 
377     enum
378     {
379         PTHREAD_PROCESS_PRIVATE,
380         PTHREAD_PROCESS_SHARED
381     }
382 }
383 else version (CRuntime_Musl)
384 {
385     enum
386     {
387         PTHREAD_CREATE_JOINABLE = 0,
388         PTHREAD_CREATE_DETACHED = 1
389     }
390 
391     enum PTHREAD_MUTEX_INITIALIZER = pthread_mutex_t.init;
392     enum PTHREAD_ONCE_INIT = pthread_once_t.init;
393 
394     enum
395     {
396         PTHREAD_PROCESS_PRIVATE = 0,
397         PTHREAD_PROCESS_SHARED = 1
398     }
399 }
400 else version (CRuntime_UClibc)
401 {
402     enum
403     {
404         PTHREAD_CANCEL_ENABLE,
405         PTHREAD_CANCEL_DISABLE
406     }
407 
408     enum
409     {
410         PTHREAD_CANCEL_DEFERRED,
411         PTHREAD_CANCEL_ASYNCHRONOUS
412     }
413 
414     enum PTHREAD_CANCELED   = cast(void*) -1;
415 
416     enum PTHREAD_MUTEX_INITIALIZER  = pthread_mutex_t.init;
417     enum PTHREAD_ONCE_INIT          = pthread_once_t.init;
418 
419     enum
420     {
421         PTHREAD_CREATE_JOINABLE,
422         PTHREAD_CREATE_DETACHED
423     }
424 
425     enum
426     {
427         PTHREAD_INHERIT_SCHED,
428         PTHREAD_EXPLICIT_SCHED
429     }
430 
431     enum
432     {
433         PTHREAD_PROCESS_PRIVATE,
434         PTHREAD_PROCESS_SHARED
435     }
436 }
437 else
438 {
439     static assert(false, "Unsupported platform");
440 }
441 
442 int pthread_atfork(void function(), void function(), void function());
443 @nogc {
444     int pthread_atfork(void function() @nogc, void function() @nogc, void function() @nogc);
445     int pthread_attr_destroy(pthread_attr_t*);
446     int pthread_attr_getdetachstate(const scope pthread_attr_t*, int*);
447     int pthread_attr_getschedparam(const scope pthread_attr_t*, sched_param*);
448     int pthread_attr_init(pthread_attr_t*);
449     int pthread_attr_setdetachstate(pthread_attr_t*, int);
450     int pthread_attr_setschedparam(const scope pthread_attr_t*, sched_param*);
451     int pthread_cancel(pthread_t);
452 }
453 
454 alias void function(void*) _pthread_cleanup_routine;
455 alias void function(void*) @nogc _pthread_cleanup_routine_nogc;
456 version (CRuntime_Glibc)
457 {
458     struct _pthread_cleanup_buffer
459     {
460         _pthread_cleanup_routine    __routine;
461         void*                       __arg;
462         int                         __canceltype;
463         _pthread_cleanup_buffer*    __prev;
464     }
465 
466     void _pthread_cleanup_push(_pthread_cleanup_buffer*, _pthread_cleanup_routine, void*);
467     void _pthread_cleanup_push(_pthread_cleanup_buffer*, _pthread_cleanup_routine_nogc, void*) @nogc;
468     void _pthread_cleanup_pop(_pthread_cleanup_buffer*, int);
469 
470     struct pthread_cleanup
471     {
472         _pthread_cleanup_buffer buffer = void;
473 
474         extern (D) void push(F: _pthread_cleanup_routine)(F routine, void* arg )
475         {
476             _pthread_cleanup_push( &buffer, routine, arg );
477         }
478 
479         extern (D) void pop()( int execute )
480         {
481             _pthread_cleanup_pop( &buffer, execute );
482         }
483     }
484 }
485 else version (Darwin)
486 {
487     struct _pthread_cleanup_buffer
488     {
489         _pthread_cleanup_routine    __routine;
490         void*                       __arg;
491         _pthread_cleanup_buffer*    __next;
492     }
493 
494     struct pthread_cleanup
495     {
496         _pthread_cleanup_buffer buffer = void;
497 
498         extern (D) void push(F: _pthread_cleanup_routine)(F routine, void* arg )
499         {
500             pthread_t self       = pthread_self();
501             buffer.__routine     = routine;
502             buffer.__arg         = arg;
503             buffer.__next        = cast(_pthread_cleanup_buffer*) self.__cleanup_stack;
504             self.__cleanup_stack = cast(pthread_handler_rec*) &buffer;
505         }
506 
507         extern (D) void pop()( int execute )
508         {
509             pthread_t self       = pthread_self();
510             self.__cleanup_stack = cast(pthread_handler_rec*) buffer.__next;
511             if ( execute )
512             {
513                 buffer.__routine( buffer.__arg );
514             }
515         }
516     }
517 }
518 else version (FreeBSD)
519 {
520     struct _pthread_cleanup_info
521     {
522         uintptr_t[8]    pthread_cleanup_pad;
523     }
524 
525     struct pthread_cleanup
526     {
527         _pthread_cleanup_info __cleanup_info__ = void;
528 
529         extern (D) void push(F: _pthread_cleanup_routine)(F cleanup_routine, void* cleanup_arg )
530         {
531             __pthread_cleanup_push_imp( cleanup_routine, cleanup_arg, &__cleanup_info__ );
532         }
533 
534         extern (D) void pop()( int execute )
535         {
536             __pthread_cleanup_pop_imp( execute );
537         }
538     }
539 
540     void __pthread_cleanup_push_imp(_pthread_cleanup_routine, void*, _pthread_cleanup_info*);
541     void __pthread_cleanup_push_imp(_pthread_cleanup_routine_nogc, void*, _pthread_cleanup_info*) @nogc;
542     void __pthread_cleanup_pop_imp(int);
543 }
544 else version (DragonFlyBSD)
545 {
546     struct _pthread_cleanup_info
547     {
548         uintptr_t[8]    pthread_cleanup_pad;
549     }
550 
551     struct pthread_cleanup
552     {
553         _pthread_cleanup_info __cleanup_info__ = void;
554 
555         extern (D) void push()( _pthread_cleanup_routine cleanup_routine, void* cleanup_arg )
556         {
557             _pthread_cleanup_push( cleanup_routine, cleanup_arg, &__cleanup_info__ );
558         }
559 
560         extern (D) void pop()( int execute )
561         {
562             _pthread_cleanup_pop( execute );
563         }
564     }
565 
566     void _pthread_cleanup_push(_pthread_cleanup_routine, void*, _pthread_cleanup_info*);
567     void _pthread_cleanup_pop(int);
568 }
569 else version (NetBSD)
570 {
571     struct _pthread_cleanup_store
572     {
573         void*[4]    pthread_cleanup_pad;
574     }
575 
576     struct pthread_cleanup
577     {
578         _pthread_cleanup_store __cleanup_info__ = void;
579 
580         extern (D) void push()( _pthread_cleanup_routine cleanup_routine, void* cleanup_arg )
581         {
582             pthread__cleanup_push( cleanup_routine, cleanup_arg, &__cleanup_info__ );
583         }
584 
585         extern (D) void pop()( int execute )
586         {
587             pthread__cleanup_pop( execute, &__cleanup_info__ );
588         }
589     }
590 
591     void pthread__cleanup_push(_pthread_cleanup_routine, void*, void*);
592     void pthread__cleanup_pop(int, void *);
593 }
594 else version (OpenBSD)
595 {
596     void pthread_cleanup_push(void function(void*), void*);
597     void pthread_cleanup_pop(int);
598 }
599 else version (Solaris)
600 {
601     caddr_t _getfp();
602 
603     struct _pthread_cleanup_info
604     {
605         uintptr_t[4] pthread_cleanup_pad;
606     }
607 
608     struct pthread_cleanup
609     {
610         _pthread_cleanup_info __cleanup_info__ = void;
611 
612         extern (D) void push(F: _pthread_cleanup_routine)(F cleanup_routine, void* cleanup_arg)
613         {
614             __pthread_cleanup_push(cleanup_routine, cleanup_arg, _getfp(), &__cleanup_info__);
615         }
616 
617         extern (D) void pop()(int execute)
618         {
619             __pthread_cleanup_pop(execute, &__cleanup_info__);
620         }
621     }
622 
623     void __pthread_cleanup_push(_pthread_cleanup_routine, void*, caddr_t, _pthread_cleanup_info*);
624     void __pthread_cleanup_push(_pthread_cleanup_routine_nogc, void*, caddr_t, _pthread_cleanup_info*) @nogc;
625     void __pthread_cleanup_pop(int, _pthread_cleanup_info*);
626 }
627 else version (CRuntime_Bionic)
628 {
629     struct __pthread_cleanup_t
630     {
631         __pthread_cleanup_t*     __cleanup_prev;
632         _pthread_cleanup_routine __cleanup_routine;
633         void*                    __cleanup_arg;
634     }
635 
636     void __pthread_cleanup_push(__pthread_cleanup_t*, _pthread_cleanup_routine, void*);
637     void __pthread_cleanup_push(__pthread_cleanup_t*, _pthread_cleanup_routine_nogc, void*) @nogc;
638     void __pthread_cleanup_pop(__pthread_cleanup_t*, int);
639 
640     struct pthread_cleanup
641     {
642         __pthread_cleanup_t __cleanup = void;
643 
644         extern (D) void push(F: _pthread_cleanup_routine)(F routine, void* arg )
645         {
646             __pthread_cleanup_push( &__cleanup, routine, arg );
647         }
648 
649         extern (D) void pop()( int execute )
650         {
651             __pthread_cleanup_pop( &__cleanup, execute );
652         }
653     }
654 }
655 else version (CRuntime_Musl)
656 {
657     struct __ptcb {
658         _pthread_cleanup_routine f;
659         void* __x;
660         __ptcb* __next;
661     }
662     void _pthread_cleanup_push(__ptcb*, _pthread_cleanup_routine, void*);
663     void _pthread_cleanup_pop(__ptcb*, int);
664 
665     struct pthread_cleanup
666     {
667         __ptcb __cleanup = void;
668 
669         extern (D) void push(F: _pthread_cleanup_routine)(F routine, void* arg )
670         {
671             _pthread_cleanup_push( &__cleanup, routine, arg );
672         }
673 
674         extern (D) void pop()( int execute )
675         {
676             _pthread_cleanup_pop( &__cleanup, execute );
677         }
678     }
679 }
680 else version (CRuntime_UClibc)
681 {
682     struct _pthread_cleanup_buffer
683     {
684         _pthread_cleanup_routine    __routine;
685         void*                       __arg;
686         int                         __canceltype;
687         _pthread_cleanup_buffer*    __prev;
688     }
689 
690     void _pthread_cleanup_push(_pthread_cleanup_buffer*, _pthread_cleanup_routine, void*);
691     void _pthread_cleanup_push(_pthread_cleanup_buffer*, _pthread_cleanup_routine_nogc, void*) @nogc;
692     void _pthread_cleanup_pop(_pthread_cleanup_buffer*, int);
693 
694     struct pthread_cleanup
695     {
696         _pthread_cleanup_buffer buffer = void;
697 
698         extern (D) void push(F: _pthread_cleanup_routine)(F routine, void* arg )
699         {
700             _pthread_cleanup_push( &buffer, routine, arg );
701         }
702 
703         extern (D) void pop()( int execute )
704         {
705             _pthread_cleanup_pop( &buffer, execute );
706         }
707     }
708 }
709 else
710 {
711     static assert(false, "Unsupported platform");
712 }
713 
714 @nogc:
715 
716 int pthread_cond_broadcast(pthread_cond_t*);
717 int pthread_cond_destroy(pthread_cond_t*);
718 int pthread_cond_init(const scope pthread_cond_t*, pthread_condattr_t*) @trusted;
719 int pthread_cond_signal(pthread_cond_t*);
720 int pthread_cond_timedwait(pthread_cond_t*, pthread_mutex_t*, const scope timespec*);
721 int pthread_cond_wait(pthread_cond_t*, pthread_mutex_t*);
722 int pthread_condattr_destroy(pthread_condattr_t*);
723 int pthread_condattr_init(pthread_condattr_t*);
724 int pthread_create(pthread_t*, const scope pthread_attr_t*, void* function(void*), void*);
725 int pthread_detach(pthread_t);
726 int pthread_equal(pthread_t, pthread_t);
727 void pthread_exit(void*);
728 void* pthread_getspecific(pthread_key_t);
729 int pthread_join(pthread_t, void**);
730 int pthread_key_create(pthread_key_t*, void function(void*));
731 int pthread_key_delete(pthread_key_t);
732 int pthread_mutex_destroy(pthread_mutex_t*);
733 int pthread_mutex_init(pthread_mutex_t*, pthread_mutexattr_t*) @trusted;
734 int pthread_mutex_lock(pthread_mutex_t*);
735 int pthread_mutex_lock(shared(pthread_mutex_t)*);
736 int pthread_mutex_trylock(pthread_mutex_t*);
737 int pthread_mutex_trylock(shared(pthread_mutex_t)*);
738 int pthread_mutex_unlock(pthread_mutex_t*);
739 int pthread_mutex_unlock(shared(pthread_mutex_t)*);
740 int pthread_mutexattr_destroy(pthread_mutexattr_t*);
741 int pthread_mutexattr_init(pthread_mutexattr_t*) @trusted;
742 int pthread_once(pthread_once_t*, void function());
743 int pthread_rwlock_destroy(pthread_rwlock_t*);
744 int pthread_rwlock_init(pthread_rwlock_t*, const scope pthread_rwlockattr_t*);
745 int pthread_rwlock_rdlock(pthread_rwlock_t*);
746 int pthread_rwlock_tryrdlock(pthread_rwlock_t*);
747 int pthread_rwlock_trywrlock(pthread_rwlock_t*);
748 int pthread_rwlock_unlock(pthread_rwlock_t*);
749 int pthread_rwlock_wrlock(pthread_rwlock_t*);
750 int pthread_rwlockattr_destroy(pthread_rwlockattr_t*);
751 int pthread_rwlockattr_init(pthread_rwlockattr_t*);
752 pthread_t pthread_self();
753 int pthread_setcancelstate(int, int*);
754 int pthread_setcanceltype(int, int*);
755 int pthread_setspecific(pthread_key_t, const scope void*);
756 void pthread_testcancel();
757 
758 //
759 // Barrier (BAR)
760 //
761 /*
762 PTHREAD_BARRIER_SERIAL_THREAD
763 
764 int pthread_barrier_destroy(pthread_barrier_t*);
765 int pthread_barrier_init(pthread_barrier_t*, const scope pthread_barrierattr_t*, uint);
766 int pthread_barrier_wait(pthread_barrier_t*);
767 int pthread_barrierattr_destroy(pthread_barrierattr_t*);
768 int pthread_barrierattr_getpshared(const scope pthread_barrierattr_t*, int*); (BAR|TSH)
769 int pthread_barrierattr_init(pthread_barrierattr_t*);
770 int pthread_barrierattr_setpshared(pthread_barrierattr_t*, int); (BAR|TSH)
771 */
772 
773 version (CRuntime_Glibc)
774 {
775     enum PTHREAD_BARRIER_SERIAL_THREAD = -1;
776 
777     int pthread_barrier_destroy(pthread_barrier_t*);
778     int pthread_barrier_init(pthread_barrier_t*, const scope pthread_barrierattr_t*, uint);
779     int pthread_barrier_wait(pthread_barrier_t*);
780     int pthread_barrierattr_destroy(pthread_barrierattr_t*);
781     int pthread_barrierattr_getpshared(const scope pthread_barrierattr_t*, int*);
782     int pthread_barrierattr_init(pthread_barrierattr_t*);
783     int pthread_barrierattr_setpshared(pthread_barrierattr_t*, int);
784 }
785 else version (FreeBSD)
786 {
787     enum PTHREAD_BARRIER_SERIAL_THREAD = -1;
788 
789     int pthread_barrier_destroy(pthread_barrier_t*);
790     int pthread_barrier_init(pthread_barrier_t*, const scope pthread_barrierattr_t*, uint);
791     int pthread_barrier_wait(pthread_barrier_t*);
792     int pthread_barrierattr_destroy(pthread_barrierattr_t*);
793     int pthread_barrierattr_getpshared(const scope pthread_barrierattr_t*, int*);
794     int pthread_barrierattr_init(pthread_barrierattr_t*);
795     int pthread_barrierattr_setpshared(pthread_barrierattr_t*, int);
796 }
797 else version (DragonFlyBSD)
798 {
799     enum PTHREAD_BARRIER_SERIAL_THREAD = -1;
800     enum PTHREAD_KEYS_MAX              = 256;
801     enum PTHREAD_STACK_MIN             = 16384;
802     enum PTHREAD_THREADS_MAX           = c_ulong.max;
803 
804     int pthread_barrier_destroy(pthread_barrier_t*);
805     int pthread_barrier_init(pthread_barrier_t*, const scope pthread_barrierattr_t*, uint);
806     int pthread_barrier_wait(pthread_barrier_t*);
807     int pthread_barrierattr_destroy(pthread_barrierattr_t*);
808     int pthread_barrierattr_getpshared(const scope pthread_barrierattr_t*, int*);
809     int pthread_barrierattr_init(pthread_barrierattr_t*);
810     int pthread_barrierattr_setpshared(pthread_barrierattr_t*, int);
811 }
812 else version (NetBSD)
813 {
814     enum PTHREAD_BARRIER_SERIAL_THREAD = 1234567;
815 
816     int pthread_barrier_destroy(pthread_barrier_t*);
817     int pthread_barrier_init(pthread_barrier_t*, const scope pthread_barrierattr_t*, uint);
818     int pthread_barrier_wait(pthread_barrier_t*);
819     int pthread_barrierattr_destroy(pthread_barrierattr_t*);
820     int pthread_barrierattr_getpshared(const scope pthread_barrierattr_t*, int*);
821     int pthread_barrierattr_init(pthread_barrierattr_t*);
822     int pthread_barrierattr_setpshared(pthread_barrierattr_t*, int);
823 }
824 else version (OpenBSD)
825 {
826     enum PTHREAD_BARRIER_SERIAL_THREAD = -1;
827 
828     int pthread_barrier_destroy(pthread_barrier_t*);
829     int pthread_barrier_init(pthread_barrier_t*, const scope pthread_barrierattr_t*, uint);
830     int pthread_barrier_wait(pthread_barrier_t*);
831     int pthread_barrierattr_destroy(pthread_barrierattr_t*);
832     int pthread_barrierattr_getpshared(const scope pthread_barrierattr_t*, int*);
833     int pthread_barrierattr_init(pthread_barrierattr_t*);
834     int pthread_barrierattr_setpshared(pthread_barrierattr_t*, int);
835 }
836 else version (Darwin)
837 {
838 }
839 else version (Solaris)
840 {
841     enum PTHREAD_BARRIER_SERIAL_THREAD = -2;
842 
843     int pthread_barrier_destroy(pthread_barrier_t*);
844     int pthread_barrier_init(pthread_barrier_t*, const scope pthread_barrierattr_t*, uint);
845     int pthread_barrier_wait(pthread_barrier_t*);
846     int pthread_barrierattr_destroy(pthread_barrierattr_t*);
847     int pthread_barrierattr_getpshared(const scope pthread_barrierattr_t*, int*);
848     int pthread_barrierattr_init(pthread_barrierattr_t*);
849     int pthread_barrierattr_setpshared(pthread_barrierattr_t*, int);
850 }
851 else version (CRuntime_Bionic)
852 {
853 }
854 else version (CRuntime_Musl)
855 {
856     enum PTHREAD_BARRIER_SERIAL_THREAD = -1;
857 
858     int pthread_barrier_destroy(pthread_barrier_t*);
859     int pthread_barrier_init(pthread_barrier_t*, const scope pthread_barrierattr_t*, uint);
860     int pthread_barrier_wait(pthread_barrier_t*);
861     int pthread_barrierattr_destroy(pthread_barrierattr_t*);
862     int pthread_barrierattr_getpshared(const scope pthread_barrierattr_t*, int*);
863     int pthread_barrierattr_init(pthread_barrierattr_t*);
864     int pthread_barrierattr_setpshared(pthread_barrierattr_t*, int);
865 }
866 else version (CRuntime_UClibc)
867 {
868     enum PTHREAD_BARRIER_SERIAL_THREAD = -1;
869 
870     int pthread_barrier_destroy(pthread_barrier_t*);
871     int pthread_barrier_init(pthread_barrier_t*, const scope pthread_barrierattr_t*, uint);
872     int pthread_barrier_wait(pthread_barrier_t*);
873     int pthread_barrierattr_destroy(pthread_barrierattr_t*);
874     int pthread_barrierattr_getpshared(const scope pthread_barrierattr_t*, int*);
875     int pthread_barrierattr_init(pthread_barrierattr_t*);
876     int pthread_barrierattr_setpshared(pthread_barrierattr_t*, int);
877 }
878 else
879 {
880     static assert(false, "Unsupported platform");
881 }
882 
883 //
884 // Clock (CS)
885 //
886 /*
887 int pthread_condattr_getclock(const scope pthread_condattr_t*, clockid_t*);
888 int pthread_condattr_setclock(pthread_condattr_t*, clockid_t);
889 */
890 version (CRuntime_Glibc)
891 {
892     int pthread_condattr_getclock(const scope pthread_condattr_t*, clockid_t*);
893     int pthread_condattr_setclock(pthread_condattr_t*, clockid_t);
894 }
895 else version (FreeBSD)
896 {
897     int pthread_condattr_getclock(const scope pthread_condattr_t*, clockid_t*);
898     int pthread_condattr_setclock(pthread_condattr_t*, clockid_t);
899 }
900 else version (DragonFlyBSD)
901 {
902     int pthread_condattr_getclock(const scope pthread_condattr_t*, clockid_t*);
903     int pthread_condattr_setclock(pthread_condattr_t*, clockid_t);
904 }
905 else version (NetBSD)
906 {
907     int pthread_condattr_setclock(pthread_condattr_t*, clockid_t);
908 }
909 else version (OpenBSD)
910 {
911     int pthread_condattr_getclock(const scope pthread_condattr_t*, clockid_t*);
912     int pthread_condattr_setclock(pthread_condattr_t*, clockid_t);
913 }
914 else version (Darwin)
915 {
916 }
917 else version (Solaris)
918 {
919     int pthread_condattr_getclock(const scope pthread_condattr_t*, clockid_t*);
920     int pthread_condattr_setclock(pthread_condattr_t*, clockid_t);
921 }
922 else version (CRuntime_Bionic)
923 {
924 }
925 else version (CRuntime_Musl)
926 {
927     int pthread_condattr_getclock(const scope pthread_condattr_t*, clockid_t*);
928     int pthread_condattr_setclock(pthread_condattr_t*, clockid_t);
929 }
930 else version (CRuntime_UClibc)
931 {
932     int pthread_condattr_getclock(const scope pthread_condattr_t*, clockid_t*);
933     int pthread_condattr_setclock(pthread_condattr_t*, clockid_t);
934 }
935 else
936 {
937     static assert(false, "Unsupported platform");
938 }
939 
940 //
941 // Spinlock (SPI)
942 //
943 /*
944 int pthread_spin_destroy(pthread_spinlock_t*);
945 int pthread_spin_init(pthread_spinlock_t*, int);
946 int pthread_spin_lock(pthread_spinlock_t*);
947 int pthread_spin_trylock(pthread_spinlock_t*);
948 int pthread_spin_unlock(pthread_spinlock_t*);
949 */
950 
951 version (CRuntime_Glibc)
952 {
953     int pthread_spin_destroy(pthread_spinlock_t*);
954     int pthread_spin_init(pthread_spinlock_t*, int);
955     int pthread_spin_lock(pthread_spinlock_t*);
956     int pthread_spin_trylock(pthread_spinlock_t*);
957     int pthread_spin_unlock(pthread_spinlock_t*);
958 }
959 else version (FreeBSD)
960 {
961     int pthread_spin_init(pthread_spinlock_t*, int);
962     int pthread_spin_destroy(pthread_spinlock_t*);
963     int pthread_spin_lock(pthread_spinlock_t*);
964     int pthread_spin_trylock(pthread_spinlock_t*);
965     int pthread_spin_unlock(pthread_spinlock_t*);
966 }
967 else version (DragonFlyBSD)
968 {
969     int pthread_spin_init(pthread_spinlock_t*, int);
970     int pthread_spin_destroy(pthread_spinlock_t*);
971     int pthread_spin_lock(pthread_spinlock_t*);
972     int pthread_spin_trylock(pthread_spinlock_t*);
973     int pthread_spin_unlock(pthread_spinlock_t*);
974 }
975 else version (NetBSD)
976 {
977     int pthread_spin_init(pthread_spinlock_t*, int);
978     int pthread_spin_destroy(pthread_spinlock_t*);
979     int pthread_spin_lock(pthread_spinlock_t*);
980     int pthread_spin_trylock(pthread_spinlock_t*);
981     int pthread_spin_unlock(pthread_spinlock_t*);
982 }
983 else version (OpenBSD)
984 {
985     int pthread_spin_init(pthread_spinlock_t*, int);
986     int pthread_spin_destroy(pthread_spinlock_t*);
987     int pthread_spin_lock(pthread_spinlock_t*);
988     int pthread_spin_trylock(pthread_spinlock_t*);
989     int pthread_spin_unlock(pthread_spinlock_t*);
990 }
991 else version (Darwin)
992 {
993 }
994 else version (Solaris)
995 {
996     int pthread_spin_init(pthread_spinlock_t*, int);
997     int pthread_spin_destroy(pthread_spinlock_t*);
998     int pthread_spin_lock(pthread_spinlock_t*);
999     int pthread_spin_trylock(pthread_spinlock_t*);
1000     int pthread_spin_unlock(pthread_spinlock_t*);
1001 }
1002 else version (CRuntime_Bionic)
1003 {
1004 }
1005 else version (CRuntime_Musl)
1006 {
1007     int pthread_spin_destroy(pthread_spinlock_t*);
1008     int pthread_spin_init(pthread_spinlock_t*, int);
1009     int pthread_spin_lock(pthread_spinlock_t*);
1010     int pthread_spin_trylock(pthread_spinlock_t*);
1011     int pthread_spin_unlock(pthread_spinlock_t*);
1012 }
1013 else version (CRuntime_UClibc)
1014 {
1015     int pthread_spin_destroy(pthread_spinlock_t*);
1016     int pthread_spin_init(pthread_spinlock_t*, int);
1017     int pthread_spin_lock(pthread_spinlock_t*);
1018     int pthread_spin_trylock(pthread_spinlock_t*);
1019     int pthread_spin_unlock(pthread_spinlock_t*);
1020 }
1021 else
1022 {
1023     static assert(false, "Unsupported platform");
1024 }
1025 
1026 //
1027 // XOpen (XSI)
1028 //
1029 /*
1030 PTHREAD_MUTEX_DEFAULT
1031 PTHREAD_MUTEX_ERRORCHECK
1032 PTHREAD_MUTEX_NORMAL
1033 PTHREAD_MUTEX_RECURSIVE
1034 
1035 int pthread_attr_getguardsize(const scope pthread_attr_t*, size_t*);
1036 int pthread_attr_setguardsize(pthread_attr_t*, size_t);
1037 int pthread_getconcurrency();
1038 int pthread_mutexattr_gettype(const scope pthread_mutexattr_t*, int*);
1039 int pthread_mutexattr_settype(pthread_mutexattr_t*, int);
1040 int pthread_setconcurrency(int);
1041 */
1042 
1043 version (CRuntime_Glibc)
1044 {
1045     enum PTHREAD_MUTEX_NORMAL       = 0;
1046     enum PTHREAD_MUTEX_RECURSIVE    = 1;
1047     enum PTHREAD_MUTEX_ERRORCHECK   = 2;
1048     enum PTHREAD_MUTEX_DEFAULT      = PTHREAD_MUTEX_NORMAL;
1049 
1050     int pthread_attr_getguardsize(const scope pthread_attr_t*, size_t*);
1051     int pthread_attr_setguardsize(pthread_attr_t*, size_t);
1052     int pthread_getconcurrency();
1053     int pthread_mutexattr_gettype(const scope pthread_mutexattr_t*, int*);
1054     int pthread_mutexattr_settype(pthread_mutexattr_t*, int) @trusted;
1055     int pthread_setconcurrency(int);
1056 }
1057 else version (Darwin)
1058 {
1059     enum PTHREAD_MUTEX_NORMAL       = 0;
1060     enum PTHREAD_MUTEX_ERRORCHECK   = 1;
1061     enum PTHREAD_MUTEX_RECURSIVE    = 2;
1062     enum PTHREAD_MUTEX_DEFAULT      = PTHREAD_MUTEX_NORMAL;
1063 
1064     int pthread_attr_getguardsize(const scope pthread_attr_t*, size_t*);
1065     int pthread_attr_setguardsize(pthread_attr_t*, size_t);
1066     int pthread_getconcurrency();
1067     int pthread_mutexattr_gettype(const scope pthread_mutexattr_t*, int*);
1068     int pthread_mutexattr_settype(pthread_mutexattr_t*, int) @trusted;
1069     int pthread_setconcurrency(int);
1070 }
1071 else version (FreeBSD)
1072 {
1073     enum
1074     {
1075         PTHREAD_MUTEX_ERRORCHECK    = 1,
1076         PTHREAD_MUTEX_RECURSIVE     = 2,
1077         PTHREAD_MUTEX_NORMAL        = 3,
1078         PTHREAD_MUTEX_ADAPTIVE_NP   = 4,
1079         PTHREAD_MUTEX_TYPE_MAX
1080     }
1081     enum PTHREAD_MUTEX_DEFAULT = PTHREAD_MUTEX_ERRORCHECK;
1082 
1083     int pthread_attr_getguardsize(const scope pthread_attr_t*, size_t*);
1084     int pthread_attr_setguardsize(pthread_attr_t*, size_t);
1085     int pthread_getconcurrency();
1086     int pthread_mutexattr_gettype(pthread_mutexattr_t*, int*);
1087     int pthread_mutexattr_settype(pthread_mutexattr_t*, int) @trusted;
1088     int pthread_setconcurrency(int);
1089 }
1090 else version (NetBSD)
1091 {
1092     enum
1093     {
1094         PTHREAD_MUTEX_NORMAL        = 0,
1095         PTHREAD_MUTEX_ERRORCHECK    = 1,
1096         PTHREAD_MUTEX_RECURSIVE     = 2,
1097         PTHREAD_MUTEX_TYPE_MAX
1098     }
1099     enum PTHREAD_MUTEX_DEFAULT = PTHREAD_MUTEX_ERRORCHECK;
1100 
1101     int pthread_attr_getguardsize(const scope pthread_attr_t*, size_t*);
1102     int pthread_attr_setguardsize(pthread_attr_t*, size_t);
1103     int pthread_getconcurrency();
1104     int pthread_mutexattr_gettype(pthread_mutexattr_t*, int*);
1105     int pthread_mutexattr_settype(pthread_mutexattr_t*, int) @trusted;
1106     int pthread_setconcurrency(int);
1107 }
1108 else version (OpenBSD)
1109 {
1110     enum
1111     {
1112         PTHREAD_MUTEX_ERRORCHECK    = 1,
1113         PTHREAD_MUTEX_RECURSIVE     = 2,
1114         PTHREAD_MUTEX_NORMAL        = 3,
1115         PTHREAD_MUTEX_ADAPTIVE_NP   = 4,
1116         PTHREAD_MUTEX_TYPE_MAX
1117     }
1118     enum PTHREAD_MUTEX_DEFAULT = PTHREAD_MUTEX_ERRORCHECK;
1119 
1120     int pthread_attr_getguardsize(const scope pthread_attr_t*, size_t*);
1121     int pthread_attr_setguardsize(pthread_attr_t*, size_t);
1122     int pthread_getconcurrency();
1123     int pthread_mutexattr_gettype(pthread_mutexattr_t*, int*);
1124     int pthread_mutexattr_settype(pthread_mutexattr_t*, int) @trusted;
1125     int pthread_setconcurrency(int);
1126 }
1127 else version (DragonFlyBSD)
1128 {
1129     enum
1130     {
1131         PTHREAD_MUTEX_ERRORCHECK    = 1,
1132         PTHREAD_MUTEX_RECURSIVE     = 2,
1133         PTHREAD_MUTEX_NORMAL        = 3,
1134         PTHREAD_MUTEX_TYPE_MAX
1135     }
1136     enum PTHREAD_MUTEX_DEFAULT = PTHREAD_MUTEX_ERRORCHECK;
1137 
1138     int pthread_attr_getguardsize(const scope pthread_attr_t*, size_t*);
1139     int pthread_attr_setguardsize(pthread_attr_t*, size_t);
1140     int pthread_getconcurrency();
1141     int pthread_mutexattr_gettype(pthread_mutexattr_t*, int*);
1142     int pthread_mutexattr_settype(pthread_mutexattr_t*, int) @trusted;
1143     int pthread_setconcurrency(int);
1144 }
1145 else version (Solaris)
1146 {
1147     enum
1148     {
1149         PTHREAD_MUTEX_ERRORCHECK    = 2,
1150         PTHREAD_MUTEX_RECURSIVE     = 4,
1151         PTHREAD_MUTEX_NORMAL        = 0,
1152     }
1153 
1154     enum PTHREAD_MUTEX_DEFAULT = PTHREAD_MUTEX_NORMAL;
1155 
1156     int pthread_attr_getguardsize(const scope pthread_attr_t*, size_t*);
1157     int pthread_attr_setguardsize(pthread_attr_t*, size_t);
1158     int pthread_getconcurrency();
1159     int pthread_mutexattr_gettype(pthread_mutexattr_t*, int*);
1160     int pthread_mutexattr_settype(pthread_mutexattr_t*, int) @trusted;
1161     int pthread_setconcurrency(int);
1162 }
1163 else version (CRuntime_Bionic)
1164 {
1165     enum PTHREAD_MUTEX_NORMAL     = 0;
1166     enum PTHREAD_MUTEX_RECURSIVE  = 1;
1167     enum PTHREAD_MUTEX_ERRORCHECK = 2;
1168     enum PTHREAD_MUTEX_DEFAULT    = PTHREAD_MUTEX_NORMAL;
1169 
1170     int pthread_attr_getguardsize(const scope pthread_attr_t*, size_t*);
1171     int pthread_attr_setguardsize(pthread_attr_t*, size_t);
1172     int pthread_mutexattr_gettype(const scope pthread_mutexattr_t*, int*);
1173     int pthread_mutexattr_settype(pthread_mutexattr_t*, int) @trusted;
1174 }
1175 else version (CRuntime_Musl)
1176 {
1177     enum {
1178         PTHREAD_MUTEX_NORMAL      = 0,
1179         PTHREAD_MUTEX_RECURSIVE   = 1,
1180         PTHREAD_MUTEX_ERRORCHECK  = 2,
1181         PTHREAD_MUTEX_DEFAULT     = PTHREAD_MUTEX_NORMAL,
1182     }
1183     int pthread_mutexattr_settype(pthread_mutexattr_t*, int) @trusted;
1184 }
1185 else version (CRuntime_UClibc)
1186 {
1187     enum
1188     {
1189       PTHREAD_MUTEX_TIMED_NP,
1190       PTHREAD_MUTEX_RECURSIVE_NP,
1191       PTHREAD_MUTEX_ERRORCHECK_NP,
1192       PTHREAD_MUTEX_ADAPTIVE_NP,
1193       PTHREAD_MUTEX_NORMAL = PTHREAD_MUTEX_TIMED_NP,
1194       PTHREAD_MUTEX_RECURSIVE = PTHREAD_MUTEX_RECURSIVE_NP,
1195       PTHREAD_MUTEX_ERRORCHECK = PTHREAD_MUTEX_ERRORCHECK_NP,
1196       PTHREAD_MUTEX_DEFAULT = PTHREAD_MUTEX_NORMAL,
1197       PTHREAD_MUTEX_FAST_NP = PTHREAD_MUTEX_TIMED_NP
1198     }
1199 
1200     int pthread_attr_getguardsize(const scope pthread_attr_t*, size_t*);
1201     int pthread_attr_setguardsize(pthread_attr_t*, size_t);
1202     int pthread_getconcurrency();
1203     int pthread_mutexattr_gettype(const scope pthread_mutexattr_t*, int*);
1204     int pthread_mutexattr_settype(pthread_mutexattr_t*, int) @trusted;
1205     int pthread_setconcurrency(int);
1206 }
1207 else
1208 {
1209     static assert(false, "Unsupported platform");
1210 }
1211 
1212 //
1213 // CPU Time (TCT)
1214 //
1215 /*
1216 int pthread_getcpuclockid(pthread_t, clockid_t*);
1217 */
1218 
1219 version (CRuntime_Glibc)
1220 {
1221     int pthread_getcpuclockid(pthread_t, clockid_t*);
1222 }
1223 else version (FreeBSD)
1224 {
1225     int pthread_getcpuclockid(pthread_t, clockid_t*);
1226 }
1227 else version (DragonFlyBSD)
1228 {
1229     int pthread_getcpuclockid(pthread_t, clockid_t*);
1230 }
1231 else version (NetBSD)
1232 {
1233 }
1234 else version (OpenBSD)
1235 {
1236     int pthread_getcpuclockid(pthread_t, clockid_t*);
1237 }
1238 else version (Darwin)
1239 {
1240 }
1241 else version (Solaris)
1242 {
1243 }
1244 else version (CRuntime_Bionic)
1245 {
1246     int pthread_getcpuclockid(pthread_t, clockid_t*);
1247 }
1248 else version (CRuntime_Musl)
1249 {
1250     int pthread_getcpuclockid(pthread_t, clockid_t*);
1251 }
1252 else version (CRuntime_UClibc)
1253 {
1254     int pthread_getcpuclockid(pthread_t, clockid_t*);
1255 }
1256 else
1257 {
1258     static assert(false, "Unsupported platform");
1259 }
1260 
1261 //
1262 // Timeouts (TMO)
1263 //
1264 /*
1265 int pthread_mutex_timedlock(pthread_mutex_t*, const scope timespec*);
1266 int pthread_rwlock_timedrdlock(pthread_rwlock_t*, const scope timespec*);
1267 int pthread_rwlock_timedwrlock(pthread_rwlock_t*, const scope timespec*);
1268 */
1269 
1270 version (CRuntime_Glibc)
1271 {
1272     int pthread_mutex_timedlock(pthread_mutex_t*, const scope timespec*);
1273     int pthread_rwlock_timedrdlock(pthread_rwlock_t*, const scope timespec*);
1274     int pthread_rwlock_timedwrlock(pthread_rwlock_t*, const scope timespec*);
1275 }
1276 else version (Darwin)
1277 {
1278     int pthread_mutex_timedlock(pthread_mutex_t*, const scope timespec*);
1279     int pthread_rwlock_timedrdlock(pthread_rwlock_t*, const scope timespec*);
1280     int pthread_rwlock_timedwrlock(pthread_rwlock_t*, const scope timespec*);
1281 }
1282 else version (FreeBSD)
1283 {
1284     int pthread_mutex_timedlock(pthread_mutex_t*, const scope timespec*);
1285     int pthread_rwlock_timedrdlock(pthread_rwlock_t*, const scope timespec*);
1286     int pthread_rwlock_timedwrlock(pthread_rwlock_t*, const scope timespec*);
1287 }
1288 else version (NetBSD)
1289 {
1290     int pthread_mutex_timedlock(pthread_mutex_t*, const scope timespec*);
1291     int pthread_rwlock_timedrdlock(pthread_rwlock_t*, const scope timespec*);
1292     int pthread_rwlock_timedwrlock(pthread_rwlock_t*, const scope timespec*);
1293 }
1294 else version (OpenBSD)
1295 {
1296     int pthread_mutex_timedlock(pthread_mutex_t*, const scope timespec*);
1297     int pthread_rwlock_timedrdlock(pthread_rwlock_t*, const scope timespec*);
1298     int pthread_rwlock_timedwrlock(pthread_rwlock_t*, const scope timespec*);
1299 }
1300 else version (DragonFlyBSD)
1301 {
1302     int pthread_mutex_timedlock(pthread_mutex_t*, const scope timespec*);
1303     int pthread_rwlock_timedrdlock(pthread_rwlock_t*, const scope timespec*);
1304     int pthread_rwlock_timedwrlock(pthread_rwlock_t*, const scope timespec*);
1305 }
1306 else version (Solaris)
1307 {
1308     int pthread_mutex_timedlock(pthread_mutex_t*, const scope timespec*);
1309     int pthread_rwlock_timedrdlock(pthread_rwlock_t*, const scope timespec*);
1310     int pthread_rwlock_timedwrlock(pthread_rwlock_t*, const scope timespec*);
1311 }
1312 else version (CRuntime_Bionic)
1313 {
1314     int pthread_rwlock_timedrdlock(pthread_rwlock_t*, const scope timespec*);
1315     int pthread_rwlock_timedwrlock(pthread_rwlock_t*, const scope timespec*);
1316 }
1317 else version (CRuntime_Musl)
1318 {
1319     int pthread_mutex_timedlock(pthread_mutex_t*, const scope timespec*);
1320     int pthread_rwlock_timedrdlock(pthread_rwlock_t*, const scope timespec*);
1321     int pthread_rwlock_timedwrlock(pthread_rwlock_t*, const scope timespec*);
1322 }
1323 else version (CRuntime_UClibc)
1324 {
1325     int pthread_mutex_timedlock(pthread_mutex_t*, const scope timespec*);
1326     int pthread_rwlock_timedrdlock(pthread_rwlock_t*, const scope timespec*);
1327     int pthread_rwlock_timedwrlock(pthread_rwlock_t*, const scope timespec*);
1328 }
1329 else
1330 {
1331     static assert(false, "Unsupported platform");
1332 }
1333 
1334 //
1335 // Priority (TPI|TPP)
1336 //
1337 /*
1338 PTHREAD_PRIO_INHERIT (TPI)
1339 PTHREAD_PRIO_NONE (TPP|TPI)
1340 PTHREAD_PRIO_PROTECT (TPI)
1341 
1342 int pthread_mutex_getprioceiling(const scope pthread_mutex_t*, int*); (TPP)
1343 int pthread_mutex_setprioceiling(pthread_mutex_t*, int, int*); (TPP)
1344 int pthread_mutexattr_getprioceiling(pthread_mutexattr_t*, int*); (TPP)
1345 int pthread_mutexattr_getprotocol(const scope pthread_mutexattr_t*, int*); (TPI|TPP)
1346 int pthread_mutexattr_setprioceiling(pthread_mutexattr_t*, int); (TPP)
1347 int pthread_mutexattr_setprotocol(pthread_mutexattr_t*, int); (TPI|TPP)
1348 */
1349 version (Darwin)
1350 {
1351     enum
1352     {
1353         PTHREAD_PRIO_NONE,
1354         PTHREAD_PRIO_INHERIT,
1355         PTHREAD_PRIO_PROTECT
1356     }
1357 
1358     int pthread_mutex_getprioceiling(const scope pthread_mutex_t*, int*);
1359     int pthread_mutex_setprioceiling(pthread_mutex_t*, int, int*);
1360     int pthread_mutexattr_getprioceiling(const scope pthread_mutexattr_t*, int*);
1361     int pthread_mutexattr_getprotocol(const scope pthread_mutexattr_t*, int*);
1362     int pthread_mutexattr_setprioceiling(pthread_mutexattr_t*, int);
1363     int pthread_mutexattr_setprotocol(pthread_mutexattr_t*, int);
1364 }
1365 else version (Solaris)
1366 {
1367     enum
1368     {
1369         PTHREAD_PRIO_NONE    = 0x00,
1370         PTHREAD_PRIO_INHERIT = 0x10,
1371         PTHREAD_PRIO_PROTECT = 0x20,
1372     }
1373 
1374     int pthread_mutex_getprioceiling(const scope pthread_mutex_t*, int*);
1375     int pthread_mutex_setprioceiling(pthread_mutex_t*, int, int*);
1376     int pthread_mutexattr_getprioceiling(const scope pthread_mutexattr_t*, int*);
1377     int pthread_mutexattr_getprotocol(const scope pthread_mutexattr_t*, int*);
1378     int pthread_mutexattr_setprioceiling(pthread_mutexattr_t*, int);
1379     int pthread_mutexattr_setprotocol(pthread_mutexattr_t*, int);
1380 }
1381 
1382 //
1383 // Scheduling (TPS)
1384 //
1385 /*
1386 PTHREAD_SCOPE_PROCESS
1387 PTHREAD_SCOPE_SYSTEM
1388 
1389 int pthread_attr_getinheritsched(const scope pthread_attr_t*, int*);
1390 int pthread_attr_getschedpolicy(const scope pthread_attr_t*, int*);
1391 int pthread_attr_getscope(const scope pthread_attr_t*, int*);
1392 int pthread_attr_setinheritsched(pthread_attr_t*, int);
1393 int pthread_attr_setschedpolicy(pthread_attr_t*, int);
1394 int pthread_attr_setscope(pthread_attr_t*, int);
1395 int pthread_getschedparam(pthread_t, int*, sched_param*);
1396 int pthread_setschedparam(pthread_t, int, const scope sched_param*);
1397 int pthread_setschedprio(pthread_t, int);
1398 */
1399 
1400 version (CRuntime_Glibc)
1401 {
1402     enum
1403     {
1404         PTHREAD_SCOPE_SYSTEM,
1405         PTHREAD_SCOPE_PROCESS
1406     }
1407 
1408     int pthread_attr_getinheritsched(const scope pthread_attr_t*, int*);
1409     int pthread_attr_getschedpolicy(const scope pthread_attr_t*, int*);
1410     int pthread_attr_getscope(const scope pthread_attr_t*, int*);
1411     int pthread_attr_setinheritsched(pthread_attr_t*, int);
1412     int pthread_attr_setschedpolicy(pthread_attr_t*, int);
1413     int pthread_attr_setscope(pthread_attr_t*, int);
1414     int pthread_getschedparam(pthread_t, int*, sched_param*);
1415     int pthread_setschedparam(pthread_t, int, const scope sched_param*);
1416     int pthread_setschedprio(pthread_t, int);
1417 }
1418 else version (Darwin)
1419 {
1420     enum
1421     {
1422         PTHREAD_SCOPE_SYSTEM    = 1,
1423         PTHREAD_SCOPE_PROCESS   = 2
1424     }
1425 
1426     int pthread_attr_getinheritsched(const scope pthread_attr_t*, int*);
1427     int pthread_attr_getschedpolicy(const scope pthread_attr_t*, int*);
1428     int pthread_attr_getscope(const scope pthread_attr_t*, int*);
1429     int pthread_attr_setinheritsched(pthread_attr_t*, int);
1430     int pthread_attr_setschedpolicy(pthread_attr_t*, int);
1431     int pthread_attr_setscope(pthread_attr_t*, int);
1432     int pthread_getschedparam(pthread_t, int*, sched_param*);
1433     int pthread_setschedparam(pthread_t, int, const scope sched_param*);
1434     // int pthread_setschedprio(pthread_t, int); // not implemented
1435 }
1436 else version (FreeBSD)
1437 {
1438     enum
1439     {
1440         PTHREAD_SCOPE_PROCESS   = 0,
1441         PTHREAD_SCOPE_SYSTEM    = 0x2
1442     }
1443 
1444     int pthread_attr_getinheritsched(const scope pthread_attr_t*, int*);
1445     int pthread_attr_getschedpolicy(const scope pthread_attr_t*, int*);
1446     int pthread_attr_getscope(const scope pthread_attr_t*, int*);
1447     int pthread_attr_setinheritsched(pthread_attr_t*, int);
1448     int pthread_attr_setschedpolicy(pthread_attr_t*, int);
1449     int pthread_attr_setscope(const scope pthread_attr_t*, int);
1450     int pthread_getschedparam(pthread_t, int*, sched_param*);
1451     int pthread_setschedparam(pthread_t, int, sched_param*);
1452     // int pthread_setschedprio(pthread_t, int); // not implemented
1453 }
1454 else version (NetBSD)
1455 {
1456     enum
1457     {
1458         PTHREAD_SCOPE_PROCESS   = 0,
1459         PTHREAD_SCOPE_SYSTEM    = 0x1
1460     }
1461 
1462     int pthread_attr_getinheritsched(const scope pthread_attr_t*, int*);
1463     int pthread_attr_getschedpolicy(const scope pthread_attr_t*, int*);
1464     int pthread_attr_getscope(const scope pthread_attr_t*, int*);
1465     int pthread_attr_setinheritsched(pthread_attr_t*, int);
1466     int pthread_attr_setschedpolicy(pthread_attr_t*, int);
1467     int pthread_attr_setscope(const scope pthread_attr_t*, int);
1468     int pthread_getschedparam(pthread_t, int*, sched_param*);
1469     int pthread_setschedparam(pthread_t, int, sched_param*);
1470     //int pthread_setschedprio(pthread_t, int);
1471 }
1472 else version (OpenBSD)
1473 {
1474     enum
1475     {
1476         PTHREAD_SCOPE_PROCESS   = 0,
1477         PTHREAD_SCOPE_SYSTEM    = 0x2
1478     }
1479 
1480     int pthread_attr_getinheritsched(const scope pthread_attr_t*, int*);
1481     int pthread_attr_getschedpolicy(const scope pthread_attr_t*, int*);
1482     int pthread_attr_getscope(const scope pthread_attr_t*, int*);
1483     int pthread_attr_setinheritsched(pthread_attr_t*, int);
1484     int pthread_attr_setschedpolicy(pthread_attr_t*, int);
1485     int pthread_attr_setscope(const scope pthread_attr_t*, int);
1486     int pthread_getschedparam(pthread_t, int*, sched_param*);
1487     int pthread_setschedparam(pthread_t, int, sched_param*);
1488     // int pthread_setschedprio(pthread_t, int); // not implemented
1489 }
1490 else version (DragonFlyBSD)
1491 {
1492     enum
1493     {
1494         PTHREAD_SCOPE_PROCESS   = 0,
1495         PTHREAD_SCOPE_SYSTEM    = 0x2
1496     }
1497 
1498     int pthread_attr_getinheritsched(const scope pthread_attr_t*, int*);
1499     int pthread_attr_getschedpolicy(const scope pthread_attr_t*, int*);
1500     int pthread_attr_getscope(const scope pthread_attr_t*, int*);
1501     int pthread_attr_setinheritsched(pthread_attr_t*, int);
1502     int pthread_attr_setschedpolicy(pthread_attr_t*, int);
1503     int pthread_attr_setscope(const scope pthread_attr_t*, int);
1504     int pthread_getschedparam(pthread_t, int*, sched_param*);
1505     int pthread_setschedparam(pthread_t, int, sched_param*);
1506 }
1507 else version (Solaris)
1508 {
1509     enum
1510     {
1511         PTHREAD_SCOPE_PROCESS = 0,
1512         PTHREAD_SCOPE_SYSTEM = 1,
1513     }
1514 
1515     int pthread_attr_getinheritsched(const scope pthread_attr_t*, int*);
1516     int pthread_attr_getschedpolicy(const scope pthread_attr_t*, int*);
1517     int pthread_attr_getscope(const scope pthread_attr_t*, int*);
1518     int pthread_attr_setinheritsched(pthread_attr_t*, int);
1519     int pthread_attr_setschedpolicy(pthread_attr_t*, int);
1520     int pthread_attr_setscope(const scope pthread_attr_t*, int);
1521     int pthread_getschedparam(pthread_t, int*, sched_param*);
1522     int pthread_setschedparam(pthread_t, int, sched_param*);
1523     int pthread_setschedprio(pthread_t, int);
1524 }
1525 else version (CRuntime_Bionic)
1526 {
1527     enum
1528     {
1529         PTHREAD_SCOPE_SYSTEM,
1530         PTHREAD_SCOPE_PROCESS
1531     }
1532 
1533     int pthread_attr_getschedpolicy(const scope pthread_attr_t*, int*);
1534     int pthread_attr_getscope(const scope pthread_attr_t*);
1535     int pthread_attr_setschedpolicy(pthread_attr_t*, int);
1536     int pthread_attr_setscope(pthread_attr_t*, int);
1537     int pthread_getschedparam(pthread_t, int*, sched_param*);
1538     int pthread_setschedparam(pthread_t, int, const scope sched_param*);
1539 }
1540 else version (CRuntime_Musl)
1541 {
1542     enum
1543     {
1544         PTHREAD_SCOPE_SYSTEM,
1545         PTHREAD_SCOPE_PROCESS
1546     }
1547 
1548     int pthread_getschedparam(pthread_t, int*, sched_param*);
1549     int pthread_setschedparam(pthread_t, int, const scope sched_param*);
1550     int pthread_setschedprio(pthread_t, int);
1551 }
1552 else version (CRuntime_UClibc)
1553 {
1554     enum
1555     {
1556         PTHREAD_SCOPE_SYSTEM,
1557         PTHREAD_SCOPE_PROCESS
1558     }
1559 
1560     int pthread_attr_getinheritsched(const scope pthread_attr_t*, int*);
1561     int pthread_attr_getschedpolicy(const scope pthread_attr_t*, int*);
1562     int pthread_attr_getscope(const scope pthread_attr_t*, int*);
1563     int pthread_attr_setinheritsched(pthread_attr_t*, int);
1564     int pthread_attr_setschedpolicy(pthread_attr_t*, int);
1565     int pthread_attr_setscope(pthread_attr_t*, int);
1566     int pthread_getschedparam(pthread_t, int*, sched_param*);
1567     int pthread_setschedparam(pthread_t, int, const scope sched_param*);
1568     int pthread_setschedprio(pthread_t, int);
1569 }
1570 else
1571 {
1572     static assert(false, "Unsupported platform");
1573 }
1574 
1575 //
1576 // Stack (TSA|TSS)
1577 //
1578 /*
1579 int pthread_attr_getstack(const scope pthread_attr_t*, void**, size_t*); (TSA|TSS)
1580 int pthread_attr_getstackaddr(const scope pthread_attr_t*, void**); (TSA)
1581 int pthread_attr_getstacksize(const scope pthread_attr_t*, size_t*); (TSS)
1582 int pthread_attr_setstack(pthread_attr_t*, void*, size_t); (TSA|TSS)
1583 int pthread_attr_setstackaddr(pthread_attr_t*, void*); (TSA)
1584 int pthread_attr_setstacksize(pthread_attr_t*, size_t); (TSS)
1585 */
1586 
1587 version (CRuntime_Glibc)
1588 {
1589     int pthread_attr_getstack(const scope pthread_attr_t*, void**, size_t*);
1590     int pthread_attr_getstackaddr(const scope pthread_attr_t*, void**);
1591     int pthread_attr_getstacksize(const scope pthread_attr_t*, size_t*);
1592     int pthread_attr_setstack(pthread_attr_t*, void*, size_t);
1593     int pthread_attr_setstackaddr(pthread_attr_t*, void*);
1594     int pthread_attr_setstacksize(pthread_attr_t*, size_t);
1595 }
1596 else version (Darwin)
1597 {
1598     int pthread_attr_getstack(const scope pthread_attr_t*, void**, size_t*);
1599     int pthread_attr_getstackaddr(const scope pthread_attr_t*, void**);
1600     int pthread_attr_getstacksize(const scope pthread_attr_t*, size_t*);
1601     int pthread_attr_setstack(pthread_attr_t*, void*, size_t);
1602     int pthread_attr_setstackaddr(pthread_attr_t*, void*);
1603     int pthread_attr_setstacksize(pthread_attr_t*, size_t);
1604 }
1605 else version (FreeBSD)
1606 {
1607     int pthread_attr_getstack(const scope pthread_attr_t*, void**, size_t*);
1608     int pthread_attr_getstackaddr(const scope pthread_attr_t*, void**);
1609     int pthread_attr_getstacksize(const scope pthread_attr_t*, size_t*);
1610     int pthread_attr_setstack(pthread_attr_t*, void*, size_t);
1611     int pthread_attr_setstackaddr(pthread_attr_t*, void*);
1612     int pthread_attr_setstacksize(pthread_attr_t*, size_t);
1613 }
1614 else version (NetBSD)
1615 {
1616     int pthread_attr_getstack(const scope pthread_attr_t*, void**, size_t*);
1617     int pthread_attr_getstackaddr(const scope pthread_attr_t*, void**);
1618     int pthread_attr_getstacksize(const scope pthread_attr_t*, size_t*);
1619     int pthread_attr_setstack(pthread_attr_t*, void*, size_t);
1620     int pthread_attr_setstackaddr(pthread_attr_t*, void*);
1621     int pthread_attr_setstacksize(pthread_attr_t*, size_t);
1622 }
1623 else version (OpenBSD)
1624 {
1625     int pthread_attr_getstack(const scope pthread_attr_t*, void**, size_t*);
1626     int pthread_attr_getstackaddr(const scope pthread_attr_t*, void**);
1627     int pthread_attr_getstacksize(const scope pthread_attr_t*, size_t*);
1628     int pthread_attr_setstack(pthread_attr_t*, void*, size_t);
1629     int pthread_attr_setstackaddr(pthread_attr_t*, void*);
1630     int pthread_attr_setstacksize(pthread_attr_t*, size_t);
1631 }
1632 else version (DragonFlyBSD)
1633 {
1634     int pthread_attr_getstack(const scope pthread_attr_t*, void**, size_t*);
1635     int pthread_attr_getstackaddr(const scope pthread_attr_t*, void**);
1636     int pthread_attr_getstacksize(const scope pthread_attr_t*, size_t*);
1637     int pthread_attr_setstack(pthread_attr_t*, void*, size_t);
1638     int pthread_attr_setstackaddr(pthread_attr_t*, void*);
1639     int pthread_attr_setstacksize(pthread_attr_t*, size_t);
1640 }
1641 else version (Solaris)
1642 {
1643     int pthread_attr_getstack(const scope pthread_attr_t*, void**, size_t*);
1644     int pthread_attr_getstackaddr(const scope pthread_attr_t*, void**);
1645     int pthread_attr_getstacksize(const scope pthread_attr_t*, size_t*);
1646     int pthread_attr_setstack(pthread_attr_t*, void*, size_t);
1647     int pthread_attr_setstackaddr(pthread_attr_t*, void*);
1648     int pthread_attr_setstacksize(pthread_attr_t*, size_t);
1649 }
1650 else version (CRuntime_Bionic)
1651 {
1652     int pthread_attr_getstack(const scope pthread_attr_t*, void**, size_t*);
1653     int pthread_attr_getstackaddr(const scope pthread_attr_t*, void**);
1654     int pthread_attr_getstacksize(const scope pthread_attr_t*, size_t*);
1655     int pthread_attr_setstack(pthread_attr_t*, void*, size_t);
1656     int pthread_attr_setstackaddr(pthread_attr_t*, void*);
1657     int pthread_attr_setstacksize(pthread_attr_t*, size_t);
1658 }
1659 else version (CRuntime_Musl)
1660 {
1661     int pthread_attr_getstack(const scope pthread_attr_t*, void**, size_t*);
1662     int pthread_attr_setstacksize(pthread_attr_t*, size_t);
1663 }
1664 else version (CRuntime_UClibc)
1665 {
1666     int pthread_attr_getstack(const scope pthread_attr_t*, void**, size_t*);
1667     int pthread_attr_getstackaddr(const scope pthread_attr_t*, void**);
1668     int pthread_attr_getstacksize(const scope pthread_attr_t*, size_t*);
1669     int pthread_attr_setstack(pthread_attr_t*, void*, size_t);
1670     int pthread_attr_setstackaddr(pthread_attr_t*, void*);
1671     int pthread_attr_setstacksize(pthread_attr_t*, size_t);
1672 }
1673 else
1674 {
1675     static assert(false, "Unsupported platform");
1676 }
1677 
1678 //
1679 // Shared Synchronization (TSH)
1680 //
1681 /*
1682 int pthread_condattr_getpshared(const scope pthread_condattr_t*, int*);
1683 int pthread_condattr_setpshared(pthread_condattr_t*, int);
1684 int pthread_mutexattr_getpshared(const scope pthread_mutexattr_t*, int*);
1685 int pthread_mutexattr_setpshared(pthread_mutexattr_t*, int);
1686 int pthread_rwlockattr_getpshared(const scope pthread_rwlockattr_t*, int*);
1687 int pthread_rwlockattr_setpshared(pthread_rwlockattr_t*, int);
1688 */
1689 
1690 version (CRuntime_Glibc)
1691 {
1692     int pthread_condattr_getpshared(const scope pthread_condattr_t*, int*);
1693     int pthread_condattr_setpshared(pthread_condattr_t*, int);
1694     int pthread_mutexattr_getpshared(const scope pthread_mutexattr_t*, int*);
1695     int pthread_mutexattr_setpshared(pthread_mutexattr_t*, int);
1696     int pthread_rwlockattr_getpshared(const scope pthread_rwlockattr_t*, int*);
1697     int pthread_rwlockattr_setpshared(pthread_rwlockattr_t*, int);
1698 }
1699 else version (FreeBSD)
1700 {
1701     int pthread_condattr_getpshared(const scope pthread_condattr_t*, int*);
1702     int pthread_condattr_setpshared(pthread_condattr_t*, int);
1703     int pthread_mutexattr_getpshared(const scope pthread_mutexattr_t*, int*);
1704     int pthread_mutexattr_setpshared(pthread_mutexattr_t*, int);
1705     int pthread_rwlockattr_getpshared(const scope pthread_rwlockattr_t*, int*);
1706     int pthread_rwlockattr_setpshared(pthread_rwlockattr_t*, int);
1707 }
1708 else version (NetBSD)
1709 {
1710     int pthread_condattr_getpshared(const scope pthread_condattr_t*, int*);
1711     int pthread_condattr_setpshared(pthread_condattr_t*, int);
1712     int pthread_mutexattr_getpshared(const scope pthread_mutexattr_t*, int*);
1713     int pthread_mutexattr_setpshared(pthread_mutexattr_t*, int);
1714     int pthread_rwlockattr_getpshared(const scope pthread_rwlockattr_t*, int*);
1715     int pthread_rwlockattr_setpshared(pthread_rwlockattr_t*, int);
1716 }
1717 else version (OpenBSD)
1718 {
1719 }
1720 else version (DragonFlyBSD)
1721 {
1722     int pthread_condattr_getpshared(const scope pthread_condattr_t*, int*);
1723     int pthread_condattr_setpshared(pthread_condattr_t*, int);
1724     int pthread_mutexattr_getpshared(const scope pthread_mutexattr_t*, int*);
1725     int pthread_mutexattr_setpshared(pthread_mutexattr_t*, int);
1726     int pthread_rwlockattr_getpshared(const scope pthread_rwlockattr_t*, int*);
1727     int pthread_rwlockattr_setpshared(pthread_rwlockattr_t*, int);
1728 }
1729 else version (Darwin)
1730 {
1731     int pthread_condattr_getpshared(const scope pthread_condattr_t*, int*);
1732     int pthread_condattr_setpshared(pthread_condattr_t*, int);
1733     int pthread_mutexattr_getpshared(const scope pthread_mutexattr_t*, int*);
1734     int pthread_mutexattr_setpshared(pthread_mutexattr_t*, int);
1735     int pthread_rwlockattr_getpshared(const scope pthread_rwlockattr_t*, int*);
1736     int pthread_rwlockattr_setpshared(pthread_rwlockattr_t*, int);
1737 }
1738 else version (Solaris)
1739 {
1740     int pthread_condattr_getpshared(const scope pthread_condattr_t*, int*);
1741     int pthread_condattr_setpshared(pthread_condattr_t*, int);
1742     int pthread_mutexattr_getpshared(const scope pthread_mutexattr_t*, int*);
1743     int pthread_mutexattr_setpshared(pthread_mutexattr_t*, int);
1744     int pthread_rwlockattr_getpshared(const scope pthread_rwlockattr_t*, int*);
1745     int pthread_rwlockattr_setpshared(pthread_rwlockattr_t*, int);
1746 }
1747 else version (CRuntime_Bionic)
1748 {
1749     int pthread_condattr_getpshared(pthread_condattr_t*, int*);
1750     int pthread_condattr_setpshared(pthread_condattr_t*, int);
1751     int pthread_mutexattr_getpshared(pthread_mutexattr_t*, int*);
1752     int pthread_mutexattr_setpshared(pthread_mutexattr_t*, int);
1753     int pthread_rwlockattr_getpshared(pthread_rwlockattr_t*, int*);
1754     int pthread_rwlockattr_setpshared(pthread_rwlockattr_t*, int);
1755 }
1756 else version (CRuntime_Musl)
1757 {
1758     int pthread_condattr_getpshared(pthread_condattr_t*, int*);
1759     int pthread_condattr_setpshared(pthread_condattr_t*, int);
1760     int pthread_mutexattr_getpshared(pthread_mutexattr_t*, int*);
1761     int pthread_mutexattr_setpshared(pthread_mutexattr_t*, int);
1762     int pthread_rwlockattr_getpshared(pthread_rwlockattr_t*, int*);
1763     int pthread_rwlockattr_setpshared(pthread_rwlockattr_t*, int);
1764 }
1765 else version (CRuntime_UClibc)
1766 {
1767     int pthread_condattr_getpshared(const scope pthread_condattr_t*, int*);
1768     int pthread_condattr_setpshared(pthread_condattr_t*, int);
1769     int pthread_mutexattr_getpshared(const scope pthread_mutexattr_t*, int*);
1770     int pthread_mutexattr_setpshared(pthread_mutexattr_t*, int);
1771     int pthread_rwlockattr_getpshared(const scope pthread_rwlockattr_t*, int*);
1772     int pthread_rwlockattr_setpshared(pthread_rwlockattr_t*, int);
1773 }
1774 else
1775 {
1776     static assert(false, "Unsupported platform");
1777 }