Index: fusl/src/internal/pthread_impl.h |
diff --git a/fusl/src/internal/pthread_impl.h b/fusl/src/internal/pthread_impl.h |
new file mode 100644 |
index 0000000000000000000000000000000000000000..3890bb56fb4d122db323e513460a4c045666d741 |
--- /dev/null |
+++ b/fusl/src/internal/pthread_impl.h |
@@ -0,0 +1,150 @@ |
+#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 |