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).
8 * Standards: The Open Group Base Specifications Issue 6, IEEE Std 1003.1, 2004 Edition
11 /* Copyright Sean Kelly 2005 - 2009.
12 * Distributed under the Boost Software License, Version 1.0.
13 * (See accompanying file LICENSE or copy at
14 * http://www.boost.org/LICENSE_1_0.txt)
16 module core
.sys
.posix
.sys
.types
;
18 import core
.sys
.posix
.config
;
19 import core
.stdc
.stdint
;
20 public import core
.stdc
.stddef
;
28 else version (WatchOS
)
35 // bits/typesizes.h -- underlying types for *_t.
41 version (CRuntime_Glibc
)
47 // X32 kernel interface is 64-bit.
54 alias c_ulong ulong_t
;
60 alias c_ulong ulong_t
;
66 alias c_ulong ulong_t
;
90 static if ( __USE_FILE_OFFSET64
)
98 alias slong_t blkcnt_t
;
102 alias slong_t blksize_t
;
106 alias ulong_t nlink_t
;
108 //size_t (defined in core.stdc.stddef)
109 alias c_long ssize_t
;
112 version (CRuntime_Musl
)
115 * Musl versions before v1.2.0 (up to v1.1.24) had different
116 * definitions for `time_t` for 32 bits.
117 * This was changed to always be 64 bits in v1.2.0:
118 * https://musl.libc.org/time64.html
119 * This change was only for 32 bits system and
120 * didn't affect 64 bits systems
122 * To check previous definitions, `grep` for `time_t` in `arch/`,
123 * and the result should be (in v1.1.24):
125 * // arch/riscv64/bits/alltypes.h.in:20:TYPEDEF long time_t;
126 * // arch/s390x/bits/alltypes.h.in:17:TYPEDEF long time_t;
127 * // arch/sh/bits/alltypes.h.in:21:TYPEDEF long time_t;
130 * In order to be compatible with old versions of Musl,
131 * one can recompile druntime with `CRuntime_Musl_Pre_Time64`.
135 else version (CRuntime_Musl_Pre_Time64
)
142 alias slong_t time_t
;
145 else version (Darwin
)
153 alias ushort nlink_t
;
156 //size_t (defined in core.stdc.stddef)
157 alias c_long ssize_t
;
161 else version (FreeBSD
)
163 import core
.sys
.freebsd
.config
;
165 // https://github.com/freebsd/freebsd/blob/master/sys/sys/_types.h
167 alias uint blksize_t
;
169 static if (__FreeBSD_version
>= 1200000)
179 alias ushort nlink_t
;
186 //size_t (defined in core.stdc.stddef)
187 alias c_long ssize_t
;
192 else version (NetBSD
)
203 //size_t (defined in core.stdc.stddef)
204 alias c_long ssize_t
;
208 else version (OpenBSD
)
220 //size_t (defined in core.stdc.stddef)
221 alias c_long ssize_t
;
225 else version (DragonFlyBSD
)
228 alias long blksize_t
;
234 alias long off_t
; //__off_t (defined in /usr/include/sys/stdint.h -> core.stdc.stddef)
235 alias int pid_t
; // size_t (defined in /usr/include/sys/stdint.h -> core.stdc.stddef)
236 alias c_long ssize_t
;
240 else version (Solaris
)
243 alias c_long daddr_t
;
246 static if (__USE_FILE_OFFSET64
)
254 alias c_long blkcnt_t
;
261 alias blkcnt_t blkcnt64_t
;
267 alias long blkcnt64_t
;
272 alias uint blksize_t
;
278 alias c_long ssize_t
;
284 static assert(false, "Unsupported platform");
302 static if ( __USE_FILE_OFFSET64
)
304 alias ulong fsblkcnt_t
;
305 alias ulong fsfilcnt_t
;
309 alias ulong_t fsblkcnt_t
;
310 alias ulong_t fsfilcnt_t
;
312 alias slong_t clock_t
;
315 alias slong_t suseconds_t
;
316 alias uint useconds_t
;
318 else version (Darwin
)
320 alias uint fsblkcnt_t
;
321 alias uint fsfilcnt_t
;
322 alias c_long clock_t
;
325 alias int suseconds_t
;
326 alias uint useconds_t
;
328 else version (FreeBSD
)
330 alias ulong fsblkcnt_t
;
331 alias ulong fsfilcnt_t
;
332 alias c_long clock_t
;
335 alias c_long suseconds_t
;
336 alias uint useconds_t
;
338 else version (NetBSD
)
340 alias ulong fsblkcnt_t
;
341 alias ulong fsfilcnt_t
;
342 alias c_long clock_t
;
345 alias c_long suseconds_t
;
346 alias uint useconds_t
;
348 else version (OpenBSD
)
350 alias ulong fsblkcnt_t
;
351 alias ulong fsfilcnt_t
;
355 alias c_long suseconds_t
;
356 alias uint useconds_t
;
358 else version (DragonFlyBSD
)
360 alias ulong fsblkcnt_t
;
361 alias ulong fsfilcnt_t
;
362 alias c_long clock_t
;
365 alias c_long suseconds_t
;
366 alias uint useconds_t
;
368 else version (Solaris
)
370 static if (__USE_FILE_OFFSET64
)
372 alias ulong fsblkcnt_t
;
373 alias ulong fsfilcnt_t
;
377 alias c_ulong fsblkcnt_t
;
378 alias c_ulong fsfilcnt_t
;
381 alias c_long clock_t
;
384 alias c_long suseconds_t
;
385 alias uint useconds_t
;
395 static assert(false, "Unsupported platform");
414 version (CRuntime_Glibc
)
418 enum __SIZEOF_PTHREAD_ATTR_T
= 36;
419 enum __SIZEOF_PTHREAD_MUTEX_T
= 24;
420 enum __SIZEOF_PTHREAD_MUTEXATTR_T
= 4;
421 enum __SIZEOF_PTHREAD_COND_T
= 48;
422 enum __SIZEOF_PTHREAD_CONDATTR_T
= 4;
423 enum __SIZEOF_PTHREAD_RWLOCK_T
= 32;
424 enum __SIZEOF_PTHREAD_RWLOCKATTR_T
= 8;
425 enum __SIZEOF_PTHREAD_BARRIER_T
= 20;
426 enum __SIZEOF_PTHREAD_BARRIERATTR_T
= 4;
428 else version (X86_64
)
430 static if (__WORDSIZE
== 64)
432 enum __SIZEOF_PTHREAD_ATTR_T
= 56;
433 enum __SIZEOF_PTHREAD_MUTEX_T
= 40;
434 enum __SIZEOF_PTHREAD_MUTEXATTR_T
= 4;
435 enum __SIZEOF_PTHREAD_COND_T
= 48;
436 enum __SIZEOF_PTHREAD_CONDATTR_T
= 4;
437 enum __SIZEOF_PTHREAD_RWLOCK_T
= 56;
438 enum __SIZEOF_PTHREAD_RWLOCKATTR_T
= 8;
439 enum __SIZEOF_PTHREAD_BARRIER_T
= 32;
440 enum __SIZEOF_PTHREAD_BARRIERATTR_T
= 4;
444 enum __SIZEOF_PTHREAD_ATTR_T
= 32;
445 enum __SIZEOF_PTHREAD_MUTEX_T
= 32;
446 enum __SIZEOF_PTHREAD_MUTEXATTR_T
= 4;
447 enum __SIZEOF_PTHREAD_COND_T
= 48;
448 enum __SIZEOF_PTHREAD_CONDATTR_T
= 4;
449 enum __SIZEOF_PTHREAD_RWLOCK_T
= 44;
450 enum __SIZEOF_PTHREAD_RWLOCKATTR_T
= 8;
451 enum __SIZEOF_PTHREAD_BARRIER_T
= 20;
452 enum __SIZEOF_PTHREAD_BARRIERATTR_T
= 4;
455 else version (AArch64
)
457 enum __SIZEOF_PTHREAD_ATTR_T
= 64;
458 enum __SIZEOF_PTHREAD_MUTEX_T
= 48;
459 enum __SIZEOF_PTHREAD_MUTEXATTR_T
= 8;
460 enum __SIZEOF_PTHREAD_COND_T
= 48;
461 enum __SIZEOF_PTHREAD_CONDATTR_T
= 8;
462 enum __SIZEOF_PTHREAD_RWLOCK_T
= 56;
463 enum __SIZEOF_PTHREAD_RWLOCKATTR_T
= 8;
464 enum __SIZEOF_PTHREAD_BARRIER_T
= 32;
465 enum __SIZEOF_PTHREAD_BARRIERATTR_T
= 8;
469 enum __SIZEOF_PTHREAD_ATTR_T
= 36;
470 enum __SIZEOF_PTHREAD_MUTEX_T
= 24;
471 enum __SIZEOF_PTHREAD_MUTEXATTR_T
= 4;
472 enum __SIZEOF_PTHREAD_COND_T
= 48;
473 enum __SIZEOF_PTHREAD_CONDATTR_T
= 4;
474 enum __SIZEOF_PTHREAD_RWLOCK_T
= 32;
475 enum __SIZEOF_PTHREAD_RWLOCKATTR_T
= 8;
476 enum __SIZEOF_PTHREAD_BARRIER_T
= 20;
477 enum __SIZEOF_PTHREAD_BARRIERATTR_T
= 4;
481 enum __SIZEOF_PTHREAD_ATTR_T
= 36;
482 enum __SIZEOF_PTHREAD_MUTEX_T
= 48;
483 enum __SIZEOF_PTHREAD_MUTEXATTR_T
= 4;
484 enum __SIZEOF_PTHREAD_COND_T
= 48;
485 enum __SIZEOF_PTHREAD_CONDATTR_T
= 4;
486 enum __SIZEOF_PTHREAD_RWLOCK_T
= 64;
487 enum __SIZEOF_PTHREAD_RWLOCKATTR_T
= 8;
488 enum __SIZEOF_PTHREAD_BARRIER_T
= 48;
489 enum __SIZEOF_PTHREAD_BARRIERATTR_T
= 4;
493 enum __SIZEOF_PTHREAD_ATTR_T
= 56;
494 enum __SIZEOF_PTHREAD_MUTEX_T
= 40;
495 enum __SIZEOF_PTHREAD_MUTEXATTR_T
= 4;
496 enum __SIZEOF_PTHREAD_COND_T
= 48;
497 enum __SIZEOF_PTHREAD_CONDATTR_T
= 4;
498 enum __SIZEOF_PTHREAD_RWLOCK_T
= 56;
499 enum __SIZEOF_PTHREAD_RWLOCKATTR_T
= 8;
500 enum __SIZEOF_PTHREAD_BARRIER_T
= 32;
501 enum __SIZEOF_PTHREAD_BARRIERATTR_T
= 4;
503 else version (MIPS32
)
505 enum __SIZEOF_PTHREAD_ATTR_T
= 36;
506 enum __SIZEOF_PTHREAD_MUTEX_T
= 24;
507 enum __SIZEOF_PTHREAD_MUTEXATTR_T
= 4;
508 enum __SIZEOF_PTHREAD_COND_T
= 48;
509 enum __SIZEOF_PTHREAD_CONDATTR_T
= 4;
510 enum __SIZEOF_PTHREAD_RWLOCK_T
= 32;
511 enum __SIZEOF_PTHREAD_RWLOCKATTR_T
= 8;
512 enum __SIZEOF_PTHREAD_BARRIER_T
= 20;
513 enum __SIZEOF_PTHREAD_BARRIERATTR_T
= 4;
515 else version (MIPS64
)
517 enum __SIZEOF_PTHREAD_ATTR_T
= 56;
518 enum __SIZEOF_PTHREAD_MUTEX_T
= 40;
519 enum __SIZEOF_PTHREAD_MUTEXATTR_T
= 4;
520 enum __SIZEOF_PTHREAD_COND_T
= 48;
521 enum __SIZEOF_PTHREAD_CONDATTR_T
= 4;
522 enum __SIZEOF_PTHREAD_RWLOCK_T
= 56;
523 enum __SIZEOF_PTHREAD_RWLOCKATTR_T
= 8;
524 enum __SIZEOF_PTHREAD_BARRIER_T
= 32;
525 enum __SIZEOF_PTHREAD_BARRIERATTR_T
= 4;
529 enum __SIZEOF_PTHREAD_ATTR_T
= 36;
530 enum __SIZEOF_PTHREAD_MUTEX_T
= 24;
531 enum __SIZEOF_PTHREAD_MUTEXATTR_T
= 4;
532 enum __SIZEOF_PTHREAD_COND_T
= 48;
533 enum __SIZEOF_PTHREAD_CONDATTR_T
= 4;
534 enum __SIZEOF_PTHREAD_RWLOCK_T
= 32;
535 enum __SIZEOF_PTHREAD_RWLOCKATTR_T
= 8;
536 enum __SIZEOF_PTHREAD_BARRIER_T
= 20;
537 enum __SIZEOF_PTHREAD_BARRIERATTR_T
= 4;
541 enum __SIZEOF_PTHREAD_ATTR_T
= 56;
542 enum __SIZEOF_PTHREAD_MUTEX_T
= 40;
543 enum __SIZEOF_PTHREAD_MUTEXATTR_T
= 4;
544 enum __SIZEOF_PTHREAD_COND_T
= 48;
545 enum __SIZEOF_PTHREAD_CONDATTR_T
= 4;
546 enum __SIZEOF_PTHREAD_RWLOCK_T
= 56;
547 enum __SIZEOF_PTHREAD_RWLOCKATTR_T
= 8;
548 enum __SIZEOF_PTHREAD_BARRIER_T
= 32;
549 enum __SIZEOF_PTHREAD_BARRIERATTR_T
= 4;
551 else version (RISCV32
)
553 enum __SIZEOF_PTHREAD_ATTR_T
= 36;
554 enum __SIZEOF_PTHREAD_MUTEX_T
= 24;
555 enum __SIZEOF_PTHREAD_MUTEXATTR_T
= 4;
556 enum __SIZEOF_PTHREAD_COND_T
= 48;
557 enum __SIZEOF_PTHREAD_CONDATTR_T
= 4;
558 enum __SIZEOF_PTHREAD_RWLOCK_T
= 32;
559 enum __SIZEOF_PTHREAD_RWLOCKATTR_T
= 8;
560 enum __SIZEOF_PTHREAD_BARRIER_T
= 20;
561 enum __SIZEOF_PTHREAD_BARRIERATTR_T
= 4;
563 else version (RISCV64
)
565 enum __SIZEOF_PTHREAD_ATTR_T
= 56;
566 enum __SIZEOF_PTHREAD_MUTEX_T
= 40;
567 enum __SIZEOF_PTHREAD_MUTEXATTR_T
= 4;
568 enum __SIZEOF_PTHREAD_COND_T
= 48;
569 enum __SIZEOF_PTHREAD_CONDATTR_T
= 4;
570 enum __SIZEOF_PTHREAD_RWLOCK_T
= 56;
571 enum __SIZEOF_PTHREAD_RWLOCKATTR_T
= 8;
572 enum __SIZEOF_PTHREAD_BARRIER_T
= 32;
573 enum __SIZEOF_PTHREAD_BARRIERATTR_T
= 4;
577 enum __SIZEOF_PTHREAD_ATTR_T
= 36;
578 enum __SIZEOF_PTHREAD_MUTEX_T
= 24;
579 enum __SIZEOF_PTHREAD_MUTEXATTR_T
= 4;
580 enum __SIZEOF_PTHREAD_COND_T
= 48;
581 enum __SIZEOF_PTHREAD_CONDATTR_T
= 4;
582 enum __SIZEOF_PTHREAD_RWLOCK_T
= 32;
583 enum __SIZEOF_PTHREAD_RWLOCKATTR_T
= 8;
584 enum __SIZEOF_PTHREAD_BARRIER_T
= 20;
585 enum __SIZEOF_PTHREAD_BARRIERATTR_T
= 4;
587 else version (SPARC64
)
589 enum __SIZEOF_PTHREAD_ATTR_T
= 56;
590 enum __SIZEOF_PTHREAD_MUTEX_T
= 40;
591 enum __SIZEOF_PTHREAD_MUTEXATTR_T
= 4;
592 enum __SIZEOF_PTHREAD_COND_T
= 48;
593 enum __SIZEOF_PTHREAD_CONDATTR_T
= 4;
594 enum __SIZEOF_PTHREAD_RWLOCK_T
= 56;
595 enum __SIZEOF_PTHREAD_RWLOCKATTR_T
= 8;
596 enum __SIZEOF_PTHREAD_BARRIER_T
= 32;
597 enum __SIZEOF_PTHREAD_BARRIERATTR_T
= 4;
601 enum __SIZEOF_PTHREAD_ATTR_T
= 36;
602 enum __SIZEOF_PTHREAD_MUTEX_T
= 24;
603 enum __SIZEOF_PTHREAD_MUTEXATTR_T
= 4;
604 enum __SIZEOF_PTHREAD_COND_T
= 48;
605 enum __SIZEOF_PTHREAD_CONDATTR_T
= 4;
606 enum __SIZEOF_PTHREAD_RWLOCK_T
= 32;
607 enum __SIZEOF_PTHREAD_RWLOCKATTR_T
= 8;
608 enum __SIZEOF_PTHREAD_BARRIER_T
= 20;
609 enum __SIZEOF_PTHREAD_BARRIERATTR_T
= 4;
611 else version (SystemZ
)
613 enum __SIZEOF_PTHREAD_ATTR_T
= 56;
614 enum __SIZEOF_PTHREAD_MUTEX_T
= 40;
615 enum __SIZEOF_PTHREAD_MUTEXATTR_T
= 4;
616 enum __SIZEOF_PTHREAD_COND_T
= 48;
617 enum __SIZEOF_PTHREAD_CONDATTR_T
= 4;
618 enum __SIZEOF_PTHREAD_RWLOCK_T
= 56;
619 enum __SIZEOF_PTHREAD_RWLOCKATTR_T
= 8;
620 enum __SIZEOF_PTHREAD_BARRIER_T
= 32;
621 enum __SIZEOF_PTHREAD_BARRIERATTR_T
= 4;
623 else version (LoongArch64
)
625 enum __SIZEOF_PTHREAD_ATTR_T
= 56;
626 enum __SIZEOF_PTHREAD_MUTEX_T
= 40;
627 enum __SIZEOF_PTHREAD_MUTEXATTR_T
= 4;
628 enum __SIZEOF_PTHREAD_COND_T
= 48;
629 enum __SIZEOF_PTHREAD_CONDATTR_T
= 4;
630 enum __SIZEOF_PTHREAD_RWLOCK_T
= 56;
631 enum __SIZEOF_PTHREAD_RWLOCKATTR_T
= 8;
632 enum __SIZEOF_PTHREAD_BARRIER_T
= 32;
633 enum __SIZEOF_PTHREAD_BARRIERATTR_T
= 4;
637 static assert (false, "Unsupported platform");
642 byte[__SIZEOF_PTHREAD_ATTR_T
] __size
;
646 private alias int __atomic_lock_t
;
648 private struct _pthread_fastlock
651 __atomic_lock_t __spinlock
;
654 private alias void* _pthread_descr
;
658 byte[__SIZEOF_PTHREAD_COND_T
] __size
;
662 union pthread_condattr_t
664 byte[__SIZEOF_PTHREAD_CONDATTR_T
] __size
;
668 alias uint pthread_key_t
;
670 union pthread_mutex_t
672 byte[__SIZEOF_PTHREAD_MUTEX_T
] __size
;
676 union pthread_mutexattr_t
678 byte[__SIZEOF_PTHREAD_MUTEXATTR_T
] __size
;
682 alias int pthread_once_t
;
684 struct pthread_rwlock_t
686 byte[__SIZEOF_PTHREAD_RWLOCK_T
] __size
;
690 struct pthread_rwlockattr_t
692 byte[__SIZEOF_PTHREAD_RWLOCKATTR_T
] __size
;
696 alias c_ulong pthread_t
;
698 else version (CRuntime_Musl
)
714 union pthread_mutex_t
720 union pthread_rwlock_t
740 union pthread_mutex_t
746 union pthread_rwlock_t
753 struct pthread_rwlockattr_t
758 alias uint pthread_key_t
;
760 struct pthread_condattr_t
765 struct pthread_mutexattr_t
770 alias int pthread_once_t
;
772 alias c_ulong pthread_t
;
774 else version (Darwin
)
778 enum __PTHREAD_SIZE__
= 8176;
779 enum __PTHREAD_ATTR_SIZE__
= 56;
780 enum __PTHREAD_MUTEXATTR_SIZE__
= 8;
781 enum __PTHREAD_MUTEX_SIZE__
= 56;
782 enum __PTHREAD_CONDATTR_SIZE__
= 8;
783 enum __PTHREAD_COND_SIZE__
= 40;
784 enum __PTHREAD_ONCE_SIZE__
= 8;
785 enum __PTHREAD_RWLOCK_SIZE__
= 192;
786 enum __PTHREAD_RWLOCKATTR_SIZE__
= 16;
790 enum __PTHREAD_SIZE__
= 4088;
791 enum __PTHREAD_ATTR_SIZE__
= 36;
792 enum __PTHREAD_MUTEXATTR_SIZE__
= 8;
793 enum __PTHREAD_MUTEX_SIZE__
= 40;
794 enum __PTHREAD_CONDATTR_SIZE__
= 4;
795 enum __PTHREAD_COND_SIZE__
= 24;
796 enum __PTHREAD_ONCE_SIZE__
= 4;
797 enum __PTHREAD_RWLOCK_SIZE__
= 124;
798 enum __PTHREAD_RWLOCKATTR_SIZE__
= 12;
801 struct pthread_handler_rec
803 void function(void*) __routine
;
805 pthread_handler_rec
* __next
;
808 struct pthread_attr_t
811 byte[__PTHREAD_ATTR_SIZE__
] __opaque
;
814 struct pthread_cond_t
817 byte[__PTHREAD_COND_SIZE__
] __opaque
;
820 struct pthread_condattr_t
823 byte[__PTHREAD_CONDATTR_SIZE__
] __opaque
;
826 alias c_ulong pthread_key_t
;
828 struct pthread_mutex_t
831 byte[__PTHREAD_MUTEX_SIZE__
] __opaque
;
834 struct pthread_mutexattr_t
837 byte[__PTHREAD_MUTEXATTR_SIZE__
] __opaque
;
840 struct pthread_once_t
843 byte[__PTHREAD_ONCE_SIZE__
] __opaque
;
846 struct pthread_rwlock_t
849 byte[__PTHREAD_RWLOCK_SIZE__
] __opaque
;
852 struct pthread_rwlockattr_t
855 byte[__PTHREAD_RWLOCKATTR_SIZE__
] __opaque
;
858 private struct _opaque_pthread_t
861 pthread_handler_rec
* __cleanup_stack
;
862 byte[__PTHREAD_SIZE__
] __opaque
;
865 alias _opaque_pthread_t
* pthread_t
;
867 else version (FreeBSD
)
871 alias void* pthread_attr_t
;
872 alias void* pthread_cond_t
;
873 alias void* pthread_condattr_t
;
874 alias void* pthread_key_t
;
875 alias void* pthread_mutex_t
;
876 alias void* pthread_mutexattr_t
;
877 alias void* pthread_once_t
;
878 alias void* pthread_rwlock_t
;
879 alias void* pthread_rwlockattr_t
;
880 alias void* pthread_t
;
882 else version (NetBSD
)
884 struct pthread_queue_t
{
890 alias pthread_spin_t
= ubyte;
891 struct pthread_attr_t
{
896 struct pthread_spinlock_t
{
898 pthread_spin_t pts_spin
;
901 struct pthread_cond_t
{
903 pthread_spin_t ptc_lock
;
904 pthread_queue_t ptc_waiters
;
905 pthread_mutex_t
*ptc_mutex
;
908 struct pthread_condattr_t
{
912 struct pthread_mutex_t
{
914 pthread_spin_t ptm_errorcheck
;
916 pthread_spin_t ptm_interlock
;
923 struct pthread_mutexattr_t
{
927 struct pthread_once_t
{
928 pthread_mutex_t pto_mutex
;
931 struct pthread_rwlock_t
{
934 pthread_spin_t ptr_interlock
;
936 pthread_queue_t ptr_rblocked
;
937 pthread_queue_t ptr_wblocked
;
942 struct pthread_rwlockattr_t
{
947 alias uint pthread_key_t
;
948 alias void* pthread_t
;
950 else version (OpenBSD
)
952 alias void* pthread_attr_t
;
953 alias void* pthread_cond_t
;
954 alias void* pthread_condattr_t
;
955 alias int pthread_key_t
;
956 alias void* pthread_mutex_t
;
957 alias void* pthread_mutexattr_t
;
959 private struct pthread_once
962 pthread_mutex_t mutex
;
964 alias pthread_once pthread_once_t
;
966 alias void* pthread_rwlock_t
;
967 alias void* pthread_rwlockattr_t
;
968 alias void* pthread_t
;
970 else version (DragonFlyBSD
)
974 alias void* pthread_attr_t
;
975 alias void* pthread_cond_t
;
976 alias void* pthread_condattr_t
;
977 alias void* pthread_key_t
;
978 alias void* pthread_mutex_t
;
979 alias void* pthread_mutexattr_t
;
981 private struct pthread_once
984 pthread_mutex_t mutex
;
986 alias pthread_once pthread_once_t
;
988 alias void* pthread_rwlock_t
;
989 alias void* pthread_rwlockattr_t
;
990 alias void* pthread_t
;
992 else version (Solaris
)
994 alias uint pthread_t
;
996 struct pthread_attr_t
998 void* __pthread_attrp
;
1001 struct pthread_cond_t
1003 struct ___pthread_cond_flags
1005 ubyte[4] __pthread_cond_flags
;
1006 ushort __pthread_cond_type
;
1007 ushort __pthread_cond_magic
;
1010 ___pthread_cond_flags __pthread_cond_flags
;
1011 ulong __pthread_cond_data
;
1014 struct pthread_condattr_t
1016 void* __pthread_condattrp
;
1019 struct pthread_rwlock_t
1021 int __pthread_rwlock_readers
;
1022 ushort __pthread_rwlock_type
;
1023 ushort __pthread_rwlock_magic
;
1024 pthread_mutex_t __pthread_rwlock_mutex
;
1025 pthread_cond_t __pthread_rwlock_readercv
;
1026 pthread_cond_t __pthread_rwlock_writercv
;
1029 struct pthread_rwlockattr_t
1031 void* __pthread_rwlockattrp
;
1034 struct pthread_mutex_t
1036 struct ___pthread_mutex_flags
1038 ushort __pthread_mutex_flag1
;
1039 ubyte __pthread_mutex_flag2
;
1040 ubyte __pthread_mutex_ceiling
;
1041 ushort __pthread_mutex_type
;
1042 ushort __pthread_mutex_magic
;
1045 ___pthread_mutex_flags __pthread_mutex_flags
;
1047 union ___pthread_mutex_lock
1049 struct ___pthread_mutex_lock64
1051 ubyte[8] __pthread_mutex_pad
;
1054 ___pthread_mutex_lock64 __pthread_mutex_lock64
;
1056 struct ___pthread_mutex_lock32
1058 uint __pthread_ownerpid
;
1059 uint __pthread_lockword
;
1062 ___pthread_mutex_lock32 __pthread_mutex_lock32
;
1063 ulong __pthread_mutex_owner64
;
1066 ___pthread_mutex_lock __pthread_mutex_lock
;
1067 ulong __pthread_mutex_data
;
1070 struct pthread_mutexattr_t
1072 void* __pthread_mutexattrp
;
1075 struct pthread_once_t
1077 ulong[4] __pthread_once_pad
;
1080 alias uint pthread_key_t
;
1082 else version (CRuntime_Bionic
)
1084 struct pthread_attr_t
1092 version (D_LP64
) char[16] __reserved
= 0;
1095 struct pthread_cond_t
1103 alias c_long pthread_condattr_t
;
1104 alias int pthread_key_t
;
1106 struct pthread_mutex_t
1114 alias c_long pthread_mutexattr_t
;
1115 alias int pthread_once_t
;
1117 struct pthread_rwlock_t
1125 alias c_long pthread_rwlockattr_t
;
1126 alias c_long pthread_t
;
1128 else version (CRuntime_UClibc
)
1132 enum __SIZEOF_PTHREAD_ATTR_T
= 56;
1133 enum __SIZEOF_PTHREAD_MUTEX_T
= 40;
1134 enum __SIZEOF_PTHREAD_MUTEXATTR_T
= 4;
1135 enum __SIZEOF_PTHREAD_COND_T
= 48;
1136 enum __SIZEOF_PTHREAD_CONDATTR_T
= 4;
1137 enum __SIZEOF_PTHREAD_RWLOCK_T
= 56;
1138 enum __SIZEOF_PTHREAD_RWLOCKATTR_T
= 8;
1139 enum __SIZEOF_PTHREAD_BARRIER_T
= 32;
1140 enum __SIZEOF_PTHREAD_BARRIERATTR_T
= 4;
1142 else version (MIPS32
)
1144 enum __SIZEOF_PTHREAD_ATTR_T
= 36;
1145 enum __SIZEOF_PTHREAD_MUTEX_T
= 24;
1146 enum __SIZEOF_PTHREAD_MUTEXATTR_T
= 4;
1147 enum __SIZEOF_PTHREAD_COND_T
= 48;
1148 enum __SIZEOF_PTHREAD_CONDATTR_T
= 4;
1149 enum __SIZEOF_PTHREAD_RWLOCK_T
= 32;
1150 enum __SIZEOF_PTHREAD_RWLOCKATTR_T
= 8;
1151 enum __SIZEOF_PTHREAD_BARRIER_T
= 20;
1152 enum __SIZEOF_PTHREAD_BARRIERATTR_T
= 4;
1154 else version (MIPS64
)
1156 enum __SIZEOF_PTHREAD_ATTR_T
= 56;
1157 enum __SIZEOF_PTHREAD_MUTEX_T
= 40;
1158 enum __SIZEOF_PTHREAD_MUTEXATTR_T
= 4;
1159 enum __SIZEOF_PTHREAD_COND_T
= 48;
1160 enum __SIZEOF_PTHREAD_CONDATTR_T
= 4;
1161 enum __SIZEOF_PTHREAD_RWLOCK_T
= 56;
1162 enum __SIZEOF_PTHREAD_RWLOCKATTR_T
= 8;
1163 enum __SIZEOF_PTHREAD_BARRIER_T
= 32;
1164 enum __SIZEOF_PTHREAD_BARRIERATTR_T
= 4;
1168 enum __SIZEOF_PTHREAD_ATTR_T
= 36;
1169 enum __SIZEOF_PTHREAD_MUTEX_T
= 24;
1170 enum __SIZEOF_PTHREAD_MUTEXATTR_T
= 4;
1171 enum __SIZEOF_PTHREAD_COND_T
= 48;
1172 enum __SIZEOF_PTHREAD_COND_COMPAT_T
= 12;
1173 enum __SIZEOF_PTHREAD_CONDATTR_T
= 4;
1174 enum __SIZEOF_PTHREAD_RWLOCK_T
= 32;
1175 enum __SIZEOF_PTHREAD_RWLOCKATTR_T
= 8;
1176 enum __SIZEOF_PTHREAD_BARRIER_T
= 20;
1177 enum __SIZEOF_PTHREAD_BARRIERATTR_T
= 4;
1181 static assert (false, "Architecture unsupported");
1184 union pthread_attr_t
1186 byte[__SIZEOF_PTHREAD_ATTR_T
] __size
;
1190 union pthread_cond_t
1201 uint __broadcast_seq
;
1203 byte[__SIZEOF_PTHREAD_COND_T
] __size
;
1207 union pthread_condattr_t
1209 byte[__SIZEOF_PTHREAD_CONDATTR_T
] __size
;
1213 alias uint pthread_key_t
;
1215 struct __pthread_slist_t
1217 __pthread_slist_t
* __next
;
1220 union pthread_mutex_t
1222 struct __pthread_mutex_s
1227 /* KIND must stay at this position in the structure to maintain
1228 binary compatibility. */
1234 __pthread_slist_t __list
;
1237 __pthread_mutex_s __data
;
1238 byte[__SIZEOF_PTHREAD_MUTEX_T
] __size
;
1242 union pthread_mutexattr_t
1244 byte[__SIZEOF_PTHREAD_MUTEXATTR_T
] __size
;
1248 alias int pthread_once_t
;
1250 struct pthread_rwlock_t
1256 uint __readers_wakeup
;
1257 uint __writer_wakeup
;
1258 uint __nr_readers_queued
;
1259 uint __nr_writers_queued
;
1276 byte[__SIZEOF_PTHREAD_RWLOCK_T
] __size
;
1280 struct pthread_rwlockattr_t
1282 byte[__SIZEOF_PTHREAD_RWLOCKATTR_T
] __size
;
1286 alias c_ulong pthread_t
;
1290 static assert(false, "Unsupported platform");
1298 pthread_barrierattr_t
1301 version (CRuntime_Glibc
)
1303 struct pthread_barrier_t
1305 byte[__SIZEOF_PTHREAD_BARRIER_T
] __size
;
1309 struct pthread_barrierattr_t
1311 byte[__SIZEOF_PTHREAD_BARRIERATTR_T
] __size
;
1315 else version (FreeBSD
)
1317 alias void* pthread_barrier_t
;
1318 alias void* pthread_barrierattr_t
;
1320 else version (NetBSD
)
1322 alias void* pthread_barrier_t
;
1323 alias void* pthread_barrierattr_t
;
1325 else version (OpenBSD
)
1327 alias void* pthread_barrier_t
;
1328 alias void* pthread_barrierattr_t
;
1330 else version (DragonFlyBSD
)
1332 alias void* pthread_barrier_t
;
1333 alias void* pthread_barrierattr_t
;
1335 else version (Darwin
)
1338 else version (Solaris
)
1340 struct pthread_barrier_t
1342 uint __pthread_barrier_count
;
1343 uint __pthread_barrier_current
;
1344 ulong __pthread_barrier_cycle
;
1345 ulong __pthread_barrier_reserved
;
1346 pthread_mutex_t __pthread_barrier_lock
;
1347 pthread_cond_t __pthread_barrier_cond
;
1350 struct pthread_barrierattr_t
1352 void* __pthread_barrierattrp
;
1355 else version (CRuntime_Bionic
)
1358 else version (CRuntime_Musl
)
1362 union pthread_barrier_t
1370 union pthread_barrier_t
1377 struct pthread_barrierattr_t
1382 else version (CRuntime_UClibc
)
1384 struct pthread_barrier_t
1386 byte[__SIZEOF_PTHREAD_BARRIER_T
] __size
;
1390 struct pthread_barrierattr_t
1392 byte[__SIZEOF_PTHREAD_BARRIERATTR_T
] __size
;
1398 static assert(false, "Unsupported platform");
1408 version (CRuntime_Glibc
)
1410 alias int pthread_spinlock_t
; // volatile
1412 else version (FreeBSD
)
1414 alias void* pthread_spinlock_t
;
1416 else version (NetBSD
)
1420 else version (OpenBSD
)
1422 alias void* pthread_spinlock_t
;
1424 else version (DragonFlyBSD
)
1426 alias void* pthread_spinlock_t
;
1428 else version (Solaris
)
1430 alias pthread_mutex_t pthread_spinlock_t
;
1432 else version (CRuntime_UClibc
)
1434 alias int pthread_spinlock_t
; // volatile
1436 else version (CRuntime_Musl
)
1438 alias int pthread_spinlock_t
;