move additional pthread internal declarations to pthread_impl.h, hide
[musl] / src / internal / pthread_impl.h
index f2805b8..a89ef9a 100644 (file)
@@ -5,6 +5,7 @@
 #include <signal.h>
 #include <errno.h>
 #include <limits.h>
+#include <sys/mman.h>
 #include "libc.h"
 #include "syscall.h"
 #include "atomic.h"
@@ -19,39 +20,36 @@ struct pthread {
        void **dtv, *unused1, *unused2;
        uintptr_t sysinfo;
        uintptr_t canary, canary2;
-       pid_t tid, pid;
 
        /* Part 2 -- implementation details, non-ABI. */
-       int tsd_used, errno_val;
-       volatile int cancel, canceldisable, cancelasync;
-       int detached;
+       int tid;
+       int errno_val;
+       volatile int detach_state;
+       volatile int cancel;
+       volatile unsigned char canceldisable, cancelasync;
+       unsigned char tsd_used:1;
+       unsigned char unblock_cancel:1;
+       unsigned char dlerror_flag:1;
        unsigned char *map_base;
        size_t map_size;
        void *stack;
        size_t stack_size;
+       size_t guard_size;
        void *start_arg;
        void *(*start)(void *);
        void *result;
        struct __ptcb *cancelbuf;
        void **tsd;
-       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 join_futex;
        volatile int killlock[1];
-       volatile int exitlock[1];
-       volatile int startlock[2];
-       unsigned long sigmask[_NSIG/8/sizeof(long)];
        char *dlerror_buf;
-       int dlerror_flag;
        void *stdio_locks;
-       size_t guard_size;
 
        /* Part 3 -- the positions of these fields relative to
         * the end of the structure is external and internal ABI. */
@@ -59,6 +57,22 @@ struct pthread {
        void **dtv_copy;
 };
 
+struct start_sched_args {
+       void *start_arg;
+       void *(*start_fn)(void *);
+       sigset_t mask;
+       pthread_attr_t *attr;
+       volatile int futex;
+};
+
+enum {
+       DT_EXITED = 0,
+       DT_EXITING,
+       DT_JOINABLE,
+       DT_DETACHED,
+       DT_DYNAMIC,
+};
+
 struct __timer {
        int timerid;
        pthread_t thread;
@@ -122,22 +136,32 @@ struct __timer {
        ((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);
+void *__tls_get_addr(tls_mod_off_t *);
+hidden void *__tls_get_new(tls_mod_off_t *);
+hidden int __init_tp(void *);
+hidden void *__copy_tls(unsigned char *);
+hidden void __reset_tls();
+
+hidden void __dl_thread_cleanup(void);
+hidden void __fork_handler(int);
+hidden void __testcancel();
+hidden void __do_cleanup_push(struct __ptcb *);
+hidden void __do_cleanup_pop(struct __ptcb *);
+hidden void __pthread_tsd_run_dtors();
+
+extern hidden volatile int __block_new_threads;
+extern hidden volatile size_t __pthread_tsd_size;
+extern hidden void *__pthread_tsd_main[];
+extern hidden volatile int __aio_fut;
+
+hidden int __clone(int (*)(void *), void *, int, void *, ...);
+hidden int __set_thread_area(void *);
+hidden int __libc_sigaction(int, const struct sigaction *, struct sigaction *);
+hidden void __unmapself(void *, size_t);
+
+hidden int __timedwait(volatile int *, int, clockid_t, const struct timespec *, int);
+hidden int __timedwait_cp(volatile int *, int, clockid_t, const struct timespec *, int);
+hidden void __wait(volatile int *, volatile int *, int, int);
 static inline void __wake(volatile void *addr, int cnt, int priv)
 {
        if (priv) priv = FUTEX_PRIVATE;
@@ -148,17 +172,16 @@ static inline void __wake(volatile void *addr, int cnt, int priv)
 static inline void __futexwait(volatile void *addr, int val, int priv)
 {
        if (priv) priv = FUTEX_PRIVATE;
-       __syscall(SYS_futex, addr, FUTEX_WAIT|priv, val) != -ENOSYS ||
-       __syscall(SYS_futex, addr, FUTEX_WAIT, val);
+       __syscall(SYS_futex, addr, FUTEX_WAIT|priv, val, 0) != -ENOSYS ||
+       __syscall(SYS_futex, addr, FUTEX_WAIT, val, 0);
 }
 
-void __acquire_ptc(void);
-void __release_ptc(void);
-void __inhibit_ptc(void);
+hidden void __acquire_ptc(void);
+hidden void __release_ptc(void);
+hidden void __inhibit_ptc(void);
 
-void __block_all_sigs(void *);
-void __block_app_sigs(void *);
-void __restore_sigs(void *);
+extern hidden size_t __default_stacksize;
+extern hidden size_t __default_guardsize;
 
 #define DEFAULT_STACK_SIZE 81920
 #define DEFAULT_GUARD_SIZE 4096