1 #ifndef _PTHREAD_IMPL_H 2 #define _PTHREAD_IMPL_H 3 4 #include <pthread.h> 5 #include <errno.h> 6 #include <limits.h> 7 #include <sys/mman.h> 8 #include "libc.h" 9 #include "atomic.h" 10 11 enum { 12 DT_EXITED = 0, 13 DT_EXITING, 14 DT_JOINABLE, 15 DT_DETACHED, 16 }; 17 18 #define __SU (sizeof(size_t)/sizeof(int)) 19 20 #define _a_stacksize __u.__s[0] 21 #define _a_guardsize __u.__s[1] 22 #define _a_stackaddr __u.__s[2] 23 #define _a_detach __u.__i[3*__SU+0] 24 #define _a_sched __u.__i[3*__SU+1] 25 #define _a_policy __u.__i[3*__SU+2] 26 #define _a_prio __u.__i[3*__SU+3] 27 #define _m_type __u.__i[0] 28 #define _m_lock __u.__vi[1] 29 #define _m_waiters __u.__vi[2] 30 #define _m_prev __u.__p[3] 31 #define _m_next __u.__p[4] 32 #define _m_count __u.__i[5] 33 #define _c_shared __u.__p[0] 34 #define _c_seq __u.__vi[2] 35 #define _c_waiters __u.__vi[3] 36 #define _c_clock __u.__i[4] 37 #define _c_lock __u.__vi[8] 38 #define _c_head __u.__p[1] 39 #define _c_tail __u.__p[5] 40 #define _rw_lock __u.__vi[0] 41 #define _rw_waiters __u.__vi[1] 42 #define _rw_shared __u.__i[2] 43 #define _b_lock __u.__vi[0] 44 #define _b_waiters __u.__vi[1] 45 #define _b_limit __u.__i[2] 46 #define _b_count __u.__vi[3] 47 #define _b_waiters2 __u.__vi[4] 48 #define _b_inst __u.__p[3] 49 50 #ifndef TP_OFFSET 51 #define TP_OFFSET 0 52 #endif 53 54 #ifndef DTP_OFFSET 55 #define DTP_OFFSET 0 56 #endif 57 58 #ifdef TLS_ABOVE_TP 59 #define TP_ADJ(p) ((char *)(p) + sizeof(struct pthread) + TP_OFFSET) 60 #define __pthread_self() ((pthread_t)(__get_tp() - sizeof(struct __pthread) - TP_OFFSET)) 61 #else 62 #define TP_ADJ(p) (p) 63 #define __pthread_self() ((pthread_t)__get_tp()) 64 #endif 65 66 #ifndef tls_mod_off_t 67 #define tls_mod_off_t size_t 68 #endif 69 70 #define SIGTIMER 32 71 #define SIGCANCEL 33 72 #define SIGSYNCCALL 34 73 74 #define SIGALL_SET ((sigset_t *)(const unsigned long long [2]){ -1,-1 }) 75 #define SIGPT_SET \ 76 ((sigset_t *)(const unsigned long [_NSIG/8/sizeof(long)]){ \ 77 [sizeof(long)==4] = 3UL<<(32*(sizeof(long)>4)) }) 78 #define SIGTIMER_SET \ 79 ((sigset_t *)(const unsigned long [_NSIG/8/sizeof(long)]){ \ 80 0x80000000 }) 81 82 void *__tls_get_addr(tls_mod_off_t *); 83 hidden int __init_tp(void *); 84 hidden void *__copy_tls(unsigned char *); 85 hidden void __reset_tls(void); 86 87 hidden void __membarrier_init(void); 88 hidden void __dl_thread_cleanup(void); 89 hidden void __testcancel(void); 90 hidden void __do_cleanup_push(struct pthread_cleanup_buffer *); 91 hidden void __do_cleanup_pop(struct pthread_cleanup_buffer *); 92 hidden void __pthread_tsd_run_dtors(void); 93 94 hidden void __pthread_key_delete_synccall(void (*)(void *), void *); 95 hidden int __pthread_key_delete_impl(pthread_key_t); 96 97 extern hidden volatile size_t __pthread_tsd_size; 98 extern hidden void *__pthread_tsd_main[]; 99 extern hidden volatile int __eintr_valid_flag; 100 101 hidden int __clone(int (*)(void *), void *, int, void *, ...); 102 hidden int __thread_clone(int (*func)(void *), int flags, pthread_t *thread, unsigned char *sp); 103 hidden int __set_thread_area(void *); 104 hidden int __libc_sigaction(int, const struct sigaction *, struct sigaction *); 105 hidden void __unmapself(void *, size_t); 106 107 hidden int __timedwait(volatile int *, int, clockid_t, const struct timespec *, int); 108 hidden int __timedwait_cp(volatile int *, int, clockid_t, const struct timespec *, int); 109 hidden void __wait(volatile int *, volatile int *, int, int); 110 111 hidden void __acquire_ptc(void); 112 hidden void __release_ptc(void); 113 hidden void __inhibit_ptc(void); 114 115 hidden void __tl_lock(void); 116 hidden void __tl_unlock(void); 117 hidden void __tl_sync(pthread_t); 118 119 extern hidden volatile int __thread_list_lock; 120 121 extern hidden volatile int __abort_lock[1]; 122 123 extern hidden unsigned __default_stacksize; 124 extern hidden unsigned __default_guardsize; 125 126 #define DEFAULT_STACK_SIZE 131072 127 #define DEFAULT_GUARD_SIZE 8192 128 129 #define DEFAULT_STACK_MAX (8<<20) 130 #define DEFAULT_GUARD_MAX (1<<20) 131 132 #define __ATTRP_C11_THREAD ((void*)(uintptr_t)-1) 133 134 #define MUSL_TYPE_THREAD (-1) 135 #define MUSL_TYPE_PROCESS (0) 136 137 #define PTHREAD_MUTEX_TYPE_MASK 3 138 #define PTHREAD_PRIORITY_LOWEST 31 139 140 #endif 141