libphobos: Merge upstream druntime 9d0c8364, phobos 9d575282e.
[official-gcc.git] / libphobos / libdruntime / core / sys / posix / pthread.d
blob395ed0f7e91193ed7b5de15540940ff729347e27
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:
36 @system:
39 // Required
42 PTHREAD_CANCEL_ASYNCHRONOUS
43 PTHREAD_CANCEL_ENABLE
44 PTHREAD_CANCEL_DEFERRED
45 PTHREAD_CANCEL_DISABLE
46 PTHREAD_CANCELED
47 PTHREAD_COND_INITIALIZER
48 PTHREAD_CREATE_DETACHED
49 PTHREAD_CREATE_JOINABLE
50 PTHREAD_EXPLICIT_SCHED
51 PTHREAD_INHERIT_SCHED
52 PTHREAD_MUTEX_INITIALIZER
53 PTHREAD_ONCE_INIT
54 PTHREAD_PROCESS_SHARED
55 PTHREAD_PROCESS_PRIVATE
57 int pthread_atfork(void function(), void function(), void function());
58 int pthread_attr_destroy(pthread_attr_t*);
59 int pthread_attr_getdetachstate(const scope pthread_attr_t*, int*);
60 int pthread_attr_getschedparam(const scope pthread_attr_t*, sched_param*);
61 int pthread_attr_init(pthread_attr_t*);
62 int pthread_attr_setdetachstate(pthread_attr_t*, int);
63 int pthread_attr_setschedparam(const scope pthread_attr_t*, sched_param*);
64 int pthread_cancel(pthread_t);
65 void pthread_cleanup_push(void function(void*), void*);
66 void pthread_cleanup_pop(int);
67 int pthread_cond_broadcast(pthread_cond_t*);
68 int pthread_cond_destroy(pthread_cond_t*);
69 int pthread_cond_init(const scope pthread_cond_t*, pthread_condattr_t*);
70 int pthread_cond_signal(pthread_cond_t*);
71 int pthread_cond_timedwait(pthread_cond_t*, pthread_mutex_t*, const scope timespec*);
72 int pthread_cond_wait(pthread_cond_t*, pthread_mutex_t*);
73 int pthread_condattr_destroy(pthread_condattr_t*);
74 int pthread_condattr_init(pthread_condattr_t*);
75 int pthread_create(pthread_t*, const scope pthread_attr_t*, void* function(void*), void*);
76 int pthread_detach(pthread_t);
77 int pthread_equal(pthread_t, pthread_t);
78 void pthread_exit(void*);
79 void* pthread_getspecific(pthread_key_t);
80 int pthread_join(pthread_t, void**);
81 int pthread_key_create(pthread_key_t*, void function(void*));
82 int pthread_key_delete(pthread_key_t);
83 int pthread_mutex_destroy(pthread_mutex_t*);
84 int pthread_mutex_init(pthread_mutex_t*, pthread_mutexattr_t*);
85 int pthread_mutex_lock(pthread_mutex_t*);
86 int pthread_mutex_trylock(pthread_mutex_t*);
87 int pthread_mutex_unlock(pthread_mutex_t*);
88 int pthread_mutexattr_destroy(pthread_mutexattr_t*);
89 int pthread_mutexattr_init(pthread_mutexattr_t*);
90 int pthread_once(pthread_once_t*, void function());
91 int pthread_rwlock_destroy(pthread_rwlock_t*);
92 int pthread_rwlock_init(pthread_rwlock_t*, const scope pthread_rwlockattr_t*);
93 int pthread_rwlock_rdlock(pthread_rwlock_t*);
94 int pthread_rwlock_tryrdlock(pthread_rwlock_t*);
95 int pthread_rwlock_trywrlock(pthread_rwlock_t*);
96 int pthread_rwlock_unlock(pthread_rwlock_t*);
97 int pthread_rwlock_wrlock(pthread_rwlock_t*);
98 int pthread_rwlockattr_destroy(pthread_rwlockattr_t*);
99 int pthread_rwlockattr_init(pthread_rwlockattr_t*);
100 pthread_t pthread_self();
101 int pthread_setcancelstate(int, int*);
102 int pthread_setcanceltype(int, int*);
103 int pthread_setspecific(pthread_key_t, const scope void*);
104 void pthread_testcancel();
106 version (CRuntime_Glibc)
108 enum
110 PTHREAD_CANCEL_ENABLE,
111 PTHREAD_CANCEL_DISABLE
114 enum
116 PTHREAD_CANCEL_DEFERRED,
117 PTHREAD_CANCEL_ASYNCHRONOUS
120 enum PTHREAD_CANCELED = cast(void*) -1;
122 //enum pthread_mutex_t PTHREAD_COND_INITIALIZER = { __LOCK_ALT_INITIALIZER, 0, "", 0 };
124 enum
126 PTHREAD_CREATE_JOINABLE,
127 PTHREAD_CREATE_DETACHED
130 enum
132 PTHREAD_INHERIT_SCHED,
133 PTHREAD_EXPLICIT_SCHED
136 enum PTHREAD_MUTEX_INITIALIZER = pthread_mutex_t.init;
137 enum PTHREAD_ONCE_INIT = pthread_once_t.init;
139 enum
141 PTHREAD_PROCESS_PRIVATE,
142 PTHREAD_PROCESS_SHARED
145 else version (Darwin)
147 enum
149 PTHREAD_CANCEL_ENABLE = 1,
150 PTHREAD_CANCEL_DISABLE = 0
153 enum
155 PTHREAD_CANCEL_DEFERRED = 2,
156 PTHREAD_CANCEL_ASYNCHRONOUS = 0
159 enum PTHREAD_CANCELED = cast(void*) -1;
161 //enum pthread_mutex_t PTHREAD_COND_INITIALIZER = { __LOCK_ALT_INITIALIZER, 0, "", 0 };
163 enum
165 PTHREAD_CREATE_JOINABLE = 1,
166 PTHREAD_CREATE_DETACHED = 2
169 enum
171 PTHREAD_INHERIT_SCHED = 1,
172 PTHREAD_EXPLICIT_SCHED = 2
175 enum PTHREAD_MUTEX_INITIALIZER = pthread_mutex_t(0x32AAABA7);
176 enum PTHREAD_ONCE_INIT = pthread_once_t(0x30b1bcba);
178 enum
180 PTHREAD_PROCESS_PRIVATE = 2,
181 PTHREAD_PROCESS_SHARED = 1
184 else version (FreeBSD)
186 enum
188 PTHREAD_DETACHED = 0x1,
189 PTHREAD_INHERIT_SCHED = 0x4,
190 PTHREAD_NOFLOAT = 0x8,
192 PTHREAD_CREATE_DETACHED = PTHREAD_DETACHED,
193 PTHREAD_CREATE_JOINABLE = 0,
194 PTHREAD_EXPLICIT_SCHED = 0,
197 enum
199 PTHREAD_PROCESS_PRIVATE = 0,
200 PTHREAD_PROCESS_SHARED = 1,
203 enum
205 PTHREAD_CANCEL_ENABLE = 0,
206 PTHREAD_CANCEL_DISABLE = 1,
207 PTHREAD_CANCEL_DEFERRED = 0,
208 PTHREAD_CANCEL_ASYNCHRONOUS = 2,
211 enum PTHREAD_CANCELED = cast(void*) -1;
213 enum PTHREAD_NEEDS_INIT = 0;
214 enum PTHREAD_DONE_INIT = 1;
216 enum PTHREAD_MUTEX_INITIALIZER = null;
217 enum PTHREAD_ONCE_INIT = null;
218 enum PTHREAD_ADAPTIVE_MUTEX_INITIALIZER_NP = null;
219 enum PTHREAD_COND_INITIALIZER = null;
220 enum PTHREAD_RWLOCK_INITIALIZER = null;
222 else version (NetBSD)
224 enum PRI_NONE = -1;
225 enum
227 PTHREAD_INHERIT_SCHED = 0x0,
229 PTHREAD_CREATE_DETACHED = 1,
230 PTHREAD_CREATE_JOINABLE = 0,
231 PTHREAD_EXPLICIT_SCHED = 1,
234 enum
236 PTHREAD_PROCESS_PRIVATE = 0,
237 PTHREAD_PROCESS_SHARED = 1,
240 enum
242 PTHREAD_CANCEL_ENABLE = 0,
243 PTHREAD_CANCEL_DISABLE = 1,
244 PTHREAD_CANCEL_DEFERRED = 0,
245 PTHREAD_CANCEL_ASYNCHRONOUS = 1,
248 enum PTHREAD_CANCELED = cast(void*) 1;
250 enum PTHREAD_DONE_INIT = 1;
252 enum PTHREAD_MUTEX_INITIALIZER = pthread_mutex_t(0x33330003);
254 enum PTHREAD_ONCE_INIT = pthread_once_t(PTHREAD_MUTEX_INITIALIZER);
255 enum PTHREAD_COND_INITIALIZER = pthread_cond_t(0x55550005);
256 enum PTHREAD_RWLOCK_INITIALIZER = pthread_rwlock_t(0x99990009);
258 else version (OpenBSD)
260 enum
262 PTHREAD_DETACHED = 0x1,
263 PTHREAD_INHERIT_SCHED = 0x4,
264 PTHREAD_NOFLOAT = 0x8,
266 PTHREAD_CREATE_DETACHED = PTHREAD_DETACHED,
267 PTHREAD_CREATE_JOINABLE = 0,
268 PTHREAD_EXPLICIT_SCHED = 0,
271 enum
273 PTHREAD_PROCESS_PRIVATE = 0,
274 PTHREAD_PROCESS_SHARED = 1,
277 enum
279 PTHREAD_CANCEL_ENABLE = 0,
280 PTHREAD_CANCEL_DISABLE = 1,
281 PTHREAD_CANCEL_DEFERRED = 0,
282 PTHREAD_CANCEL_ASYNCHRONOUS = 2,
285 enum PTHREAD_CANCELED = cast(void*) 1;
287 enum
289 PTHREAD_NEEDS_INIT = 0,
290 PTHREAD_DONE_INIT = 1,
293 enum PTHREAD_MUTEX_INITIALIZER = null;
294 enum PTHREAD_ONCE_INIT = pthread_once_t.init;
295 enum PTHREAD_COND_INITIALIZER = null;
296 enum PTHREAD_RWLOCK_INITIALIZER = null;
298 else version (DragonFlyBSD)
300 enum
302 PTHREAD_DETACHED = 0x1,
303 //PTHREAD_SCOPE_SYSTEM = 0x2, // defined below
304 PTHREAD_INHERIT_SCHED = 0x4,
305 PTHREAD_NOFLOAT = 0x8,
307 PTHREAD_CREATE_DETACHED = PTHREAD_DETACHED,
308 PTHREAD_CREATE_JOINABLE = 0,
309 //PTHREAD_SCOPE_PROCESS = 0, // defined below
310 PTHREAD_EXPLICIT_SCHED = 0,
313 enum
315 PTHREAD_PROCESS_PRIVATE = 0,
316 PTHREAD_PROCESS_SHARED = 1,
319 enum
321 PTHREAD_CANCEL_ENABLE = 0,
322 PTHREAD_CANCEL_DISABLE = 1,
323 PTHREAD_CANCEL_DEFERRED = 0,
324 PTHREAD_CANCEL_ASYNCHRONOUS = 2,
327 enum PTHREAD_CANCELED = cast(void*) -1;
329 enum PTHREAD_NEEDS_INIT = 0;
330 enum PTHREAD_DONE_INIT = 1;
332 enum PTHREAD_MUTEX_INITIALIZER = null;
333 enum PTHREAD_ONCE_INIT = pthread_once_t.init;
334 enum PTHREAD_COND_INITIALIZER = null;
335 enum PTHREAD_RWLOCK_INITIALIZER = null;
337 else version (Solaris)
339 enum
341 PTHREAD_INHERIT_SCHED = 0x01,
342 PTHREAD_NOFLOAT = 0x08,
343 PTHREAD_CREATE_DETACHED = 0x40,
344 PTHREAD_CREATE_JOINABLE = 0x00,
345 PTHREAD_EXPLICIT_SCHED = 0x00,
348 enum
350 PTHREAD_PROCESS_PRIVATE = 0,
351 PTHREAD_PROCESS_SHARED = 1,
354 enum
356 PTHREAD_CANCEL_ENABLE = 0,
357 PTHREAD_CANCEL_DISABLE = 1,
358 PTHREAD_CANCEL_DEFERRED = 0,
359 PTHREAD_CANCEL_ASYNCHRONOUS = 2,
362 enum PTHREAD_CANCELED = cast(void*)-19;
364 enum PTHREAD_MUTEX_INITIALIZER = pthread_mutex_t.init;
365 enum PTHREAD_ONCE_INIT = pthread_once_t.init;
367 else version (CRuntime_Bionic)
369 enum
371 PTHREAD_CREATE_JOINABLE,
372 PTHREAD_CREATE_DETACHED
375 enum PTHREAD_MUTEX_INITIALIZER = pthread_mutex_t.init;
376 enum PTHREAD_ONCE_INIT = pthread_once_t.init;
378 enum
380 PTHREAD_PROCESS_PRIVATE,
381 PTHREAD_PROCESS_SHARED
384 else version (CRuntime_Musl)
386 enum
388 PTHREAD_CREATE_JOINABLE = 0,
389 PTHREAD_CREATE_DETACHED = 1
392 enum PTHREAD_MUTEX_INITIALIZER = pthread_mutex_t.init;
393 enum PTHREAD_ONCE_INIT = pthread_once_t.init;
395 enum
397 PTHREAD_PROCESS_PRIVATE = 0,
398 PTHREAD_PROCESS_SHARED = 1
401 else version (CRuntime_UClibc)
403 enum
405 PTHREAD_CANCEL_ENABLE,
406 PTHREAD_CANCEL_DISABLE
409 enum
411 PTHREAD_CANCEL_DEFERRED,
412 PTHREAD_CANCEL_ASYNCHRONOUS
415 enum PTHREAD_CANCELED = cast(void*) -1;
417 enum PTHREAD_MUTEX_INITIALIZER = pthread_mutex_t.init;
418 enum PTHREAD_ONCE_INIT = pthread_once_t.init;
420 enum
422 PTHREAD_CREATE_JOINABLE,
423 PTHREAD_CREATE_DETACHED
426 enum
428 PTHREAD_INHERIT_SCHED,
429 PTHREAD_EXPLICIT_SCHED
432 enum
434 PTHREAD_PROCESS_PRIVATE,
435 PTHREAD_PROCESS_SHARED
438 else
440 static assert(false, "Unsupported platform");
443 int pthread_atfork(void function(), void function(), void function());
444 @nogc {
445 int pthread_atfork(void function() @nogc, void function() @nogc, void function() @nogc);
446 int pthread_attr_destroy(pthread_attr_t*);
447 int pthread_attr_getdetachstate(const scope pthread_attr_t*, int*);
448 int pthread_attr_getschedparam(const scope pthread_attr_t*, sched_param*);
449 int pthread_attr_init(pthread_attr_t*);
450 int pthread_attr_setdetachstate(pthread_attr_t*, int);
451 int pthread_attr_setschedparam(const scope pthread_attr_t*, sched_param*);
452 int pthread_cancel(pthread_t);
455 alias void function(void*) _pthread_cleanup_routine;
456 alias void function(void*) @nogc _pthread_cleanup_routine_nogc;
457 version (CRuntime_Glibc)
459 struct _pthread_cleanup_buffer
461 _pthread_cleanup_routine __routine;
462 void* __arg;
463 int __canceltype;
464 _pthread_cleanup_buffer* __prev;
467 void _pthread_cleanup_push(_pthread_cleanup_buffer*, _pthread_cleanup_routine, void*);
468 void _pthread_cleanup_push(_pthread_cleanup_buffer*, _pthread_cleanup_routine_nogc, void*) @nogc;
469 void _pthread_cleanup_pop(_pthread_cleanup_buffer*, int);
471 struct pthread_cleanup
473 _pthread_cleanup_buffer buffer = void;
475 extern (D) void push(F: _pthread_cleanup_routine)(F routine, void* arg )
477 _pthread_cleanup_push( &buffer, routine, arg );
480 extern (D) void pop()( int execute )
482 _pthread_cleanup_pop( &buffer, execute );
486 else version (Darwin)
488 struct _pthread_cleanup_buffer
490 _pthread_cleanup_routine __routine;
491 void* __arg;
492 _pthread_cleanup_buffer* __next;
495 struct pthread_cleanup
497 _pthread_cleanup_buffer buffer = void;
499 extern (D) void push(F: _pthread_cleanup_routine)(F routine, void* arg )
501 pthread_t self = pthread_self();
502 buffer.__routine = routine;
503 buffer.__arg = arg;
504 buffer.__next = cast(_pthread_cleanup_buffer*) self.__cleanup_stack;
505 self.__cleanup_stack = cast(pthread_handler_rec*) &buffer;
508 extern (D) void pop()( int execute )
510 pthread_t self = pthread_self();
511 self.__cleanup_stack = cast(pthread_handler_rec*) buffer.__next;
512 if ( execute )
514 buffer.__routine( buffer.__arg );
519 else version (FreeBSD)
521 struct _pthread_cleanup_info
523 uintptr_t[8] pthread_cleanup_pad;
526 struct pthread_cleanup
528 _pthread_cleanup_info __cleanup_info__ = void;
530 extern (D) void push(F: _pthread_cleanup_routine)(F cleanup_routine, void* cleanup_arg )
532 __pthread_cleanup_push_imp( cleanup_routine, cleanup_arg, &__cleanup_info__ );
535 extern (D) void pop()( int execute )
537 __pthread_cleanup_pop_imp( execute );
541 void __pthread_cleanup_push_imp(_pthread_cleanup_routine, void*, _pthread_cleanup_info*);
542 void __pthread_cleanup_push_imp(_pthread_cleanup_routine_nogc, void*, _pthread_cleanup_info*) @nogc;
543 void __pthread_cleanup_pop_imp(int);
545 else version (DragonFlyBSD)
547 struct _pthread_cleanup_info
549 uintptr_t[8] pthread_cleanup_pad;
552 struct pthread_cleanup
554 _pthread_cleanup_info __cleanup_info__ = void;
556 extern (D) void push()( _pthread_cleanup_routine cleanup_routine, void* cleanup_arg )
558 _pthread_cleanup_push( cleanup_routine, cleanup_arg, &__cleanup_info__ );
561 extern (D) void pop()( int execute )
563 _pthread_cleanup_pop( execute );
567 void _pthread_cleanup_push(_pthread_cleanup_routine, void*, _pthread_cleanup_info*);
568 void _pthread_cleanup_pop(int);
570 else version (NetBSD)
572 struct _pthread_cleanup_store
574 void*[4] pthread_cleanup_pad;
577 struct pthread_cleanup
579 _pthread_cleanup_store __cleanup_info__ = void;
581 extern (D) void push()( _pthread_cleanup_routine cleanup_routine, void* cleanup_arg )
583 pthread__cleanup_push( cleanup_routine, cleanup_arg, &__cleanup_info__ );
586 extern (D) void pop()( int execute )
588 pthread__cleanup_pop( execute, &__cleanup_info__ );
592 void pthread__cleanup_push(_pthread_cleanup_routine, void*, void*);
593 void pthread__cleanup_pop(int, void *);
595 else version (OpenBSD)
597 void pthread_cleanup_push(void function(void*), void*);
598 void pthread_cleanup_pop(int);
600 else version (Solaris)
602 caddr_t _getfp();
604 struct _pthread_cleanup_info
606 uintptr_t[4] pthread_cleanup_pad;
609 struct pthread_cleanup
611 _pthread_cleanup_info __cleanup_info__ = void;
613 extern (D) void push(F: _pthread_cleanup_routine)(F cleanup_routine, void* cleanup_arg)
615 __pthread_cleanup_push(cleanup_routine, cleanup_arg, _getfp(), &__cleanup_info__);
618 extern (D) void pop()(int execute)
620 __pthread_cleanup_pop(execute, &__cleanup_info__);
624 void __pthread_cleanup_push(_pthread_cleanup_routine, void*, caddr_t, _pthread_cleanup_info*);
625 void __pthread_cleanup_push(_pthread_cleanup_routine_nogc, void*, caddr_t, _pthread_cleanup_info*) @nogc;
626 void __pthread_cleanup_pop(int, _pthread_cleanup_info*);
628 else version (CRuntime_Bionic)
630 struct __pthread_cleanup_t
632 __pthread_cleanup_t* __cleanup_prev;
633 _pthread_cleanup_routine __cleanup_routine;
634 void* __cleanup_arg;
637 void __pthread_cleanup_push(__pthread_cleanup_t*, _pthread_cleanup_routine, void*);
638 void __pthread_cleanup_push(__pthread_cleanup_t*, _pthread_cleanup_routine_nogc, void*) @nogc;
639 void __pthread_cleanup_pop(__pthread_cleanup_t*, int);
641 struct pthread_cleanup
643 __pthread_cleanup_t __cleanup = void;
645 extern (D) void push(F: _pthread_cleanup_routine)(F routine, void* arg )
647 __pthread_cleanup_push( &__cleanup, routine, arg );
650 extern (D) void pop()( int execute )
652 __pthread_cleanup_pop( &__cleanup, execute );
656 else version (CRuntime_Musl)
658 struct __ptcb {
659 _pthread_cleanup_routine f;
660 void* __x;
661 __ptcb* __next;
663 void _pthread_cleanup_push(__ptcb*, _pthread_cleanup_routine, void*);
664 void _pthread_cleanup_pop(__ptcb*, int);
666 struct pthread_cleanup
668 __ptcb __cleanup = void;
670 extern (D) void push(F: _pthread_cleanup_routine)(F routine, void* arg )
672 _pthread_cleanup_push( &__cleanup, routine, arg );
675 extern (D) void pop()( int execute )
677 _pthread_cleanup_pop( &__cleanup, execute );
681 else version (CRuntime_UClibc)
683 struct _pthread_cleanup_buffer
685 _pthread_cleanup_routine __routine;
686 void* __arg;
687 int __canceltype;
688 _pthread_cleanup_buffer* __prev;
691 void _pthread_cleanup_push(_pthread_cleanup_buffer*, _pthread_cleanup_routine, void*);
692 void _pthread_cleanup_push(_pthread_cleanup_buffer*, _pthread_cleanup_routine_nogc, void*) @nogc;
693 void _pthread_cleanup_pop(_pthread_cleanup_buffer*, int);
695 struct pthread_cleanup
697 _pthread_cleanup_buffer buffer = void;
699 extern (D) void push(F: _pthread_cleanup_routine)(F routine, void* arg )
701 _pthread_cleanup_push( &buffer, routine, arg );
704 extern (D) void pop()( int execute )
706 _pthread_cleanup_pop( &buffer, execute );
710 else
712 static assert(false, "Unsupported platform");
715 @nogc:
717 int pthread_cond_broadcast(pthread_cond_t*);
718 int pthread_cond_destroy(pthread_cond_t*);
719 int pthread_cond_init(const scope pthread_cond_t*, pthread_condattr_t*) @trusted;
720 int pthread_cond_signal(pthread_cond_t*);
721 int pthread_cond_timedwait(pthread_cond_t*, pthread_mutex_t*, const scope timespec*);
722 int pthread_cond_wait(pthread_cond_t*, pthread_mutex_t*);
723 int pthread_condattr_destroy(pthread_condattr_t*);
724 int pthread_condattr_init(pthread_condattr_t*);
725 int pthread_create(pthread_t*, const scope pthread_attr_t*, void* function(void*), void*);
726 int pthread_detach(pthread_t);
727 int pthread_equal(pthread_t, pthread_t);
728 void pthread_exit(void*);
729 void* pthread_getspecific(pthread_key_t);
730 int pthread_join(pthread_t, void**);
731 int pthread_key_create(pthread_key_t*, void function(void*));
732 int pthread_key_delete(pthread_key_t);
733 int pthread_mutex_destroy(pthread_mutex_t*);
734 int pthread_mutex_init(pthread_mutex_t*, pthread_mutexattr_t*) @trusted;
735 int pthread_mutex_lock(pthread_mutex_t*);
736 int pthread_mutex_lock(shared(pthread_mutex_t)*);
737 int pthread_mutex_trylock(pthread_mutex_t*);
738 int pthread_mutex_trylock(shared(pthread_mutex_t)*);
739 int pthread_mutex_unlock(pthread_mutex_t*);
740 int pthread_mutex_unlock(shared(pthread_mutex_t)*);
741 int pthread_mutexattr_destroy(pthread_mutexattr_t*);
742 int pthread_mutexattr_init(pthread_mutexattr_t*) @trusted;
743 int pthread_once(pthread_once_t*, void function());
744 int pthread_rwlock_destroy(pthread_rwlock_t*);
745 int pthread_rwlock_init(pthread_rwlock_t*, const scope pthread_rwlockattr_t*);
746 int pthread_rwlock_rdlock(pthread_rwlock_t*);
747 int pthread_rwlock_tryrdlock(pthread_rwlock_t*);
748 int pthread_rwlock_trywrlock(pthread_rwlock_t*);
749 int pthread_rwlock_unlock(pthread_rwlock_t*);
750 int pthread_rwlock_wrlock(pthread_rwlock_t*);
751 int pthread_rwlockattr_destroy(pthread_rwlockattr_t*);
752 int pthread_rwlockattr_init(pthread_rwlockattr_t*);
753 pthread_t pthread_self();
754 int pthread_setcancelstate(int, int*);
755 int pthread_setcanceltype(int, int*);
756 int pthread_setspecific(pthread_key_t, const scope void*);
757 void pthread_testcancel();
760 // Barrier (BAR)
763 PTHREAD_BARRIER_SERIAL_THREAD
765 int pthread_barrier_destroy(pthread_barrier_t*);
766 int pthread_barrier_init(pthread_barrier_t*, const scope pthread_barrierattr_t*, uint);
767 int pthread_barrier_wait(pthread_barrier_t*);
768 int pthread_barrierattr_destroy(pthread_barrierattr_t*);
769 int pthread_barrierattr_getpshared(const scope pthread_barrierattr_t*, int*); (BAR|TSH)
770 int pthread_barrierattr_init(pthread_barrierattr_t*);
771 int pthread_barrierattr_setpshared(pthread_barrierattr_t*, int); (BAR|TSH)
774 version (CRuntime_Glibc)
776 enum PTHREAD_BARRIER_SERIAL_THREAD = -1;
778 int pthread_barrier_destroy(pthread_barrier_t*);
779 int pthread_barrier_init(pthread_barrier_t*, const scope pthread_barrierattr_t*, uint);
780 int pthread_barrier_wait(pthread_barrier_t*);
781 int pthread_barrierattr_destroy(pthread_barrierattr_t*);
782 int pthread_barrierattr_getpshared(const scope pthread_barrierattr_t*, int*);
783 int pthread_barrierattr_init(pthread_barrierattr_t*);
784 int pthread_barrierattr_setpshared(pthread_barrierattr_t*, int);
786 else version (FreeBSD)
788 enum PTHREAD_BARRIER_SERIAL_THREAD = -1;
790 int pthread_barrier_destroy(pthread_barrier_t*);
791 int pthread_barrier_init(pthread_barrier_t*, const scope pthread_barrierattr_t*, uint);
792 int pthread_barrier_wait(pthread_barrier_t*);
793 int pthread_barrierattr_destroy(pthread_barrierattr_t*);
794 int pthread_barrierattr_getpshared(const scope pthread_barrierattr_t*, int*);
795 int pthread_barrierattr_init(pthread_barrierattr_t*);
796 int pthread_barrierattr_setpshared(pthread_barrierattr_t*, int);
798 else version (DragonFlyBSD)
800 enum PTHREAD_BARRIER_SERIAL_THREAD = -1;
801 enum PTHREAD_KEYS_MAX = 256;
802 enum PTHREAD_STACK_MIN = 16384;
803 enum PTHREAD_THREADS_MAX = c_ulong.max;
805 int pthread_barrier_destroy(pthread_barrier_t*);
806 int pthread_barrier_init(pthread_barrier_t*, const scope pthread_barrierattr_t*, uint);
807 int pthread_barrier_wait(pthread_barrier_t*);
808 int pthread_barrierattr_destroy(pthread_barrierattr_t*);
809 int pthread_barrierattr_getpshared(const scope pthread_barrierattr_t*, int*);
810 int pthread_barrierattr_init(pthread_barrierattr_t*);
811 int pthread_barrierattr_setpshared(pthread_barrierattr_t*, int);
813 else version (NetBSD)
815 enum PTHREAD_BARRIER_SERIAL_THREAD = 1234567;
817 int pthread_barrier_destroy(pthread_barrier_t*);
818 int pthread_barrier_init(pthread_barrier_t*, const scope pthread_barrierattr_t*, uint);
819 int pthread_barrier_wait(pthread_barrier_t*);
820 int pthread_barrierattr_destroy(pthread_barrierattr_t*);
821 int pthread_barrierattr_getpshared(const scope pthread_barrierattr_t*, int*);
822 int pthread_barrierattr_init(pthread_barrierattr_t*);
823 int pthread_barrierattr_setpshared(pthread_barrierattr_t*, int);
825 else version (OpenBSD)
827 enum PTHREAD_BARRIER_SERIAL_THREAD = -1;
829 int pthread_barrier_destroy(pthread_barrier_t*);
830 int pthread_barrier_init(pthread_barrier_t*, const scope pthread_barrierattr_t*, uint);
831 int pthread_barrier_wait(pthread_barrier_t*);
832 int pthread_barrierattr_destroy(pthread_barrierattr_t*);
833 int pthread_barrierattr_getpshared(const scope pthread_barrierattr_t*, int*);
834 int pthread_barrierattr_init(pthread_barrierattr_t*);
835 int pthread_barrierattr_setpshared(pthread_barrierattr_t*, int);
837 else version (Darwin)
840 else version (Solaris)
842 enum PTHREAD_BARRIER_SERIAL_THREAD = -2;
844 int pthread_barrier_destroy(pthread_barrier_t*);
845 int pthread_barrier_init(pthread_barrier_t*, const scope pthread_barrierattr_t*, uint);
846 int pthread_barrier_wait(pthread_barrier_t*);
847 int pthread_barrierattr_destroy(pthread_barrierattr_t*);
848 int pthread_barrierattr_getpshared(const scope pthread_barrierattr_t*, int*);
849 int pthread_barrierattr_init(pthread_barrierattr_t*);
850 int pthread_barrierattr_setpshared(pthread_barrierattr_t*, int);
852 else version (CRuntime_Bionic)
855 else version (CRuntime_Musl)
857 enum PTHREAD_BARRIER_SERIAL_THREAD = -1;
859 int pthread_barrier_destroy(pthread_barrier_t*);
860 int pthread_barrier_init(pthread_barrier_t*, const scope pthread_barrierattr_t*, uint);
861 int pthread_barrier_wait(pthread_barrier_t*);
862 int pthread_barrierattr_destroy(pthread_barrierattr_t*);
863 int pthread_barrierattr_getpshared(const scope pthread_barrierattr_t*, int*);
864 int pthread_barrierattr_init(pthread_barrierattr_t*);
865 int pthread_barrierattr_setpshared(pthread_barrierattr_t*, int);
867 else version (CRuntime_UClibc)
869 enum PTHREAD_BARRIER_SERIAL_THREAD = -1;
871 int pthread_barrier_destroy(pthread_barrier_t*);
872 int pthread_barrier_init(pthread_barrier_t*, const scope pthread_barrierattr_t*, uint);
873 int pthread_barrier_wait(pthread_barrier_t*);
874 int pthread_barrierattr_destroy(pthread_barrierattr_t*);
875 int pthread_barrierattr_getpshared(const scope pthread_barrierattr_t*, int*);
876 int pthread_barrierattr_init(pthread_barrierattr_t*);
877 int pthread_barrierattr_setpshared(pthread_barrierattr_t*, int);
879 else
881 static assert(false, "Unsupported platform");
885 // Clock (CS)
888 int pthread_condattr_getclock(const scope pthread_condattr_t*, clockid_t*);
889 int pthread_condattr_setclock(pthread_condattr_t*, clockid_t);
891 version (CRuntime_Glibc)
893 int pthread_condattr_getclock(const scope pthread_condattr_t*, clockid_t*);
894 int pthread_condattr_setclock(pthread_condattr_t*, clockid_t);
896 else version (FreeBSD)
898 int pthread_condattr_getclock(const scope pthread_condattr_t*, clockid_t*);
899 int pthread_condattr_setclock(pthread_condattr_t*, clockid_t);
901 else version (DragonFlyBSD)
903 int pthread_condattr_getclock(const scope pthread_condattr_t*, clockid_t*);
904 int pthread_condattr_setclock(pthread_condattr_t*, clockid_t);
906 else version (NetBSD)
908 int pthread_condattr_setclock(pthread_condattr_t*, clockid_t);
910 else version (OpenBSD)
912 int pthread_condattr_getclock(const scope pthread_condattr_t*, clockid_t*);
913 int pthread_condattr_setclock(pthread_condattr_t*, clockid_t);
915 else version (Darwin)
918 else version (Solaris)
920 int pthread_condattr_getclock(const scope pthread_condattr_t*, clockid_t*);
921 int pthread_condattr_setclock(pthread_condattr_t*, clockid_t);
923 else version (CRuntime_Bionic)
926 else version (CRuntime_Musl)
928 int pthread_condattr_getclock(const scope pthread_condattr_t*, clockid_t*);
929 int pthread_condattr_setclock(pthread_condattr_t*, clockid_t);
931 else version (CRuntime_UClibc)
933 int pthread_condattr_getclock(const scope pthread_condattr_t*, clockid_t*);
934 int pthread_condattr_setclock(pthread_condattr_t*, clockid_t);
936 else
938 static assert(false, "Unsupported platform");
942 // Spinlock (SPI)
945 int pthread_spin_destroy(pthread_spinlock_t*);
946 int pthread_spin_init(pthread_spinlock_t*, int);
947 int pthread_spin_lock(pthread_spinlock_t*);
948 int pthread_spin_trylock(pthread_spinlock_t*);
949 int pthread_spin_unlock(pthread_spinlock_t*);
952 version (CRuntime_Glibc)
954 int pthread_spin_destroy(pthread_spinlock_t*);
955 int pthread_spin_init(pthread_spinlock_t*, int);
956 int pthread_spin_lock(pthread_spinlock_t*);
957 int pthread_spin_trylock(pthread_spinlock_t*);
958 int pthread_spin_unlock(pthread_spinlock_t*);
960 else version (FreeBSD)
962 int pthread_spin_init(pthread_spinlock_t*, int);
963 int pthread_spin_destroy(pthread_spinlock_t*);
964 int pthread_spin_lock(pthread_spinlock_t*);
965 int pthread_spin_trylock(pthread_spinlock_t*);
966 int pthread_spin_unlock(pthread_spinlock_t*);
968 else version (DragonFlyBSD)
970 int pthread_spin_init(pthread_spinlock_t*, int);
971 int pthread_spin_destroy(pthread_spinlock_t*);
972 int pthread_spin_lock(pthread_spinlock_t*);
973 int pthread_spin_trylock(pthread_spinlock_t*);
974 int pthread_spin_unlock(pthread_spinlock_t*);
976 else version (NetBSD)
978 int pthread_spin_init(pthread_spinlock_t*, int);
979 int pthread_spin_destroy(pthread_spinlock_t*);
980 int pthread_spin_lock(pthread_spinlock_t*);
981 int pthread_spin_trylock(pthread_spinlock_t*);
982 int pthread_spin_unlock(pthread_spinlock_t*);
984 else version (OpenBSD)
986 int pthread_spin_init(pthread_spinlock_t*, int);
987 int pthread_spin_destroy(pthread_spinlock_t*);
988 int pthread_spin_lock(pthread_spinlock_t*);
989 int pthread_spin_trylock(pthread_spinlock_t*);
990 int pthread_spin_unlock(pthread_spinlock_t*);
992 else version (Darwin)
995 else version (Solaris)
997 int pthread_spin_init(pthread_spinlock_t*, int);
998 int pthread_spin_destroy(pthread_spinlock_t*);
999 int pthread_spin_lock(pthread_spinlock_t*);
1000 int pthread_spin_trylock(pthread_spinlock_t*);
1001 int pthread_spin_unlock(pthread_spinlock_t*);
1003 else version (CRuntime_Bionic)
1006 else version (CRuntime_Musl)
1008 int pthread_spin_destroy(pthread_spinlock_t*);
1009 int pthread_spin_init(pthread_spinlock_t*, int);
1010 int pthread_spin_lock(pthread_spinlock_t*);
1011 int pthread_spin_trylock(pthread_spinlock_t*);
1012 int pthread_spin_unlock(pthread_spinlock_t*);
1014 else version (CRuntime_UClibc)
1016 int pthread_spin_destroy(pthread_spinlock_t*);
1017 int pthread_spin_init(pthread_spinlock_t*, int);
1018 int pthread_spin_lock(pthread_spinlock_t*);
1019 int pthread_spin_trylock(pthread_spinlock_t*);
1020 int pthread_spin_unlock(pthread_spinlock_t*);
1022 else
1024 static assert(false, "Unsupported platform");
1028 // XOpen (XSI)
1031 PTHREAD_MUTEX_DEFAULT
1032 PTHREAD_MUTEX_ERRORCHECK
1033 PTHREAD_MUTEX_NORMAL
1034 PTHREAD_MUTEX_RECURSIVE
1036 int pthread_attr_getguardsize(const scope pthread_attr_t*, size_t*);
1037 int pthread_attr_setguardsize(pthread_attr_t*, size_t);
1038 int pthread_getconcurrency();
1039 int pthread_mutexattr_gettype(const scope pthread_mutexattr_t*, int*);
1040 int pthread_mutexattr_settype(pthread_mutexattr_t*, int);
1041 int pthread_setconcurrency(int);
1044 version (CRuntime_Glibc)
1046 enum PTHREAD_MUTEX_NORMAL = 0;
1047 enum PTHREAD_MUTEX_RECURSIVE = 1;
1048 enum PTHREAD_MUTEX_ERRORCHECK = 2;
1049 enum PTHREAD_MUTEX_DEFAULT = PTHREAD_MUTEX_NORMAL;
1051 int pthread_attr_getguardsize(const scope pthread_attr_t*, size_t*);
1052 int pthread_attr_setguardsize(pthread_attr_t*, size_t);
1053 int pthread_getconcurrency();
1054 int pthread_mutexattr_gettype(const scope pthread_mutexattr_t*, int*);
1055 int pthread_mutexattr_settype(pthread_mutexattr_t*, int) @trusted;
1056 int pthread_setconcurrency(int);
1058 else version (Darwin)
1060 enum PTHREAD_MUTEX_NORMAL = 0;
1061 enum PTHREAD_MUTEX_ERRORCHECK = 1;
1062 enum PTHREAD_MUTEX_RECURSIVE = 2;
1063 enum PTHREAD_MUTEX_DEFAULT = PTHREAD_MUTEX_NORMAL;
1065 int pthread_attr_getguardsize(const scope pthread_attr_t*, size_t*);
1066 int pthread_attr_setguardsize(pthread_attr_t*, size_t);
1067 int pthread_getconcurrency();
1068 int pthread_mutexattr_gettype(const scope pthread_mutexattr_t*, int*);
1069 int pthread_mutexattr_settype(pthread_mutexattr_t*, int) @trusted;
1070 int pthread_setconcurrency(int);
1072 else version (FreeBSD)
1074 enum
1076 PTHREAD_MUTEX_ERRORCHECK = 1,
1077 PTHREAD_MUTEX_RECURSIVE = 2,
1078 PTHREAD_MUTEX_NORMAL = 3,
1079 PTHREAD_MUTEX_ADAPTIVE_NP = 4,
1080 PTHREAD_MUTEX_TYPE_MAX
1082 enum PTHREAD_MUTEX_DEFAULT = PTHREAD_MUTEX_ERRORCHECK;
1084 int pthread_attr_getguardsize(const scope pthread_attr_t*, size_t*);
1085 int pthread_attr_setguardsize(pthread_attr_t*, size_t);
1086 int pthread_getconcurrency();
1087 int pthread_mutexattr_gettype(pthread_mutexattr_t*, int*);
1088 int pthread_mutexattr_settype(pthread_mutexattr_t*, int) @trusted;
1089 int pthread_setconcurrency(int);
1091 else version (NetBSD)
1093 enum
1095 PTHREAD_MUTEX_NORMAL = 0,
1096 PTHREAD_MUTEX_ERRORCHECK = 1,
1097 PTHREAD_MUTEX_RECURSIVE = 2,
1098 PTHREAD_MUTEX_TYPE_MAX
1100 enum PTHREAD_MUTEX_DEFAULT = PTHREAD_MUTEX_ERRORCHECK;
1102 int pthread_attr_getguardsize(const scope pthread_attr_t*, size_t*);
1103 int pthread_attr_setguardsize(pthread_attr_t*, size_t);
1104 int pthread_getconcurrency();
1105 int pthread_mutexattr_gettype(pthread_mutexattr_t*, int*);
1106 int pthread_mutexattr_settype(pthread_mutexattr_t*, int) @trusted;
1107 int pthread_setconcurrency(int);
1109 else version (OpenBSD)
1111 enum
1113 PTHREAD_MUTEX_ERRORCHECK = 1,
1114 PTHREAD_MUTEX_RECURSIVE = 2,
1115 PTHREAD_MUTEX_NORMAL = 3,
1116 PTHREAD_MUTEX_ADAPTIVE_NP = 4,
1117 PTHREAD_MUTEX_TYPE_MAX
1119 enum PTHREAD_MUTEX_DEFAULT = PTHREAD_MUTEX_ERRORCHECK;
1121 int pthread_attr_getguardsize(const scope pthread_attr_t*, size_t*);
1122 int pthread_attr_setguardsize(pthread_attr_t*, size_t);
1123 int pthread_getconcurrency();
1124 int pthread_mutexattr_gettype(pthread_mutexattr_t*, int*);
1125 int pthread_mutexattr_settype(pthread_mutexattr_t*, int) @trusted;
1126 int pthread_setconcurrency(int);
1128 else version (DragonFlyBSD)
1130 enum
1132 PTHREAD_MUTEX_ERRORCHECK = 1,
1133 PTHREAD_MUTEX_RECURSIVE = 2,
1134 PTHREAD_MUTEX_NORMAL = 3,
1135 PTHREAD_MUTEX_TYPE_MAX
1137 enum PTHREAD_MUTEX_DEFAULT = PTHREAD_MUTEX_ERRORCHECK;
1139 int pthread_attr_getguardsize(const scope pthread_attr_t*, size_t*);
1140 int pthread_attr_setguardsize(pthread_attr_t*, size_t);
1141 int pthread_getconcurrency();
1142 int pthread_mutexattr_gettype(pthread_mutexattr_t*, int*);
1143 int pthread_mutexattr_settype(pthread_mutexattr_t*, int) @trusted;
1144 int pthread_setconcurrency(int);
1146 else version (Solaris)
1148 enum
1150 PTHREAD_MUTEX_ERRORCHECK = 2,
1151 PTHREAD_MUTEX_RECURSIVE = 4,
1152 PTHREAD_MUTEX_NORMAL = 0,
1155 enum PTHREAD_MUTEX_DEFAULT = PTHREAD_MUTEX_NORMAL;
1157 int pthread_attr_getguardsize(const scope pthread_attr_t*, size_t*);
1158 int pthread_attr_setguardsize(pthread_attr_t*, size_t);
1159 int pthread_getconcurrency();
1160 int pthread_mutexattr_gettype(pthread_mutexattr_t*, int*);
1161 int pthread_mutexattr_settype(pthread_mutexattr_t*, int) @trusted;
1162 int pthread_setconcurrency(int);
1164 else version (CRuntime_Bionic)
1166 enum PTHREAD_MUTEX_NORMAL = 0;
1167 enum PTHREAD_MUTEX_RECURSIVE = 1;
1168 enum PTHREAD_MUTEX_ERRORCHECK = 2;
1169 enum PTHREAD_MUTEX_DEFAULT = PTHREAD_MUTEX_NORMAL;
1171 int pthread_attr_getguardsize(const scope pthread_attr_t*, size_t*);
1172 int pthread_attr_setguardsize(pthread_attr_t*, size_t);
1173 int pthread_mutexattr_gettype(const scope pthread_mutexattr_t*, int*);
1174 int pthread_mutexattr_settype(pthread_mutexattr_t*, int) @trusted;
1176 else version (CRuntime_Musl)
1178 enum {
1179 PTHREAD_MUTEX_NORMAL = 0,
1180 PTHREAD_MUTEX_RECURSIVE = 1,
1181 PTHREAD_MUTEX_ERRORCHECK = 2,
1182 PTHREAD_MUTEX_DEFAULT = PTHREAD_MUTEX_NORMAL,
1184 int pthread_mutexattr_settype(pthread_mutexattr_t*, int) @trusted;
1186 else version (CRuntime_UClibc)
1188 enum
1190 PTHREAD_MUTEX_TIMED_NP,
1191 PTHREAD_MUTEX_RECURSIVE_NP,
1192 PTHREAD_MUTEX_ERRORCHECK_NP,
1193 PTHREAD_MUTEX_ADAPTIVE_NP,
1194 PTHREAD_MUTEX_NORMAL = PTHREAD_MUTEX_TIMED_NP,
1195 PTHREAD_MUTEX_RECURSIVE = PTHREAD_MUTEX_RECURSIVE_NP,
1196 PTHREAD_MUTEX_ERRORCHECK = PTHREAD_MUTEX_ERRORCHECK_NP,
1197 PTHREAD_MUTEX_DEFAULT = PTHREAD_MUTEX_NORMAL,
1198 PTHREAD_MUTEX_FAST_NP = PTHREAD_MUTEX_TIMED_NP
1201 int pthread_attr_getguardsize(const scope pthread_attr_t*, size_t*);
1202 int pthread_attr_setguardsize(pthread_attr_t*, size_t);
1203 int pthread_getconcurrency();
1204 int pthread_mutexattr_gettype(const scope pthread_mutexattr_t*, int*);
1205 int pthread_mutexattr_settype(pthread_mutexattr_t*, int) @trusted;
1206 int pthread_setconcurrency(int);
1208 else
1210 static assert(false, "Unsupported platform");
1214 // CPU Time (TCT)
1217 int pthread_getcpuclockid(pthread_t, clockid_t*);
1220 version (CRuntime_Glibc)
1222 int pthread_getcpuclockid(pthread_t, clockid_t*);
1224 else version (FreeBSD)
1226 int pthread_getcpuclockid(pthread_t, clockid_t*);
1228 else version (DragonFlyBSD)
1230 int pthread_getcpuclockid(pthread_t, clockid_t*);
1232 else version (NetBSD)
1235 else version (OpenBSD)
1237 int pthread_getcpuclockid(pthread_t, clockid_t*);
1239 else version (Darwin)
1242 else version (Solaris)
1245 else version (CRuntime_Bionic)
1247 int pthread_getcpuclockid(pthread_t, clockid_t*);
1249 else version (CRuntime_Musl)
1251 int pthread_getcpuclockid(pthread_t, clockid_t*);
1253 else version (CRuntime_UClibc)
1255 int pthread_getcpuclockid(pthread_t, clockid_t*);
1257 else
1259 static assert(false, "Unsupported platform");
1263 // Timeouts (TMO)
1266 int pthread_mutex_timedlock(pthread_mutex_t*, const scope timespec*);
1267 int pthread_rwlock_timedrdlock(pthread_rwlock_t*, const scope timespec*);
1268 int pthread_rwlock_timedwrlock(pthread_rwlock_t*, const scope timespec*);
1271 version (CRuntime_Glibc)
1273 int pthread_mutex_timedlock(pthread_mutex_t*, const scope timespec*);
1274 int pthread_rwlock_timedrdlock(pthread_rwlock_t*, const scope timespec*);
1275 int pthread_rwlock_timedwrlock(pthread_rwlock_t*, const scope timespec*);
1277 else version (Darwin)
1279 int pthread_mutex_timedlock(pthread_mutex_t*, const scope timespec*);
1280 int pthread_rwlock_timedrdlock(pthread_rwlock_t*, const scope timespec*);
1281 int pthread_rwlock_timedwrlock(pthread_rwlock_t*, const scope timespec*);
1283 else version (FreeBSD)
1285 int pthread_mutex_timedlock(pthread_mutex_t*, const scope timespec*);
1286 int pthread_rwlock_timedrdlock(pthread_rwlock_t*, const scope timespec*);
1287 int pthread_rwlock_timedwrlock(pthread_rwlock_t*, const scope timespec*);
1289 else version (NetBSD)
1291 int pthread_mutex_timedlock(pthread_mutex_t*, const scope timespec*);
1292 int pthread_rwlock_timedrdlock(pthread_rwlock_t*, const scope timespec*);
1293 int pthread_rwlock_timedwrlock(pthread_rwlock_t*, const scope timespec*);
1295 else version (OpenBSD)
1297 int pthread_mutex_timedlock(pthread_mutex_t*, const scope timespec*);
1298 int pthread_rwlock_timedrdlock(pthread_rwlock_t*, const scope timespec*);
1299 int pthread_rwlock_timedwrlock(pthread_rwlock_t*, const scope timespec*);
1301 else version (DragonFlyBSD)
1303 int pthread_mutex_timedlock(pthread_mutex_t*, const scope timespec*);
1304 int pthread_rwlock_timedrdlock(pthread_rwlock_t*, const scope timespec*);
1305 int pthread_rwlock_timedwrlock(pthread_rwlock_t*, const scope timespec*);
1307 else version (Solaris)
1309 int pthread_mutex_timedlock(pthread_mutex_t*, const scope timespec*);
1310 int pthread_rwlock_timedrdlock(pthread_rwlock_t*, const scope timespec*);
1311 int pthread_rwlock_timedwrlock(pthread_rwlock_t*, const scope timespec*);
1313 else version (CRuntime_Bionic)
1315 int pthread_rwlock_timedrdlock(pthread_rwlock_t*, const scope timespec*);
1316 int pthread_rwlock_timedwrlock(pthread_rwlock_t*, const scope timespec*);
1318 else version (CRuntime_Musl)
1320 int pthread_mutex_timedlock(pthread_mutex_t*, const scope timespec*);
1321 int pthread_rwlock_timedrdlock(pthread_rwlock_t*, const scope timespec*);
1322 int pthread_rwlock_timedwrlock(pthread_rwlock_t*, const scope timespec*);
1324 else version (CRuntime_UClibc)
1326 int pthread_mutex_timedlock(pthread_mutex_t*, const scope timespec*);
1327 int pthread_rwlock_timedrdlock(pthread_rwlock_t*, const scope timespec*);
1328 int pthread_rwlock_timedwrlock(pthread_rwlock_t*, const scope timespec*);
1330 else
1332 static assert(false, "Unsupported platform");
1336 // Priority (TPI|TPP)
1339 PTHREAD_PRIO_INHERIT (TPI)
1340 PTHREAD_PRIO_NONE (TPP|TPI)
1341 PTHREAD_PRIO_PROTECT (TPI)
1343 int pthread_mutex_getprioceiling(const scope pthread_mutex_t*, int*); (TPP)
1344 int pthread_mutex_setprioceiling(pthread_mutex_t*, int, int*); (TPP)
1345 int pthread_mutexattr_getprioceiling(pthread_mutexattr_t*, int*); (TPP)
1346 int pthread_mutexattr_getprotocol(const scope pthread_mutexattr_t*, int*); (TPI|TPP)
1347 int pthread_mutexattr_setprioceiling(pthread_mutexattr_t*, int); (TPP)
1348 int pthread_mutexattr_setprotocol(pthread_mutexattr_t*, int); (TPI|TPP)
1350 version (Darwin)
1352 enum
1354 PTHREAD_PRIO_NONE,
1355 PTHREAD_PRIO_INHERIT,
1356 PTHREAD_PRIO_PROTECT
1359 int pthread_mutex_getprioceiling(const scope pthread_mutex_t*, int*);
1360 int pthread_mutex_setprioceiling(pthread_mutex_t*, int, int*);
1361 int pthread_mutexattr_getprioceiling(const scope pthread_mutexattr_t*, int*);
1362 int pthread_mutexattr_getprotocol(const scope pthread_mutexattr_t*, int*);
1363 int pthread_mutexattr_setprioceiling(pthread_mutexattr_t*, int);
1364 int pthread_mutexattr_setprotocol(pthread_mutexattr_t*, int);
1366 else version (Solaris)
1368 enum
1370 PTHREAD_PRIO_NONE = 0x00,
1371 PTHREAD_PRIO_INHERIT = 0x10,
1372 PTHREAD_PRIO_PROTECT = 0x20,
1375 int pthread_mutex_getprioceiling(const scope pthread_mutex_t*, int*);
1376 int pthread_mutex_setprioceiling(pthread_mutex_t*, int, int*);
1377 int pthread_mutexattr_getprioceiling(const scope pthread_mutexattr_t*, int*);
1378 int pthread_mutexattr_getprotocol(const scope pthread_mutexattr_t*, int*);
1379 int pthread_mutexattr_setprioceiling(pthread_mutexattr_t*, int);
1380 int pthread_mutexattr_setprotocol(pthread_mutexattr_t*, int);
1384 // Scheduling (TPS)
1387 PTHREAD_SCOPE_PROCESS
1388 PTHREAD_SCOPE_SYSTEM
1390 int pthread_attr_getinheritsched(const scope pthread_attr_t*, int*);
1391 int pthread_attr_getschedpolicy(const scope pthread_attr_t*, int*);
1392 int pthread_attr_getscope(const scope pthread_attr_t*, int*);
1393 int pthread_attr_setinheritsched(pthread_attr_t*, int);
1394 int pthread_attr_setschedpolicy(pthread_attr_t*, int);
1395 int pthread_attr_setscope(pthread_attr_t*, int);
1396 int pthread_getschedparam(pthread_t, int*, sched_param*);
1397 int pthread_setschedparam(pthread_t, int, const scope sched_param*);
1398 int pthread_setschedprio(pthread_t, int);
1401 version (CRuntime_Glibc)
1403 enum
1405 PTHREAD_SCOPE_SYSTEM,
1406 PTHREAD_SCOPE_PROCESS
1409 int pthread_attr_getinheritsched(const scope pthread_attr_t*, int*);
1410 int pthread_attr_getschedpolicy(const scope pthread_attr_t*, int*);
1411 int pthread_attr_getscope(const scope pthread_attr_t*, int*);
1412 int pthread_attr_setinheritsched(pthread_attr_t*, int);
1413 int pthread_attr_setschedpolicy(pthread_attr_t*, int);
1414 int pthread_attr_setscope(pthread_attr_t*, int);
1415 int pthread_getschedparam(pthread_t, int*, sched_param*);
1416 int pthread_setschedparam(pthread_t, int, const scope sched_param*);
1417 int pthread_setschedprio(pthread_t, int);
1419 else version (Darwin)
1421 enum
1423 PTHREAD_SCOPE_SYSTEM = 1,
1424 PTHREAD_SCOPE_PROCESS = 2
1427 int pthread_attr_getinheritsched(const scope pthread_attr_t*, int*);
1428 int pthread_attr_getschedpolicy(const scope pthread_attr_t*, int*);
1429 int pthread_attr_getscope(const scope pthread_attr_t*, int*);
1430 int pthread_attr_setinheritsched(pthread_attr_t*, int);
1431 int pthread_attr_setschedpolicy(pthread_attr_t*, int);
1432 int pthread_attr_setscope(pthread_attr_t*, int);
1433 int pthread_getschedparam(pthread_t, int*, sched_param*);
1434 int pthread_setschedparam(pthread_t, int, const scope sched_param*);
1435 // int pthread_setschedprio(pthread_t, int); // not implemented
1437 else version (FreeBSD)
1439 enum
1441 PTHREAD_SCOPE_PROCESS = 0,
1442 PTHREAD_SCOPE_SYSTEM = 0x2
1445 int pthread_attr_getinheritsched(const scope pthread_attr_t*, int*);
1446 int pthread_attr_getschedpolicy(const scope pthread_attr_t*, int*);
1447 int pthread_attr_getscope(const scope pthread_attr_t*, int*);
1448 int pthread_attr_setinheritsched(pthread_attr_t*, int);
1449 int pthread_attr_setschedpolicy(pthread_attr_t*, int);
1450 int pthread_attr_setscope(const scope pthread_attr_t*, int);
1451 int pthread_getschedparam(pthread_t, int*, sched_param*);
1452 int pthread_setschedparam(pthread_t, int, sched_param*);
1453 // int pthread_setschedprio(pthread_t, int); // not implemented
1455 else version (NetBSD)
1457 enum
1459 PTHREAD_SCOPE_PROCESS = 0,
1460 PTHREAD_SCOPE_SYSTEM = 0x1
1463 int pthread_attr_getinheritsched(const scope pthread_attr_t*, int*);
1464 int pthread_attr_getschedpolicy(const scope pthread_attr_t*, int*);
1465 int pthread_attr_getscope(const scope pthread_attr_t*, int*);
1466 int pthread_attr_setinheritsched(pthread_attr_t*, int);
1467 int pthread_attr_setschedpolicy(pthread_attr_t*, int);
1468 int pthread_attr_setscope(const scope pthread_attr_t*, int);
1469 int pthread_getschedparam(pthread_t, int*, sched_param*);
1470 int pthread_setschedparam(pthread_t, int, sched_param*);
1471 //int pthread_setschedprio(pthread_t, int);
1473 else version (OpenBSD)
1475 enum
1477 PTHREAD_SCOPE_PROCESS = 0,
1478 PTHREAD_SCOPE_SYSTEM = 0x2
1481 int pthread_attr_getinheritsched(const scope pthread_attr_t*, int*);
1482 int pthread_attr_getschedpolicy(const scope pthread_attr_t*, int*);
1483 int pthread_attr_getscope(const scope pthread_attr_t*, int*);
1484 int pthread_attr_setinheritsched(pthread_attr_t*, int);
1485 int pthread_attr_setschedpolicy(pthread_attr_t*, int);
1486 int pthread_attr_setscope(const scope pthread_attr_t*, int);
1487 int pthread_getschedparam(pthread_t, int*, sched_param*);
1488 int pthread_setschedparam(pthread_t, int, sched_param*);
1489 // int pthread_setschedprio(pthread_t, int); // not implemented
1491 else version (DragonFlyBSD)
1493 enum
1495 PTHREAD_SCOPE_PROCESS = 0,
1496 PTHREAD_SCOPE_SYSTEM = 0x2
1499 int pthread_attr_getinheritsched(const scope pthread_attr_t*, int*);
1500 int pthread_attr_getschedpolicy(const scope pthread_attr_t*, int*);
1501 int pthread_attr_getscope(const scope pthread_attr_t*, int*);
1502 int pthread_attr_setinheritsched(pthread_attr_t*, int);
1503 int pthread_attr_setschedpolicy(pthread_attr_t*, int);
1504 int pthread_attr_setscope(const scope pthread_attr_t*, int);
1505 int pthread_getschedparam(pthread_t, int*, sched_param*);
1506 int pthread_setschedparam(pthread_t, int, sched_param*);
1508 else version (Solaris)
1510 enum
1512 PTHREAD_SCOPE_PROCESS = 0,
1513 PTHREAD_SCOPE_SYSTEM = 1,
1516 int pthread_attr_getinheritsched(const scope pthread_attr_t*, int*);
1517 int pthread_attr_getschedpolicy(const scope pthread_attr_t*, int*);
1518 int pthread_attr_getscope(const scope pthread_attr_t*, int*);
1519 int pthread_attr_setinheritsched(pthread_attr_t*, int);
1520 int pthread_attr_setschedpolicy(pthread_attr_t*, int);
1521 int pthread_attr_setscope(const scope pthread_attr_t*, int);
1522 int pthread_getschedparam(pthread_t, int*, sched_param*);
1523 int pthread_setschedparam(pthread_t, int, sched_param*);
1524 int pthread_setschedprio(pthread_t, int);
1526 else version (CRuntime_Bionic)
1528 enum
1530 PTHREAD_SCOPE_SYSTEM,
1531 PTHREAD_SCOPE_PROCESS
1534 int pthread_attr_getschedpolicy(const scope pthread_attr_t*, int*);
1535 int pthread_attr_getscope(const scope pthread_attr_t*);
1536 int pthread_attr_setschedpolicy(pthread_attr_t*, int);
1537 int pthread_attr_setscope(pthread_attr_t*, int);
1538 int pthread_getschedparam(pthread_t, int*, sched_param*);
1539 int pthread_setschedparam(pthread_t, int, const scope sched_param*);
1541 else version (CRuntime_Musl)
1543 enum
1545 PTHREAD_SCOPE_SYSTEM,
1546 PTHREAD_SCOPE_PROCESS
1549 int pthread_getschedparam(pthread_t, int*, sched_param*);
1550 int pthread_setschedparam(pthread_t, int, const scope sched_param*);
1551 int pthread_setschedprio(pthread_t, int);
1553 else version (CRuntime_UClibc)
1555 enum
1557 PTHREAD_SCOPE_SYSTEM,
1558 PTHREAD_SCOPE_PROCESS
1561 int pthread_attr_getinheritsched(const scope pthread_attr_t*, int*);
1562 int pthread_attr_getschedpolicy(const scope pthread_attr_t*, int*);
1563 int pthread_attr_getscope(const scope pthread_attr_t*, int*);
1564 int pthread_attr_setinheritsched(pthread_attr_t*, int);
1565 int pthread_attr_setschedpolicy(pthread_attr_t*, int);
1566 int pthread_attr_setscope(pthread_attr_t*, int);
1567 int pthread_getschedparam(pthread_t, int*, sched_param*);
1568 int pthread_setschedparam(pthread_t, int, const scope sched_param*);
1569 int pthread_setschedprio(pthread_t, int);
1571 else
1573 static assert(false, "Unsupported platform");
1577 // Stack (TSA|TSS)
1580 int pthread_attr_getstack(const scope pthread_attr_t*, void**, size_t*); (TSA|TSS)
1581 int pthread_attr_getstackaddr(const scope pthread_attr_t*, void**); (TSA)
1582 int pthread_attr_getstacksize(const scope pthread_attr_t*, size_t*); (TSS)
1583 int pthread_attr_setstack(pthread_attr_t*, void*, size_t); (TSA|TSS)
1584 int pthread_attr_setstackaddr(pthread_attr_t*, void*); (TSA)
1585 int pthread_attr_setstacksize(pthread_attr_t*, size_t); (TSS)
1588 version (CRuntime_Glibc)
1590 int pthread_attr_getstack(const scope pthread_attr_t*, void**, size_t*);
1591 int pthread_attr_getstackaddr(const scope pthread_attr_t*, void**);
1592 int pthread_attr_getstacksize(const scope pthread_attr_t*, size_t*);
1593 int pthread_attr_setstack(pthread_attr_t*, void*, size_t);
1594 int pthread_attr_setstackaddr(pthread_attr_t*, void*);
1595 int pthread_attr_setstacksize(pthread_attr_t*, size_t);
1597 else version (Darwin)
1599 int pthread_attr_getstack(const scope pthread_attr_t*, void**, size_t*);
1600 int pthread_attr_getstackaddr(const scope pthread_attr_t*, void**);
1601 int pthread_attr_getstacksize(const scope pthread_attr_t*, size_t*);
1602 int pthread_attr_setstack(pthread_attr_t*, void*, size_t);
1603 int pthread_attr_setstackaddr(pthread_attr_t*, void*);
1604 int pthread_attr_setstacksize(pthread_attr_t*, size_t);
1606 else version (FreeBSD)
1608 int pthread_attr_getstack(const scope pthread_attr_t*, void**, size_t*);
1609 int pthread_attr_getstackaddr(const scope pthread_attr_t*, void**);
1610 int pthread_attr_getstacksize(const scope pthread_attr_t*, size_t*);
1611 int pthread_attr_setstack(pthread_attr_t*, void*, size_t);
1612 int pthread_attr_setstackaddr(pthread_attr_t*, void*);
1613 int pthread_attr_setstacksize(pthread_attr_t*, size_t);
1615 else version (NetBSD)
1617 int pthread_attr_getstack(const scope pthread_attr_t*, void**, size_t*);
1618 int pthread_attr_getstackaddr(const scope pthread_attr_t*, void**);
1619 int pthread_attr_getstacksize(const scope pthread_attr_t*, size_t*);
1620 int pthread_attr_setstack(pthread_attr_t*, void*, size_t);
1621 int pthread_attr_setstackaddr(pthread_attr_t*, void*);
1622 int pthread_attr_setstacksize(pthread_attr_t*, size_t);
1624 else version (OpenBSD)
1626 int pthread_attr_getstack(const scope pthread_attr_t*, void**, size_t*);
1627 int pthread_attr_getstackaddr(const scope pthread_attr_t*, void**);
1628 int pthread_attr_getstacksize(const scope pthread_attr_t*, size_t*);
1629 int pthread_attr_setstack(pthread_attr_t*, void*, size_t);
1630 int pthread_attr_setstackaddr(pthread_attr_t*, void*);
1631 int pthread_attr_setstacksize(pthread_attr_t*, size_t);
1633 else version (DragonFlyBSD)
1635 int pthread_attr_getstack(const scope pthread_attr_t*, void**, size_t*);
1636 int pthread_attr_getstackaddr(const scope pthread_attr_t*, void**);
1637 int pthread_attr_getstacksize(const scope pthread_attr_t*, size_t*);
1638 int pthread_attr_setstack(pthread_attr_t*, void*, size_t);
1639 int pthread_attr_setstackaddr(pthread_attr_t*, void*);
1640 int pthread_attr_setstacksize(pthread_attr_t*, size_t);
1642 else version (Solaris)
1644 int pthread_attr_getstack(const scope pthread_attr_t*, void**, size_t*);
1645 int pthread_attr_getstackaddr(const scope pthread_attr_t*, void**);
1646 int pthread_attr_getstacksize(const scope pthread_attr_t*, size_t*);
1647 int pthread_attr_setstack(pthread_attr_t*, void*, size_t);
1648 int pthread_attr_setstackaddr(pthread_attr_t*, void*);
1649 int pthread_attr_setstacksize(pthread_attr_t*, size_t);
1651 else version (CRuntime_Bionic)
1653 int pthread_attr_getstack(const scope pthread_attr_t*, void**, size_t*);
1654 int pthread_attr_getstackaddr(const scope pthread_attr_t*, void**);
1655 int pthread_attr_getstacksize(const scope pthread_attr_t*, size_t*);
1656 int pthread_attr_setstack(pthread_attr_t*, void*, size_t);
1657 int pthread_attr_setstackaddr(pthread_attr_t*, void*);
1658 int pthread_attr_setstacksize(pthread_attr_t*, size_t);
1660 else version (CRuntime_Musl)
1662 int pthread_attr_getstack(const scope pthread_attr_t*, void**, size_t*);
1663 int pthread_attr_setstacksize(pthread_attr_t*, size_t);
1665 else version (CRuntime_UClibc)
1667 int pthread_attr_getstack(const scope pthread_attr_t*, void**, size_t*);
1668 int pthread_attr_getstackaddr(const scope pthread_attr_t*, void**);
1669 int pthread_attr_getstacksize(const scope pthread_attr_t*, size_t*);
1670 int pthread_attr_setstack(pthread_attr_t*, void*, size_t);
1671 int pthread_attr_setstackaddr(pthread_attr_t*, void*);
1672 int pthread_attr_setstacksize(pthread_attr_t*, size_t);
1674 else
1676 static assert(false, "Unsupported platform");
1680 // Shared Synchronization (TSH)
1683 int pthread_condattr_getpshared(const scope pthread_condattr_t*, int*);
1684 int pthread_condattr_setpshared(pthread_condattr_t*, int);
1685 int pthread_mutexattr_getpshared(const scope pthread_mutexattr_t*, int*);
1686 int pthread_mutexattr_setpshared(pthread_mutexattr_t*, int);
1687 int pthread_rwlockattr_getpshared(const scope pthread_rwlockattr_t*, int*);
1688 int pthread_rwlockattr_setpshared(pthread_rwlockattr_t*, int);
1691 version (CRuntime_Glibc)
1693 int pthread_condattr_getpshared(const scope pthread_condattr_t*, int*);
1694 int pthread_condattr_setpshared(pthread_condattr_t*, int);
1695 int pthread_mutexattr_getpshared(const scope pthread_mutexattr_t*, int*);
1696 int pthread_mutexattr_setpshared(pthread_mutexattr_t*, int);
1697 int pthread_rwlockattr_getpshared(const scope pthread_rwlockattr_t*, int*);
1698 int pthread_rwlockattr_setpshared(pthread_rwlockattr_t*, int);
1700 else version (FreeBSD)
1702 int pthread_condattr_getpshared(const scope pthread_condattr_t*, int*);
1703 int pthread_condattr_setpshared(pthread_condattr_t*, int);
1704 int pthread_mutexattr_getpshared(const scope pthread_mutexattr_t*, int*);
1705 int pthread_mutexattr_setpshared(pthread_mutexattr_t*, int);
1706 int pthread_rwlockattr_getpshared(const scope pthread_rwlockattr_t*, int*);
1707 int pthread_rwlockattr_setpshared(pthread_rwlockattr_t*, int);
1709 else version (NetBSD)
1711 int pthread_condattr_getpshared(const scope pthread_condattr_t*, int*);
1712 int pthread_condattr_setpshared(pthread_condattr_t*, int);
1713 int pthread_mutexattr_getpshared(const scope pthread_mutexattr_t*, int*);
1714 int pthread_mutexattr_setpshared(pthread_mutexattr_t*, int);
1715 int pthread_rwlockattr_getpshared(const scope pthread_rwlockattr_t*, int*);
1716 int pthread_rwlockattr_setpshared(pthread_rwlockattr_t*, int);
1718 else version (OpenBSD)
1721 else version (DragonFlyBSD)
1723 int pthread_condattr_getpshared(const scope pthread_condattr_t*, int*);
1724 int pthread_condattr_setpshared(pthread_condattr_t*, int);
1725 int pthread_mutexattr_getpshared(const scope pthread_mutexattr_t*, int*);
1726 int pthread_mutexattr_setpshared(pthread_mutexattr_t*, int);
1727 int pthread_rwlockattr_getpshared(const scope pthread_rwlockattr_t*, int*);
1728 int pthread_rwlockattr_setpshared(pthread_rwlockattr_t*, int);
1730 else version (Darwin)
1732 int pthread_condattr_getpshared(const scope pthread_condattr_t*, int*);
1733 int pthread_condattr_setpshared(pthread_condattr_t*, int);
1734 int pthread_mutexattr_getpshared(const scope pthread_mutexattr_t*, int*);
1735 int pthread_mutexattr_setpshared(pthread_mutexattr_t*, int);
1736 int pthread_rwlockattr_getpshared(const scope pthread_rwlockattr_t*, int*);
1737 int pthread_rwlockattr_setpshared(pthread_rwlockattr_t*, int);
1739 else version (Solaris)
1741 int pthread_condattr_getpshared(const scope pthread_condattr_t*, int*);
1742 int pthread_condattr_setpshared(pthread_condattr_t*, int);
1743 int pthread_mutexattr_getpshared(const scope pthread_mutexattr_t*, int*);
1744 int pthread_mutexattr_setpshared(pthread_mutexattr_t*, int);
1745 int pthread_rwlockattr_getpshared(const scope pthread_rwlockattr_t*, int*);
1746 int pthread_rwlockattr_setpshared(pthread_rwlockattr_t*, int);
1748 else version (CRuntime_Bionic)
1750 int pthread_condattr_getpshared(pthread_condattr_t*, int*);
1751 int pthread_condattr_setpshared(pthread_condattr_t*, int);
1752 int pthread_mutexattr_getpshared(pthread_mutexattr_t*, int*);
1753 int pthread_mutexattr_setpshared(pthread_mutexattr_t*, int);
1754 int pthread_rwlockattr_getpshared(pthread_rwlockattr_t*, int*);
1755 int pthread_rwlockattr_setpshared(pthread_rwlockattr_t*, int);
1757 else version (CRuntime_Musl)
1759 int pthread_condattr_getpshared(pthread_condattr_t*, int*);
1760 int pthread_condattr_setpshared(pthread_condattr_t*, int);
1761 int pthread_mutexattr_getpshared(pthread_mutexattr_t*, int*);
1762 int pthread_mutexattr_setpshared(pthread_mutexattr_t*, int);
1763 int pthread_rwlockattr_getpshared(pthread_rwlockattr_t*, int*);
1764 int pthread_rwlockattr_setpshared(pthread_rwlockattr_t*, int);
1766 else version (CRuntime_UClibc)
1768 int pthread_condattr_getpshared(const scope pthread_condattr_t*, int*);
1769 int pthread_condattr_setpshared(pthread_condattr_t*, int);
1770 int pthread_mutexattr_getpshared(const scope pthread_mutexattr_t*, int*);
1771 int pthread_mutexattr_setpshared(pthread_mutexattr_t*, int);
1772 int pthread_rwlockattr_getpshared(const scope pthread_rwlockattr_t*, int*);
1773 int pthread_rwlockattr_setpshared(pthread_rwlockattr_t*, int);
1775 else
1777 static assert(false, "Unsupported platform");