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