| #ifndef _PTHREAD_IMPL_H |
| #define _PTHREAD_IMPL_H |
| |
| #include <pthread.h> |
| #include <signal.h> |
| #include <errno.h> |
| #include <limits.h> |
| #include "libc.h" |
| #include "syscall.h" |
| #include "atomic.h" |
| #include "futex.h" |
| |
| #define pthread __pthread |
| |
| struct pthread { |
| struct pthread* self; |
| void **dtv, *unused1, *unused2; |
| uintptr_t sysinfo; |
| uintptr_t canary, canary2; |
| pid_t tid, pid; |
| int tsd_used, errno_val; |
| volatile int cancel, canceldisable, cancelasync; |
| int detached; |
| unsigned char* map_base; |
| size_t map_size; |
| void* stack; |
| size_t stack_size; |
| void* start_arg; |
| void* (*start)(void*); |
| void* result; |
| struct __ptcb* cancelbuf; |
| void** tsd; |
| pthread_attr_t attr; |
| volatile int dead; |
| struct { |
| volatile void* volatile head; |
| long off; |
| volatile void* volatile pending; |
| } robust_list; |
| int unblock_cancel; |
| volatile int timer_id; |
| locale_t locale; |
| volatile int killlock[2]; |
| volatile int exitlock[2]; |
| volatile int startlock[2]; |
| unsigned long sigmask[_NSIG / 8 / sizeof(long)]; |
| char* dlerror_buf; |
| int dlerror_flag; |
| void* stdio_locks; |
| uintptr_t canary_at_end; |
| void** dtv_copy; |
| }; |
| |
| struct __timer { |
| int timerid; |
| pthread_t thread; |
| }; |
| |
| #define __SU (sizeof(size_t) / sizeof(int)) |
| |
| #define _a_stacksize __u.__s[0] |
| #define _a_guardsize __u.__s[1] |
| #define _a_stackaddr __u.__s[2] |
| #define _a_detach __u.__i[3 * __SU + 0] |
| #define _a_sched __u.__i[3 * __SU + 1] |
| #define _a_policy __u.__i[3 * __SU + 2] |
| #define _a_prio __u.__i[3 * __SU + 3] |
| #define _m_type __u.__i[0] |
| #define _m_lock __u.__vi[1] |
| #define _m_waiters __u.__vi[2] |
| #define _m_prev __u.__p[3] |
| #define _m_next __u.__p[4] |
| #define _m_count __u.__i[5] |
| #define _c_shared __u.__p[0] |
| #define _c_seq __u.__vi[2] |
| #define _c_waiters __u.__vi[3] |
| #define _c_clock __u.__i[4] |
| #define _c_lock __u.__vi[8] |
| #define _c_head __u.__p[1] |
| #define _c_tail __u.__p[5] |
| #define _rw_lock __u.__vi[0] |
| #define _rw_waiters __u.__vi[1] |
| #define _rw_shared __u.__i[2] |
| #define _b_lock __u.__vi[0] |
| #define _b_waiters __u.__vi[1] |
| #define _b_limit __u.__i[2] |
| #define _b_count __u.__vi[3] |
| #define _b_waiters2 __u.__vi[4] |
| #define _b_inst __u.__p[3] |
| |
| #include "pthread_arch.h" |
| |
| #ifndef CANARY |
| #define CANARY canary |
| #endif |
| |
| #ifndef DTP_OFFSET |
| #define DTP_OFFSET 0 |
| #endif |
| |
| #define SIGTIMER 32 |
| #define SIGCANCEL 33 |
| #define SIGSYNCCALL 34 |
| |
| #define SIGALL_SET ((sigset_t*)(const unsigned long long[2]){-1, -1}) |
| #define SIGPT_SET \ |
| ((sigset_t*)(const unsigned long[_NSIG / 8 / \ |
| sizeof(long)]){[sizeof(long) == 4] = \ |
| 3UL \ |
| << (32 * (sizeof(long) > \ |
| 4))}) |
| #define SIGTIMER_SET \ |
| ((sigset_t*)(const unsigned long[_NSIG / 8 / sizeof(long)]){0x80000000}) |
| |
| pthread_t __pthread_self_init(void); |
| |
| int __clone(int (*)(void*), void*, int, void*, ...); |
| int __set_thread_area(void*); |
| int __libc_sigaction(int, const struct sigaction*, struct sigaction*); |
| int __libc_sigprocmask(int, const sigset_t*, sigset_t*); |
| void __lock(volatile int*); |
| void __unmapself(void*, size_t); |
| |
| void __vm_wait(void); |
| void __vm_lock(void); |
| void __vm_unlock(void); |
| |
| int __timedwait(volatile int*, int, clockid_t, const struct timespec*, int); |
| int __timedwait_cp(volatile int*, int, clockid_t, const struct timespec*, int); |
| void __wait(volatile int*, volatile int*, int, int); |
| static inline void __wake(volatile void* addr, int cnt, int priv) { |
| if (priv) |
| priv = 128; |
| if (cnt < 0) |
| cnt = INT_MAX; |
| __syscall(SYS_futex, addr, FUTEX_WAKE | priv, cnt) != -ENOSYS || |
| __syscall(SYS_futex, addr, FUTEX_WAKE, cnt); |
| } |
| |
| void __acquire_ptc(void); |
| void __release_ptc(void); |
| void __inhibit_ptc(void); |
| |
| void __block_all_sigs(void*); |
| void __block_app_sigs(void*); |
| void __restore_sigs(void*); |
| |
| #define DEFAULT_STACK_SIZE 81920 |
| #define DEFAULT_GUARD_SIZE PAGE_SIZE |
| |
| #define __ATTRP_C11_THREAD ((void*)(uintptr_t)-1) |
| |
| #endif |