]>
Commit | Line | Data |
---|---|---|
320054e8 DG |
1 | #ifndef _PTHREAD_IMPL_H |
2 | #define _PTHREAD_IMPL_H | |
3 | ||
4 | #include <pthread.h> | |
dcd28cf8 | 5 | #ifdef __wasilibc_unmodified_upstream |
320054e8 | 6 | #include <signal.h> |
dcd28cf8 | 7 | #endif |
320054e8 DG |
8 | #include <errno.h> |
9 | #include <limits.h> | |
dcd28cf8 | 10 | #ifdef __wasilibc_unmodified_upstream |
320054e8 | 11 | #include <sys/mman.h> |
dcd28cf8 | 12 | #endif |
320054e8 | 13 | #include "libc.h" |
dcd28cf8 | 14 | #ifdef __wasilibc_unmodified_upstream |
320054e8 | 15 | #include "syscall.h" |
dcd28cf8 | 16 | #endif |
320054e8 DG |
17 | #include "atomic.h" |
18 | #include "futex.h" | |
19 | ||
322bd4ff DG |
20 | #include "pthread_arch.h" |
21 | ||
320054e8 DG |
22 | #define pthread __pthread |
23 | ||
24 | struct pthread { | |
25 | /* Part 1 -- these fields may be external or | |
26 | * internal (accessed via asm) ABI. Do not change. */ | |
27 | struct pthread *self; | |
322bd4ff | 28 | #ifndef TLS_ABOVE_TP |
320054e8 | 29 | uintptr_t *dtv; |
322bd4ff | 30 | #endif |
f41256b6 | 31 | struct pthread *prev, *next; /* non-ABI */ |
320054e8 | 32 | uintptr_t sysinfo; |
322bd4ff DG |
33 | #ifndef TLS_ABOVE_TP |
34 | #ifdef CANARY_PAD | |
35 | uintptr_t canary_pad; | |
36 | #endif | |
37 | uintptr_t canary; | |
38 | #endif | |
320054e8 DG |
39 | |
40 | /* Part 2 -- implementation details, non-ABI. */ | |
41 | int tid; | |
42 | int errno_val; | |
43 | volatile int detach_state; | |
44 | volatile int cancel; | |
45 | volatile unsigned char canceldisable, cancelasync; | |
46 | unsigned char tsd_used:1; | |
320054e8 DG |
47 | unsigned char dlerror_flag:1; |
48 | unsigned char *map_base; | |
49 | size_t map_size; | |
50 | void *stack; | |
51 | size_t stack_size; | |
52 | size_t guard_size; | |
320054e8 DG |
53 | void *result; |
54 | struct __ptcb *cancelbuf; | |
55 | void **tsd; | |
56 | struct { | |
57 | volatile void *volatile head; | |
58 | long off; | |
59 | volatile void *volatile pending; | |
60 | } robust_list; | |
322bd4ff | 61 | int h_errno_val; |
320054e8 DG |
62 | volatile int timer_id; |
63 | locale_t locale; | |
64 | volatile int killlock[1]; | |
65 | char *dlerror_buf; | |
66 | void *stdio_locks; | |
67 | ||
68 | /* Part 3 -- the positions of these fields relative to | |
69 | * the end of the structure is external and internal ABI. */ | |
322bd4ff DG |
70 | #ifdef TLS_ABOVE_TP |
71 | uintptr_t canary; | |
72 | uintptr_t *dtv; | |
73 | #endif | |
320054e8 DG |
74 | }; |
75 | ||
320054e8 | 76 | enum { |
322bd4ff DG |
77 | DT_EXITED = 0, |
78 | DT_EXITING, | |
320054e8 DG |
79 | DT_JOINABLE, |
80 | DT_DETACHED, | |
320054e8 DG |
81 | }; |
82 | ||
320054e8 DG |
83 | #define __SU (sizeof(size_t)/sizeof(int)) |
84 | ||
85 | #define _a_stacksize __u.__s[0] | |
86 | #define _a_guardsize __u.__s[1] | |
87 | #define _a_stackaddr __u.__s[2] | |
88 | #define _a_detach __u.__i[3*__SU+0] | |
89 | #define _a_sched __u.__i[3*__SU+1] | |
90 | #define _a_policy __u.__i[3*__SU+2] | |
91 | #define _a_prio __u.__i[3*__SU+3] | |
92 | #define _m_type __u.__i[0] | |
93 | #define _m_lock __u.__vi[1] | |
94 | #define _m_waiters __u.__vi[2] | |
95 | #define _m_prev __u.__p[3] | |
96 | #define _m_next __u.__p[4] | |
97 | #define _m_count __u.__i[5] | |
98 | #define _c_shared __u.__p[0] | |
99 | #define _c_seq __u.__vi[2] | |
100 | #define _c_waiters __u.__vi[3] | |
101 | #define _c_clock __u.__i[4] | |
102 | #define _c_lock __u.__vi[8] | |
103 | #define _c_head __u.__p[1] | |
104 | #define _c_tail __u.__p[5] | |
105 | #define _rw_lock __u.__vi[0] | |
106 | #define _rw_waiters __u.__vi[1] | |
107 | #define _rw_shared __u.__i[2] | |
108 | #define _b_lock __u.__vi[0] | |
109 | #define _b_waiters __u.__vi[1] | |
110 | #define _b_limit __u.__i[2] | |
111 | #define _b_count __u.__vi[3] | |
112 | #define _b_waiters2 __u.__vi[4] | |
113 | #define _b_inst __u.__p[3] | |
114 | ||
322bd4ff DG |
115 | #ifndef TP_OFFSET |
116 | #define TP_OFFSET 0 | |
320054e8 DG |
117 | #endif |
118 | ||
119 | #ifndef DTP_OFFSET | |
120 | #define DTP_OFFSET 0 | |
121 | #endif | |
122 | ||
322bd4ff DG |
123 | #ifdef TLS_ABOVE_TP |
124 | #define TP_ADJ(p) ((char *)(p) + sizeof(struct pthread) + TP_OFFSET) | |
125 | #define __pthread_self() ((pthread_t)(__get_tp() - sizeof(struct __pthread) - TP_OFFSET)) | |
126 | #else | |
127 | #define TP_ADJ(p) (p) | |
128 | #define __pthread_self() ((pthread_t)__get_tp()) | |
129 | #endif | |
130 | ||
320054e8 DG |
131 | #ifndef tls_mod_off_t |
132 | #define tls_mod_off_t size_t | |
133 | #endif | |
134 | ||
135 | #define SIGTIMER 32 | |
136 | #define SIGCANCEL 33 | |
137 | #define SIGSYNCCALL 34 | |
138 | ||
139 | #define SIGALL_SET ((sigset_t *)(const unsigned long long [2]){ -1,-1 }) | |
140 | #define SIGPT_SET \ | |
141 | ((sigset_t *)(const unsigned long [_NSIG/8/sizeof(long)]){ \ | |
142 | [sizeof(long)==4] = 3UL<<(32*(sizeof(long)>4)) }) | |
143 | #define SIGTIMER_SET \ | |
144 | ((sigset_t *)(const unsigned long [_NSIG/8/sizeof(long)]){ \ | |
145 | 0x80000000 }) | |
146 | ||
147 | void *__tls_get_addr(tls_mod_off_t *); | |
320054e8 DG |
148 | hidden int __init_tp(void *); |
149 | hidden void *__copy_tls(unsigned char *); | |
150 | hidden void __reset_tls(); | |
151 | ||
f41256b6 | 152 | hidden void __membarrier_init(void); |
320054e8 DG |
153 | hidden void __dl_thread_cleanup(void); |
154 | hidden void __testcancel(); | |
155 | hidden void __do_cleanup_push(struct __ptcb *); | |
156 | hidden void __do_cleanup_pop(struct __ptcb *); | |
157 | hidden void __pthread_tsd_run_dtors(); | |
158 | ||
159 | hidden void __pthread_key_delete_synccall(void (*)(void *), void *); | |
160 | hidden int __pthread_key_delete_impl(pthread_key_t); | |
161 | ||
320054e8 DG |
162 | extern hidden volatile size_t __pthread_tsd_size; |
163 | extern hidden void *__pthread_tsd_main[]; | |
320054e8 DG |
164 | extern hidden volatile int __eintr_valid_flag; |
165 | ||
166 | hidden int __clone(int (*)(void *), void *, int, void *, ...); | |
167 | hidden int __set_thread_area(void *); | |
dcd28cf8 | 168 | #ifdef __wasilibc_unmodified_upstream /* WASI has no sigaction */ |
320054e8 | 169 | hidden int __libc_sigaction(int, const struct sigaction *, struct sigaction *); |
dcd28cf8 | 170 | #endif |
320054e8 DG |
171 | hidden void __unmapself(void *, size_t); |
172 | ||
33c3753c AB |
173 | #ifndef __wasilibc_unmodified_upstream |
174 | hidden int __wasilibc_futex_wait(volatile void *, int, int, int64_t); | |
175 | #endif | |
320054e8 DG |
176 | hidden int __timedwait(volatile int *, int, clockid_t, const struct timespec *, int); |
177 | hidden int __timedwait_cp(volatile int *, int, clockid_t, const struct timespec *, int); | |
178 | hidden void __wait(volatile int *, volatile int *, int, int); | |
179 | static inline void __wake(volatile void *addr, int cnt, int priv) | |
180 | { | |
181 | if (priv) priv = FUTEX_PRIVATE; | |
182 | if (cnt<0) cnt = INT_MAX; | |
dcd28cf8 | 183 | #ifdef __wasilibc_unmodified_upstream |
320054e8 DG |
184 | __syscall(SYS_futex, addr, FUTEX_WAKE|priv, cnt) != -ENOSYS || |
185 | __syscall(SYS_futex, addr, FUTEX_WAKE, cnt); | |
dcd28cf8 AB |
186 | #else |
187 | __builtin_wasm_memory_atomic_notify((int*)addr, cnt); | |
188 | #endif | |
320054e8 DG |
189 | } |
190 | static inline void __futexwait(volatile void *addr, int val, int priv) | |
191 | { | |
dcd28cf8 | 192 | #ifdef __wasilibc_unmodified_upstream |
320054e8 DG |
193 | if (priv) priv = FUTEX_PRIVATE; |
194 | __syscall(SYS_futex, addr, FUTEX_WAIT|priv, val, 0) != -ENOSYS || | |
195 | __syscall(SYS_futex, addr, FUTEX_WAIT, val, 0); | |
dcd28cf8 AB |
196 | #else |
197 | __wait(addr, NULL, val, priv); | |
198 | #endif | |
320054e8 DG |
199 | } |
200 | ||
201 | hidden void __acquire_ptc(void); | |
202 | hidden void __release_ptc(void); | |
203 | hidden void __inhibit_ptc(void); | |
204 | ||
f41256b6 DG |
205 | hidden void __tl_lock(void); |
206 | hidden void __tl_unlock(void); | |
207 | hidden void __tl_sync(pthread_t); | |
208 | ||
209 | extern hidden volatile int __thread_list_lock; | |
210 | ||
322bd4ff DG |
211 | extern hidden volatile int __abort_lock[1]; |
212 | ||
320054e8 DG |
213 | extern hidden unsigned __default_stacksize; |
214 | extern hidden unsigned __default_guardsize; | |
215 | ||
216 | #define DEFAULT_STACK_SIZE 131072 | |
217 | #define DEFAULT_GUARD_SIZE 8192 | |
218 | ||
219 | #define DEFAULT_STACK_MAX (8<<20) | |
220 | #define DEFAULT_GUARD_MAX (1<<20) | |
221 | ||
222 | #define __ATTRP_C11_THREAD ((void*)(uintptr_t)-1) | |
223 | ||
224 | #endif |