i386: Fix scalar VCOMSBF16 which only compares low word
[official-gcc.git] / libphobos / libdruntime / core / sys / posix / pthread.d
blob6c5f1a93e45be540243c2bfc0dff21c1b9885bc5
1 /**
2 * D header file for POSIX.
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 */
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)
15 module core.sys.posix.pthread;
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;
22 import core.stdc.stdint;
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;
33 version (Posix):
34 extern (C)
35 nothrow:
38 // Required
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
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();
105 version (CRuntime_Glibc)
107 enum
109 PTHREAD_CANCEL_ENABLE,
110 PTHREAD_CANCEL_DISABLE
113 enum
115 PTHREAD_CANCEL_DEFERRED,
116 PTHREAD_CANCEL_ASYNCHRONOUS
119 enum PTHREAD_CANCELED = cast(void*) -1;
121 //enum pthread_mutex_t PTHREAD_COND_INITIALIZER = { __LOCK_ALT_INITIALIZER, 0, "", 0 };
123 enum
125 PTHREAD_CREATE_JOINABLE,
126 PTHREAD_CREATE_DETACHED
129 enum
131 PTHREAD_INHERIT_SCHED,
132 PTHREAD_EXPLICIT_SCHED
135 enum PTHREAD_MUTEX_INITIALIZER = pthread_mutex_t.init;
136 enum PTHREAD_ONCE_INIT = pthread_once_t.init;
138 enum
140 PTHREAD_PROCESS_PRIVATE,
141 PTHREAD_PROCESS_SHARED
144 else version (Darwin)
146 enum
148 PTHREAD_CANCEL_ENABLE = 1,
149 PTHREAD_CANCEL_DISABLE = 0
152 enum
154 PTHREAD_CANCEL_DEFERRED = 2,
155 PTHREAD_CANCEL_ASYNCHRONOUS = 0
158 enum PTHREAD_CANCELED = cast(void*) -1;
160 //enum pthread_mutex_t PTHREAD_COND_INITIALIZER = { __LOCK_ALT_INITIALIZER, 0, "", 0 };
162 enum
164 PTHREAD_CREATE_JOINABLE = 1,
165 PTHREAD_CREATE_DETACHED = 2
168 enum
170 PTHREAD_INHERIT_SCHED = 1,
171 PTHREAD_EXPLICIT_SCHED = 2
174 enum PTHREAD_MUTEX_INITIALIZER = pthread_mutex_t(0x32AAABA7);
175 enum PTHREAD_ONCE_INIT = pthread_once_t(0x30b1bcba);
177 enum
179 PTHREAD_PROCESS_PRIVATE = 2,
180 PTHREAD_PROCESS_SHARED = 1
183 else version (FreeBSD)
185 enum
187 PTHREAD_DETACHED = 0x1,
188 PTHREAD_INHERIT_SCHED = 0x4,
189 PTHREAD_NOFLOAT = 0x8,
191 PTHREAD_CREATE_DETACHED = PTHREAD_DETACHED,
192 PTHREAD_CREATE_JOINABLE = 0,
193 PTHREAD_EXPLICIT_SCHED = 0,
196 enum
198 PTHREAD_PROCESS_PRIVATE = 0,
199 PTHREAD_PROCESS_SHARED = 1,
202 enum
204 PTHREAD_CANCEL_ENABLE = 0,
205 PTHREAD_CANCEL_DISABLE = 1,
206 PTHREAD_CANCEL_DEFERRED = 0,
207 PTHREAD_CANCEL_ASYNCHRONOUS = 2,
210 enum PTHREAD_CANCELED = cast(void*) -1;
212 enum PTHREAD_NEEDS_INIT = 0;
213 enum PTHREAD_DONE_INIT = 1;
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;
221 else version (NetBSD)
223 enum PRI_NONE = -1;
224 enum
226 PTHREAD_INHERIT_SCHED = 0x0,
228 PTHREAD_CREATE_DETACHED = 1,
229 PTHREAD_CREATE_JOINABLE = 0,
230 PTHREAD_EXPLICIT_SCHED = 1,
233 enum
235 PTHREAD_PROCESS_PRIVATE = 0,
236 PTHREAD_PROCESS_SHARED = 1,
239 enum
241 PTHREAD_CANCEL_ENABLE = 0,
242 PTHREAD_CANCEL_DISABLE = 1,
243 PTHREAD_CANCEL_DEFERRED = 0,
244 PTHREAD_CANCEL_ASYNCHRONOUS = 1,
247 enum PTHREAD_CANCELED = cast(void*) 1;
249 enum PTHREAD_DONE_INIT = 1;
251 enum PTHREAD_MUTEX_INITIALIZER = pthread_mutex_t(0x33330003);
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);
257 else version (OpenBSD)
259 enum
261 PTHREAD_DETACHED = 0x1,
262 PTHREAD_INHERIT_SCHED = 0x4,
263 PTHREAD_NOFLOAT = 0x8,
265 PTHREAD_CREATE_DETACHED = PTHREAD_DETACHED,
266 PTHREAD_CREATE_JOINABLE = 0,
267 PTHREAD_EXPLICIT_SCHED = 0,
270 enum
272 PTHREAD_PROCESS_PRIVATE = 0,
273 PTHREAD_PROCESS_SHARED = 1,
276 enum
278 PTHREAD_CANCEL_ENABLE = 0,
279 PTHREAD_CANCEL_DISABLE = 1,
280 PTHREAD_CANCEL_DEFERRED = 0,
281 PTHREAD_CANCEL_ASYNCHRONOUS = 2,
284 enum PTHREAD_CANCELED = cast(void*) 1;
286 enum
288 PTHREAD_NEEDS_INIT = 0,
289 PTHREAD_DONE_INIT = 1,
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;
297 else version (DragonFlyBSD)
299 enum
301 PTHREAD_DETACHED = 0x1,
302 //PTHREAD_SCOPE_SYSTEM = 0x2, // defined below
303 PTHREAD_INHERIT_SCHED = 0x4,
304 PTHREAD_NOFLOAT = 0x8,
306 PTHREAD_CREATE_DETACHED = PTHREAD_DETACHED,
307 PTHREAD_CREATE_JOINABLE = 0,
308 //PTHREAD_SCOPE_PROCESS = 0, // defined below
309 PTHREAD_EXPLICIT_SCHED = 0,
312 enum
314 PTHREAD_PROCESS_PRIVATE = 0,
315 PTHREAD_PROCESS_SHARED = 1,
318 enum
320 PTHREAD_CANCEL_ENABLE = 0,
321 PTHREAD_CANCEL_DISABLE = 1,
322 PTHREAD_CANCEL_DEFERRED = 0,
323 PTHREAD_CANCEL_ASYNCHRONOUS = 2,
326 enum PTHREAD_CANCELED = cast(void*) -1;
328 enum PTHREAD_NEEDS_INIT = 0;
329 enum PTHREAD_DONE_INIT = 1;
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;
336 else version (Solaris)
338 enum
340 PTHREAD_INHERIT_SCHED = 0x01,
341 PTHREAD_NOFLOAT = 0x08,
342 PTHREAD_CREATE_DETACHED = 0x40,
343 PTHREAD_CREATE_JOINABLE = 0x00,
344 PTHREAD_EXPLICIT_SCHED = 0x00,
347 enum
349 PTHREAD_PROCESS_PRIVATE = 0,
350 PTHREAD_PROCESS_SHARED = 1,
353 enum
355 PTHREAD_CANCEL_ENABLE = 0,
356 PTHREAD_CANCEL_DISABLE = 1,
357 PTHREAD_CANCEL_DEFERRED = 0,
358 PTHREAD_CANCEL_ASYNCHRONOUS = 2,
361 enum PTHREAD_CANCELED = cast(void*)-19;
363 enum PTHREAD_MUTEX_INITIALIZER = pthread_mutex_t.init;
364 enum PTHREAD_ONCE_INIT = pthread_once_t.init;
366 else version (CRuntime_Bionic)
368 enum
370 PTHREAD_CREATE_JOINABLE,
371 PTHREAD_CREATE_DETACHED
374 enum PTHREAD_MUTEX_INITIALIZER = pthread_mutex_t.init;
375 enum PTHREAD_ONCE_INIT = pthread_once_t.init;
377 enum
379 PTHREAD_PROCESS_PRIVATE,
380 PTHREAD_PROCESS_SHARED
383 else version (CRuntime_Musl)
385 enum
387 PTHREAD_CREATE_JOINABLE = 0,
388 PTHREAD_CREATE_DETACHED = 1
391 enum PTHREAD_MUTEX_INITIALIZER = pthread_mutex_t.init;
392 enum PTHREAD_ONCE_INIT = pthread_once_t.init;
394 enum
396 PTHREAD_PROCESS_PRIVATE = 0,
397 PTHREAD_PROCESS_SHARED = 1
400 else version (CRuntime_UClibc)
402 enum
404 PTHREAD_CANCEL_ENABLE,
405 PTHREAD_CANCEL_DISABLE
408 enum
410 PTHREAD_CANCEL_DEFERRED,
411 PTHREAD_CANCEL_ASYNCHRONOUS
414 enum PTHREAD_CANCELED = cast(void*) -1;
416 enum PTHREAD_MUTEX_INITIALIZER = pthread_mutex_t.init;
417 enum PTHREAD_ONCE_INIT = pthread_once_t.init;
419 enum
421 PTHREAD_CREATE_JOINABLE,
422 PTHREAD_CREATE_DETACHED
425 enum
427 PTHREAD_INHERIT_SCHED,
428 PTHREAD_EXPLICIT_SCHED
431 enum
433 PTHREAD_PROCESS_PRIVATE,
434 PTHREAD_PROCESS_SHARED
437 else
439 static assert(false, "Unsupported platform");
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);
454 alias void function(void*) _pthread_cleanup_routine;
455 alias void function(void*) @nogc _pthread_cleanup_routine_nogc;
456 version (CRuntime_Glibc)
458 struct _pthread_cleanup_buffer
460 _pthread_cleanup_routine __routine;
461 void* __arg;
462 int __canceltype;
463 _pthread_cleanup_buffer* __prev;
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);
470 struct pthread_cleanup
472 _pthread_cleanup_buffer buffer = void;
474 extern (D) void push(F: _pthread_cleanup_routine)(F routine, void* arg )
476 _pthread_cleanup_push( &buffer, routine, arg );
479 extern (D) void pop()( int execute )
481 _pthread_cleanup_pop( &buffer, execute );
485 else version (Darwin)
487 struct _pthread_cleanup_buffer
489 _pthread_cleanup_routine __routine;
490 void* __arg;
491 _pthread_cleanup_buffer* __next;
494 struct pthread_cleanup
496 _pthread_cleanup_buffer buffer = void;
498 extern (D) void push(F: _pthread_cleanup_routine)(F routine, void* arg )
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;
507 extern (D) void pop()( int execute )
509 pthread_t self = pthread_self();
510 self.__cleanup_stack = cast(pthread_handler_rec*) buffer.__next;
511 if ( execute )
513 buffer.__routine( buffer.__arg );
518 else version (FreeBSD)
520 struct _pthread_cleanup_info
522 uintptr_t[8] pthread_cleanup_pad;
525 struct pthread_cleanup
527 _pthread_cleanup_info __cleanup_info__ = void;
529 extern (D) void push(F: _pthread_cleanup_routine)(F cleanup_routine, void* cleanup_arg )
531 __pthread_cleanup_push_imp( cleanup_routine, cleanup_arg, &__cleanup_info__ );
534 extern (D) void pop()( int execute )
536 __pthread_cleanup_pop_imp( execute );
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);
544 else version (DragonFlyBSD)
546 struct _pthread_cleanup_info
548 uintptr_t[8] pthread_cleanup_pad;
551 struct pthread_cleanup
553 _pthread_cleanup_info __cleanup_info__ = void;
555 extern (D) void push()( _pthread_cleanup_routine cleanup_routine, void* cleanup_arg )
557 _pthread_cleanup_push( cleanup_routine, cleanup_arg, &__cleanup_info__ );
560 extern (D) void pop()( int execute )
562 _pthread_cleanup_pop( execute );
566 void _pthread_cleanup_push(_pthread_cleanup_routine, void*, _pthread_cleanup_info*);
567 void _pthread_cleanup_pop(int);
569 else version (NetBSD)
571 struct _pthread_cleanup_store
573 void*[4] pthread_cleanup_pad;
576 struct pthread_cleanup
578 _pthread_cleanup_store __cleanup_info__ = void;
580 extern (D) void push()( _pthread_cleanup_routine cleanup_routine, void* cleanup_arg )
582 pthread__cleanup_push( cleanup_routine, cleanup_arg, &__cleanup_info__ );
585 extern (D) void pop()( int execute )
587 pthread__cleanup_pop( execute, &__cleanup_info__ );
591 void pthread__cleanup_push(_pthread_cleanup_routine, void*, void*);
592 void pthread__cleanup_pop(int, void *);
594 else version (OpenBSD)
596 void pthread_cleanup_push(void function(void*), void*);
597 void pthread_cleanup_pop(int);
599 else version (Solaris)
601 caddr_t _getfp();
603 struct _pthread_cleanup_info
605 uintptr_t[4] pthread_cleanup_pad;
608 struct pthread_cleanup
610 _pthread_cleanup_info __cleanup_info__ = void;
612 extern (D) void push(F: _pthread_cleanup_routine)(F cleanup_routine, void* cleanup_arg)
614 __pthread_cleanup_push(cleanup_routine, cleanup_arg, _getfp(), &__cleanup_info__);
617 extern (D) void pop()(int execute)
619 __pthread_cleanup_pop(execute, &__cleanup_info__);
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*);
627 else version (CRuntime_Bionic)
629 struct __pthread_cleanup_t
631 __pthread_cleanup_t* __cleanup_prev;
632 _pthread_cleanup_routine __cleanup_routine;
633 void* __cleanup_arg;
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);
640 struct pthread_cleanup
642 __pthread_cleanup_t __cleanup = void;
644 extern (D) void push(F: _pthread_cleanup_routine)(F routine, void* arg )
646 __pthread_cleanup_push( &__cleanup, routine, arg );
649 extern (D) void pop()( int execute )
651 __pthread_cleanup_pop( &__cleanup, execute );
655 else version (CRuntime_Musl)
657 struct __ptcb {
658 _pthread_cleanup_routine f;
659 void* __x;
660 __ptcb* __next;
662 void _pthread_cleanup_push(__ptcb*, _pthread_cleanup_routine, void*);
663 void _pthread_cleanup_pop(__ptcb*, int);
665 struct pthread_cleanup
667 __ptcb __cleanup = void;
669 extern (D) void push(F: _pthread_cleanup_routine)(F routine, void* arg )
671 _pthread_cleanup_push( &__cleanup, routine, arg );
674 extern (D) void pop()( int execute )
676 _pthread_cleanup_pop( &__cleanup, execute );
680 else version (CRuntime_UClibc)
682 struct _pthread_cleanup_buffer
684 _pthread_cleanup_routine __routine;
685 void* __arg;
686 int __canceltype;
687 _pthread_cleanup_buffer* __prev;
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);
694 struct pthread_cleanup
696 _pthread_cleanup_buffer buffer = void;
698 extern (D) void push(F: _pthread_cleanup_routine)(F routine, void* arg )
700 _pthread_cleanup_push( &buffer, routine, arg );
703 extern (D) void pop()( int execute )
705 _pthread_cleanup_pop( &buffer, execute );
709 else
711 static assert(false, "Unsupported platform");
714 @nogc:
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();
759 // Barrier (BAR)
762 PTHREAD_BARRIER_SERIAL_THREAD
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)
773 version (CRuntime_Glibc)
775 enum PTHREAD_BARRIER_SERIAL_THREAD = -1;
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);
785 else version (FreeBSD)
787 enum PTHREAD_BARRIER_SERIAL_THREAD = -1;
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);
797 else version (DragonFlyBSD)
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;
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);
812 else version (NetBSD)
814 enum PTHREAD_BARRIER_SERIAL_THREAD = 1234567;
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);
824 else version (OpenBSD)
826 enum PTHREAD_BARRIER_SERIAL_THREAD = -1;
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);
836 else version (Darwin)
839 else version (Solaris)
841 enum PTHREAD_BARRIER_SERIAL_THREAD = -2;
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);
851 else version (CRuntime_Bionic)
854 else version (CRuntime_Musl)
856 enum PTHREAD_BARRIER_SERIAL_THREAD = -1;
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);
866 else version (CRuntime_UClibc)
868 enum PTHREAD_BARRIER_SERIAL_THREAD = -1;
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);
878 else
880 static assert(false, "Unsupported platform");
884 // Clock (CS)
887 int pthread_condattr_getclock(const scope pthread_condattr_t*, clockid_t*);
888 int pthread_condattr_setclock(pthread_condattr_t*, clockid_t);
890 version (CRuntime_Glibc)
892 int pthread_condattr_getclock(const scope pthread_condattr_t*, clockid_t*);
893 int pthread_condattr_setclock(pthread_condattr_t*, clockid_t);
895 else version (FreeBSD)
897 int pthread_condattr_getclock(const scope pthread_condattr_t*, clockid_t*);
898 int pthread_condattr_setclock(pthread_condattr_t*, clockid_t);
900 else version (DragonFlyBSD)
902 int pthread_condattr_getclock(const scope pthread_condattr_t*, clockid_t*);
903 int pthread_condattr_setclock(pthread_condattr_t*, clockid_t);
905 else version (NetBSD)
907 int pthread_condattr_setclock(pthread_condattr_t*, clockid_t);
909 else version (OpenBSD)
911 int pthread_condattr_getclock(const scope pthread_condattr_t*, clockid_t*);
912 int pthread_condattr_setclock(pthread_condattr_t*, clockid_t);
914 else version (Darwin)
917 else version (Solaris)
919 int pthread_condattr_getclock(const scope pthread_condattr_t*, clockid_t*);
920 int pthread_condattr_setclock(pthread_condattr_t*, clockid_t);
922 else version (CRuntime_Bionic)
925 else version (CRuntime_Musl)
927 int pthread_condattr_getclock(const scope pthread_condattr_t*, clockid_t*);
928 int pthread_condattr_setclock(pthread_condattr_t*, clockid_t);
930 else version (CRuntime_UClibc)
932 int pthread_condattr_getclock(const scope pthread_condattr_t*, clockid_t*);
933 int pthread_condattr_setclock(pthread_condattr_t*, clockid_t);
935 else
937 static assert(false, "Unsupported platform");
941 // Spinlock (SPI)
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*);
951 version (CRuntime_Glibc)
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*);
959 else version (FreeBSD)
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*);
967 else version (DragonFlyBSD)
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*);
975 else version (NetBSD)
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*);
983 else version (OpenBSD)
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*);
991 else version (Darwin)
994 else version (Solaris)
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*);
1002 else version (CRuntime_Bionic)
1005 else version (CRuntime_Musl)
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*);
1013 else version (CRuntime_UClibc)
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*);
1021 else
1023 static assert(false, "Unsupported platform");
1027 // XOpen (XSI)
1030 PTHREAD_MUTEX_DEFAULT
1031 PTHREAD_MUTEX_ERRORCHECK
1032 PTHREAD_MUTEX_NORMAL
1033 PTHREAD_MUTEX_RECURSIVE
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);
1043 version (CRuntime_Glibc)
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;
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);
1057 else version (Darwin)
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;
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);
1071 else version (FreeBSD)
1073 enum
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
1081 enum PTHREAD_MUTEX_DEFAULT = PTHREAD_MUTEX_ERRORCHECK;
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);
1090 else version (NetBSD)
1092 enum
1094 PTHREAD_MUTEX_NORMAL = 0,
1095 PTHREAD_MUTEX_ERRORCHECK = 1,
1096 PTHREAD_MUTEX_RECURSIVE = 2,
1097 PTHREAD_MUTEX_TYPE_MAX
1099 enum PTHREAD_MUTEX_DEFAULT = PTHREAD_MUTEX_ERRORCHECK;
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);
1108 else version (OpenBSD)
1110 enum
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
1118 enum PTHREAD_MUTEX_DEFAULT = PTHREAD_MUTEX_ERRORCHECK;
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);
1127 else version (DragonFlyBSD)
1129 enum
1131 PTHREAD_MUTEX_ERRORCHECK = 1,
1132 PTHREAD_MUTEX_RECURSIVE = 2,
1133 PTHREAD_MUTEX_NORMAL = 3,
1134 PTHREAD_MUTEX_TYPE_MAX
1136 enum PTHREAD_MUTEX_DEFAULT = PTHREAD_MUTEX_ERRORCHECK;
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);
1145 else version (Solaris)
1147 enum
1149 PTHREAD_MUTEX_ERRORCHECK = 2,
1150 PTHREAD_MUTEX_RECURSIVE = 4,
1151 PTHREAD_MUTEX_NORMAL = 0,
1154 enum PTHREAD_MUTEX_DEFAULT = PTHREAD_MUTEX_NORMAL;
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);
1163 else version (CRuntime_Bionic)
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;
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;
1175 else version (CRuntime_Musl)
1177 enum {
1178 PTHREAD_MUTEX_NORMAL = 0,
1179 PTHREAD_MUTEX_RECURSIVE = 1,
1180 PTHREAD_MUTEX_ERRORCHECK = 2,
1181 PTHREAD_MUTEX_DEFAULT = PTHREAD_MUTEX_NORMAL,
1183 int pthread_mutexattr_settype(pthread_mutexattr_t*, int) @trusted;
1185 else version (CRuntime_UClibc)
1187 enum
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
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);
1207 else
1209 static assert(false, "Unsupported platform");
1213 // CPU Time (TCT)
1216 int pthread_getcpuclockid(pthread_t, clockid_t*);
1219 version (CRuntime_Glibc)
1221 int pthread_getcpuclockid(pthread_t, clockid_t*);
1223 else version (FreeBSD)
1225 int pthread_getcpuclockid(pthread_t, clockid_t*);
1227 else version (DragonFlyBSD)
1229 int pthread_getcpuclockid(pthread_t, clockid_t*);
1231 else version (NetBSD)
1234 else version (OpenBSD)
1236 int pthread_getcpuclockid(pthread_t, clockid_t*);
1238 else version (Darwin)
1241 else version (Solaris)
1244 else version (CRuntime_Bionic)
1246 int pthread_getcpuclockid(pthread_t, clockid_t*);
1248 else version (CRuntime_Musl)
1250 int pthread_getcpuclockid(pthread_t, clockid_t*);
1252 else version (CRuntime_UClibc)
1254 int pthread_getcpuclockid(pthread_t, clockid_t*);
1256 else
1258 static assert(false, "Unsupported platform");
1262 // Timeouts (TMO)
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*);
1270 version (CRuntime_Glibc)
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*);
1276 else version (Darwin)
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*);
1282 else version (FreeBSD)
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*);
1288 else version (NetBSD)
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*);
1294 else version (OpenBSD)
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*);
1300 else version (DragonFlyBSD)
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*);
1306 else version (Solaris)
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*);
1312 else version (CRuntime_Bionic)
1314 int pthread_rwlock_timedrdlock(pthread_rwlock_t*, const scope timespec*);
1315 int pthread_rwlock_timedwrlock(pthread_rwlock_t*, const scope timespec*);
1317 else version (CRuntime_Musl)
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*);
1323 else version (CRuntime_UClibc)
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*);
1329 else
1331 static assert(false, "Unsupported platform");
1335 // Priority (TPI|TPP)
1338 PTHREAD_PRIO_INHERIT (TPI)
1339 PTHREAD_PRIO_NONE (TPP|TPI)
1340 PTHREAD_PRIO_PROTECT (TPI)
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)
1349 version (Darwin)
1351 enum
1353 PTHREAD_PRIO_NONE,
1354 PTHREAD_PRIO_INHERIT,
1355 PTHREAD_PRIO_PROTECT
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);
1365 else version (Solaris)
1367 enum
1369 PTHREAD_PRIO_NONE = 0x00,
1370 PTHREAD_PRIO_INHERIT = 0x10,
1371 PTHREAD_PRIO_PROTECT = 0x20,
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);
1383 // Scheduling (TPS)
1386 PTHREAD_SCOPE_PROCESS
1387 PTHREAD_SCOPE_SYSTEM
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);
1400 version (CRuntime_Glibc)
1402 enum
1404 PTHREAD_SCOPE_SYSTEM,
1405 PTHREAD_SCOPE_PROCESS
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);
1418 else version (Darwin)
1420 enum
1422 PTHREAD_SCOPE_SYSTEM = 1,
1423 PTHREAD_SCOPE_PROCESS = 2
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
1436 else version (FreeBSD)
1438 enum
1440 PTHREAD_SCOPE_PROCESS = 0,
1441 PTHREAD_SCOPE_SYSTEM = 0x2
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
1454 else version (NetBSD)
1456 enum
1458 PTHREAD_SCOPE_PROCESS = 0,
1459 PTHREAD_SCOPE_SYSTEM = 0x1
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);
1472 else version (OpenBSD)
1474 enum
1476 PTHREAD_SCOPE_PROCESS = 0,
1477 PTHREAD_SCOPE_SYSTEM = 0x2
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
1490 else version (DragonFlyBSD)
1492 enum
1494 PTHREAD_SCOPE_PROCESS = 0,
1495 PTHREAD_SCOPE_SYSTEM = 0x2
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*);
1507 else version (Solaris)
1509 enum
1511 PTHREAD_SCOPE_PROCESS = 0,
1512 PTHREAD_SCOPE_SYSTEM = 1,
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);
1525 else version (CRuntime_Bionic)
1527 enum
1529 PTHREAD_SCOPE_SYSTEM,
1530 PTHREAD_SCOPE_PROCESS
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*);
1540 else version (CRuntime_Musl)
1542 enum
1544 PTHREAD_SCOPE_SYSTEM,
1545 PTHREAD_SCOPE_PROCESS
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);
1552 else version (CRuntime_UClibc)
1554 enum
1556 PTHREAD_SCOPE_SYSTEM,
1557 PTHREAD_SCOPE_PROCESS
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);
1570 else
1572 static assert(false, "Unsupported platform");
1576 // Stack (TSA|TSS)
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)
1587 version (CRuntime_Glibc)
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);
1596 else version (Darwin)
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);
1605 else version (FreeBSD)
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);
1614 else version (NetBSD)
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);
1623 else version (OpenBSD)
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);
1632 else version (DragonFlyBSD)
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);
1641 else version (Solaris)
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);
1650 else version (CRuntime_Bionic)
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);
1659 else version (CRuntime_Musl)
1661 int pthread_attr_getstack(const scope pthread_attr_t*, void**, size_t*);
1662 int pthread_attr_setstacksize(pthread_attr_t*, size_t);
1664 else version (CRuntime_UClibc)
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);
1673 else
1675 static assert(false, "Unsupported platform");
1679 // Shared Synchronization (TSH)
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);
1690 version (CRuntime_Glibc)
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);
1699 else version (FreeBSD)
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);
1708 else version (NetBSD)
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);
1717 else version (OpenBSD)
1720 else version (DragonFlyBSD)
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);
1729 else version (Darwin)
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);
1738 else version (Solaris)
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);
1747 else version (CRuntime_Bionic)
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);
1756 else version (CRuntime_Musl)
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);
1765 else version (CRuntime_UClibc)
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);
1774 else
1776 static assert(false, "Unsupported platform");