OLD | NEW |
1 #ifndef _PTHREAD_IMPL_H | 1 #ifndef _PTHREAD_IMPL_H |
2 #define _PTHREAD_IMPL_H | 2 #define _PTHREAD_IMPL_H |
3 | 3 |
4 #include <pthread.h> | 4 #include <pthread.h> |
5 #include <signal.h> | 5 #include <signal.h> |
6 #include <errno.h> | 6 #include <errno.h> |
7 #include <limits.h> | 7 #include <limits.h> |
8 #include "libc.h" | 8 #include "libc.h" |
9 #include "syscall.h" | 9 #include "syscall.h" |
10 #include "atomic.h" | 10 #include "atomic.h" |
11 #include "futex.h" | 11 #include "futex.h" |
12 | 12 |
13 #define pthread __pthread | 13 #define pthread __pthread |
14 | 14 |
15 struct pthread { | 15 struct pthread { |
16 » struct pthread *self; | 16 struct pthread* self; |
17 » void **dtv, *unused1, *unused2; | 17 void **dtv, *unused1, *unused2; |
18 » uintptr_t sysinfo; | 18 uintptr_t sysinfo; |
19 » uintptr_t canary, canary2; | 19 uintptr_t canary, canary2; |
20 » pid_t tid, pid; | 20 pid_t tid, pid; |
21 » int tsd_used, errno_val; | 21 int tsd_used, errno_val; |
22 » volatile int cancel, canceldisable, cancelasync; | 22 volatile int cancel, canceldisable, cancelasync; |
23 » int detached; | 23 int detached; |
24 » unsigned char *map_base; | 24 unsigned char* map_base; |
25 » size_t map_size; | 25 size_t map_size; |
26 » void *stack; | 26 void* stack; |
27 » size_t stack_size; | 27 size_t stack_size; |
28 » void *start_arg; | 28 void* start_arg; |
29 » void *(*start)(void *); | 29 void* (*start)(void*); |
30 » void *result; | 30 void* result; |
31 » struct __ptcb *cancelbuf; | 31 struct __ptcb* cancelbuf; |
32 » void **tsd; | 32 void** tsd; |
33 » pthread_attr_t attr; | 33 pthread_attr_t attr; |
34 » volatile int dead; | 34 volatile int dead; |
35 » struct { | 35 struct { |
36 » » volatile void *volatile head; | 36 volatile void* volatile head; |
37 » » long off; | 37 long off; |
38 » » volatile void *volatile pending; | 38 volatile void* volatile pending; |
39 » } robust_list; | 39 } robust_list; |
40 » int unblock_cancel; | 40 int unblock_cancel; |
41 » volatile int timer_id; | 41 volatile int timer_id; |
42 » locale_t locale; | 42 locale_t locale; |
43 » volatile int killlock[2]; | 43 volatile int killlock[2]; |
44 » volatile int exitlock[2]; | 44 volatile int exitlock[2]; |
45 » volatile int startlock[2]; | 45 volatile int startlock[2]; |
46 » unsigned long sigmask[_NSIG/8/sizeof(long)]; | 46 unsigned long sigmask[_NSIG / 8 / sizeof(long)]; |
47 » char *dlerror_buf; | 47 char* dlerror_buf; |
48 » int dlerror_flag; | 48 int dlerror_flag; |
49 » void *stdio_locks; | 49 void* stdio_locks; |
50 » uintptr_t canary_at_end; | 50 uintptr_t canary_at_end; |
51 » void **dtv_copy; | 51 void** dtv_copy; |
52 }; | 52 }; |
53 | 53 |
54 struct __timer { | 54 struct __timer { |
55 » int timerid; | 55 int timerid; |
56 » pthread_t thread; | 56 pthread_t thread; |
57 }; | 57 }; |
58 | 58 |
59 #define __SU (sizeof(size_t)/sizeof(int)) | 59 #define __SU (sizeof(size_t) / sizeof(int)) |
60 | 60 |
61 #define _a_stacksize __u.__s[0] | 61 #define _a_stacksize __u.__s[0] |
62 #define _a_guardsize __u.__s[1] | 62 #define _a_guardsize __u.__s[1] |
63 #define _a_stackaddr __u.__s[2] | 63 #define _a_stackaddr __u.__s[2] |
64 #define _a_detach __u.__i[3*__SU+0] | 64 #define _a_detach __u.__i[3 * __SU + 0] |
65 #define _a_sched __u.__i[3*__SU+1] | 65 #define _a_sched __u.__i[3 * __SU + 1] |
66 #define _a_policy __u.__i[3*__SU+2] | 66 #define _a_policy __u.__i[3 * __SU + 2] |
67 #define _a_prio __u.__i[3*__SU+3] | 67 #define _a_prio __u.__i[3 * __SU + 3] |
68 #define _m_type __u.__i[0] | 68 #define _m_type __u.__i[0] |
69 #define _m_lock __u.__vi[1] | 69 #define _m_lock __u.__vi[1] |
70 #define _m_waiters __u.__vi[2] | 70 #define _m_waiters __u.__vi[2] |
71 #define _m_prev __u.__p[3] | 71 #define _m_prev __u.__p[3] |
72 #define _m_next __u.__p[4] | 72 #define _m_next __u.__p[4] |
73 #define _m_count __u.__i[5] | 73 #define _m_count __u.__i[5] |
74 #define _c_shared __u.__p[0] | 74 #define _c_shared __u.__p[0] |
75 #define _c_seq __u.__vi[2] | 75 #define _c_seq __u.__vi[2] |
76 #define _c_waiters __u.__vi[3] | 76 #define _c_waiters __u.__vi[3] |
77 #define _c_clock __u.__i[4] | 77 #define _c_clock __u.__i[4] |
(...skipping 17 matching lines...) Expand all Loading... |
95 #endif | 95 #endif |
96 | 96 |
97 #ifndef DTP_OFFSET | 97 #ifndef DTP_OFFSET |
98 #define DTP_OFFSET 0 | 98 #define DTP_OFFSET 0 |
99 #endif | 99 #endif |
100 | 100 |
101 #define SIGTIMER 32 | 101 #define SIGTIMER 32 |
102 #define SIGCANCEL 33 | 102 #define SIGCANCEL 33 |
103 #define SIGSYNCCALL 34 | 103 #define SIGSYNCCALL 34 |
104 | 104 |
105 #define SIGALL_SET ((sigset_t *)(const unsigned long long [2]){ -1,-1 }) | 105 #define SIGALL_SET ((sigset_t*)(const unsigned long long[2]){-1, -1}) |
106 #define SIGPT_SET \ | 106 #define SIGPT_SET \ |
107 » ((sigset_t *)(const unsigned long [_NSIG/8/sizeof(long)]){ \ | 107 ((sigset_t*)(const unsigned long[_NSIG / 8 / \ |
108 » [sizeof(long)==4] = 3UL<<(32*(sizeof(long)>4)) }) | 108 sizeof(long)]){[sizeof(long) == 4] = \ |
| 109 3UL \ |
| 110 << (32 * (sizeof(long) > \ |
| 111 4))}) |
109 #define SIGTIMER_SET \ | 112 #define SIGTIMER_SET \ |
110 » ((sigset_t *)(const unsigned long [_NSIG/8/sizeof(long)]){ \ | 113 ((sigset_t*)(const unsigned long[_NSIG / 8 / sizeof(long)]){0x80000000}) |
111 » 0x80000000 }) | |
112 | 114 |
113 pthread_t __pthread_self_init(void); | 115 pthread_t __pthread_self_init(void); |
114 | 116 |
115 int __clone(int (*)(void *), void *, int, void *, ...); | 117 int __clone(int (*)(void*), void*, int, void*, ...); |
116 int __set_thread_area(void *); | 118 int __set_thread_area(void*); |
117 int __libc_sigaction(int, const struct sigaction *, struct sigaction *); | 119 int __libc_sigaction(int, const struct sigaction*, struct sigaction*); |
118 int __libc_sigprocmask(int, const sigset_t *, sigset_t *); | 120 int __libc_sigprocmask(int, const sigset_t*, sigset_t*); |
119 void __lock(volatile int *); | 121 void __lock(volatile int*); |
120 void __unmapself(void *, size_t); | 122 void __unmapself(void*, size_t); |
121 | 123 |
122 void __vm_wait(void); | 124 void __vm_wait(void); |
123 void __vm_lock(void); | 125 void __vm_lock(void); |
124 void __vm_unlock(void); | 126 void __vm_unlock(void); |
125 | 127 |
126 int __timedwait(volatile int *, int, clockid_t, const struct timespec *, int); | 128 int __timedwait(volatile int*, int, clockid_t, const struct timespec*, int); |
127 int __timedwait_cp(volatile int *, int, clockid_t, const struct timespec *, int)
; | 129 int __timedwait_cp(volatile int*, int, clockid_t, const struct timespec*, int); |
128 void __wait(volatile int *, volatile int *, int, int); | 130 void __wait(volatile int*, volatile int*, int, int); |
129 static inline void __wake(volatile void *addr, int cnt, int priv) | 131 static inline void __wake(volatile void* addr, int cnt, int priv) { |
130 { | 132 if (priv) |
131 » if (priv) priv = 128; | 133 priv = 128; |
132 » if (cnt<0) cnt = INT_MAX; | 134 if (cnt < 0) |
133 » __syscall(SYS_futex, addr, FUTEX_WAKE|priv, cnt) != -ENOSYS || | 135 cnt = INT_MAX; |
134 » __syscall(SYS_futex, addr, FUTEX_WAKE, cnt); | 136 __syscall(SYS_futex, addr, FUTEX_WAKE | priv, cnt) != -ENOSYS || |
| 137 __syscall(SYS_futex, addr, FUTEX_WAKE, cnt); |
135 } | 138 } |
136 | 139 |
137 void __acquire_ptc(void); | 140 void __acquire_ptc(void); |
138 void __release_ptc(void); | 141 void __release_ptc(void); |
139 void __inhibit_ptc(void); | 142 void __inhibit_ptc(void); |
140 | 143 |
141 void __block_all_sigs(void *); | 144 void __block_all_sigs(void*); |
142 void __block_app_sigs(void *); | 145 void __block_app_sigs(void*); |
143 void __restore_sigs(void *); | 146 void __restore_sigs(void*); |
144 | 147 |
145 #define DEFAULT_STACK_SIZE 81920 | 148 #define DEFAULT_STACK_SIZE 81920 |
146 #define DEFAULT_GUARD_SIZE PAGE_SIZE | 149 #define DEFAULT_GUARD_SIZE PAGE_SIZE |
147 | 150 |
148 #define __ATTRP_C11_THREAD ((void*)(uintptr_t)-1) | 151 #define __ATTRP_C11_THREAD ((void*)(uintptr_t)-1) |
149 | 152 |
150 #endif | 153 #endif |
OLD | NEW |