1 /* Common threading primitives definitions for both POSIX and C11. 2 Copyright (C) 2017-2022 Free Software Foundation, Inc. 3 This file is part of the GNU C Library. 4 5 The GNU C Library is free software; you can redistribute it and/or 6 modify it under the terms of the GNU Lesser General Public 7 License as published by the Free Software Foundation; either 8 version 2.1 of the License, or (at your option) any later version. 9 10 The GNU C Library is distributed in the hope that it will be useful, 11 but WITHOUT ANY WARRANTY; without even the implied warranty of 12 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU 13 Lesser General Public License for more details. 14 15 You should have received a copy of the GNU Lesser General Public 16 License along with the GNU C Library; if not, see 17 <https://www.gnu.org/licenses/>. */ 18 19 #ifndef _THREAD_SHARED_TYPES_H 20 #define _THREAD_SHARED_TYPES_H 1 21 22 /* Arch-specific definitions. Each architecture must define the following 23 macros to define the expected sizes of pthread data types: 24 25 __SIZEOF_PTHREAD_ATTR_T - size of pthread_attr_t. 26 __SIZEOF_PTHREAD_MUTEX_T - size of pthread_mutex_t. 27 __SIZEOF_PTHREAD_MUTEXATTR_T - size of pthread_mutexattr_t. 28 __SIZEOF_PTHREAD_COND_T - size of pthread_cond_t. 29 __SIZEOF_PTHREAD_CONDATTR_T - size of pthread_condattr_t. 30 __SIZEOF_PTHREAD_RWLOCK_T - size of pthread_rwlock_t. 31 __SIZEOF_PTHREAD_RWLOCKATTR_T - size of pthread_rwlockattr_t. 32 __SIZEOF_PTHREAD_BARRIER_T - size of pthread_barrier_t. 33 __SIZEOF_PTHREAD_BARRIERATTR_T - size of pthread_barrierattr_t. 34 35 The additional macro defines any constraint for the lock alignment 36 inside the thread structures: 37 38 __LOCK_ALIGNMENT - for internal lock/futex usage. 39 40 Same idea but for the once locking primitive: 41 42 __ONCE_ALIGNMENT - for pthread_once_t/once_flag definition. */ 43 44 #include <bits/pthreadtypes-arch.h> 45 46 #include <bits/atomic_wide_counter.h> 47 48 49 /* Common definition of pthread_mutex_t. */ 50 51 typedef struct __pthread_internal_list 52 { 53 struct __pthread_internal_list *__prev; 54 struct __pthread_internal_list *__next; 55 } __pthread_list_t; 56 57 typedef struct __pthread_internal_slist 58 { 59 struct __pthread_internal_slist *__next; 60 } __pthread_slist_t; 61 62 /* Arch-specific mutex definitions. A generic implementation is provided 63 by sysdeps/nptl/bits/struct_mutex.h. If required, an architecture 64 can override it by defining: 65 66 1. struct __pthread_mutex_s (used on both pthread_mutex_t and mtx_t 67 definition). It should contains at least the internal members 68 defined in the generic version. 69 70 2. __LOCK_ALIGNMENT for any extra attribute for internal lock used with 71 atomic operations. 72 73 3. The macro __PTHREAD_MUTEX_INITIALIZER used for static initialization. 74 It should initialize the mutex internal flag. */ 75 76 #include <bits/struct_mutex.h> 77 78 /* Arch-sepecific read-write lock definitions. A generic implementation is 79 provided by struct_rwlock.h. If required, an architecture can override it 80 by defining: 81 82 1. struct __pthread_rwlock_arch_t (used on pthread_rwlock_t definition). 83 It should contain at least the internal members defined in the 84 generic version. 85 86 2. The macro __PTHREAD_RWLOCK_INITIALIZER used for static initialization. 87 It should initialize the rwlock internal type. */ 88 89 #include <bits/struct_rwlock.h> 90 91 92 /* Common definition of pthread_cond_t. */ 93 94 struct __pthread_cond_s 95 { 96 __atomic_wide_counter __wseq; 97 __atomic_wide_counter __g1_start; 98 unsigned int __g_refs[2] __LOCK_ALIGNMENT; 99 unsigned int __g_size[2]; 100 unsigned int __g1_orig_size; 101 unsigned int __wrefs; 102 unsigned int __g_signals[2]; 103 }; 104 105 typedef unsigned int __tss_t; 106 typedef unsigned long int __thrd_t; 107 108 typedef struct 109 { 110 int __data __ONCE_ALIGNMENT; 111 } __once_flag; 112 113 #define __ONCE_FLAG_INIT { 0 } 114 115 #endif /* _THREAD_SHARED_TYPES_H */ 116