Cleanup the TLS implementation:
authorJoerg Sonnenberger <joerg@dragonflybsd.org>
Tue, 29 Mar 2005 19:26:20 +0000 (19:26 +0000)
committerJoerg Sonnenberger <joerg@dragonflybsd.org>
Tue, 29 Mar 2005 19:26:20 +0000 (19:26 +0000)
- Define the TCB layout in machine/tls.h, define wether tcb_self exists or
  not.
- Define the layout of the DTV, not used yet.
- Define the TLS variant
- Define common access functions (tls_get_tcb, tls_get_curthread, tls_set_tcb)
  and the RTLD functions.

47 files changed:
lib/libc/gen/tls.c
lib/libc/i386/gen/Makefile.inc
lib/libc/include/libc_private.h
lib/libthread_xu/Makefile
lib/libthread_xu/arch/amd64/amd64/pthread_md.c
lib/libthread_xu/arch/amd64/include/pthread_md.h
lib/libthread_xu/arch/i386/i386/pthread_md.c
lib/libthread_xu/arch/i386/include/pthread_md.h
lib/libthread_xu/pthread.map
lib/libthread_xu/sys/thr_error.c
lib/libthread_xu/thread/thr_attr.c
lib/libthread_xu/thread/thr_barrier.c
lib/libthread_xu/thread/thr_cancel.c
lib/libthread_xu/thread/thr_clean.c
lib/libthread_xu/thread/thr_cond.c
lib/libthread_xu/thread/thr_create.c
lib/libthread_xu/thread/thr_detach.c
lib/libthread_xu/thread/thr_exit.c
lib/libthread_xu/thread/thr_fork.c
lib/libthread_xu/thread/thr_getschedparam.c
lib/libthread_xu/thread/thr_info.c
lib/libthread_xu/thread/thr_init.c
lib/libthread_xu/thread/thr_join.c
lib/libthread_xu/thread/thr_kill.c
lib/libthread_xu/thread/thr_list.c
lib/libthread_xu/thread/thr_mutex.c
lib/libthread_xu/thread/thr_private.h
lib/libthread_xu/thread/thr_pspinlock.c
lib/libthread_xu/thread/thr_resume_np.c
lib/libthread_xu/thread/thr_rtld.c
lib/libthread_xu/thread/thr_rwlock.c
lib/libthread_xu/thread/thr_self.c
lib/libthread_xu/thread/thr_sem.c
lib/libthread_xu/thread/thr_setschedparam.c
lib/libthread_xu/thread/thr_sig.c
lib/libthread_xu/thread/thr_spec.c
lib/libthread_xu/thread/thr_spinlock.c
lib/libthread_xu/thread/thr_stack.c
lib/libthread_xu/thread/thr_suspend_np.c
lib/libthread_xu/thread/thr_symbols.c
lib/libthread_xu/thread/thr_syscalls.c
libexec/rtld-elf/i386/reloc.c
libexec/rtld-elf/rtld.c
libexec/rtld-elf/rtld_tls.h [deleted file]
sys/cpu/i386/include/tls.h [copied from lib/libc/i386/gen/_set_tp.c with 51% similarity]
sys/i386/include/tls.h [moved from lib/libc/i386/gen/_set_tp.c with 51% similarity]
sys/sys/tls.h

index 30ed2db..9622545 100644 (file)
@@ -24,7 +24,7 @@
  * SUCH DAMAGE.
  *
  *     $FreeBSD: src/lib/libc/gen/tls.c,v 1.7 2005/03/01 23:42:00 davidxu Exp $
- *     $DragonFly: src/lib/libc/gen/tls.c,v 1.4 2005/03/28 03:33:12 dillon Exp $
+ *     $DragonFly: src/lib/libc/gen/tls.c,v 1.5 2005/03/29 19:26:19 joerg Exp $
  */
 
 /*
@@ -35,6 +35,9 @@
 
 #include <sys/cdefs.h>
 #include <sys/tls.h>
+
+#include <machine/tls.h>
+
 #include <stdlib.h>
 #include <string.h>
 #include <elf.h>
@@ -49,18 +52,12 @@ __weak_reference(___libc_tls_get_addr, ___tls_get_addr);
 #endif
 __weak_reference(__libc_tls_get_addr, __tls_get_addr);
 
-struct tls_tcb *_rtld_allocate_tls(struct tls_tcb *, size_t tcbsize, int flags);
-void _rtld_free_tls(struct tls_tcb *tcb, size_t tcb_size);
 struct tls_tcb *__libc_allocate_tls(struct tls_tcb *old_tcb, size_t tcbsize,
                                    int flags);
 void __libc_free_tls(struct tls_tcb *tcb, size_t tcb_size);
 
-#if defined(__ia64__) || defined(__powerpc__)
-#define TLS_VARIANT_I
-#endif
-#if defined(__i386__) || defined(__amd64__) || defined(__sparc64__) || \
-    defined(__arm__)
-#define TLS_VARIANT_II
+#if !defined(RTLD_STATIC_TLS_VARIANT_II)
+#error "Unsupported TLS layout"
 #endif
 
 #ifndef PIC
@@ -106,8 +103,8 @@ __libc_free_tls(struct tls_tcb *tcb, size_t tcb_size __unused)
 {
        size_t data_size;
 
-       if (tcb->dtv_base)
-               free(tcb->dtv_base);
+       if (tcb->tcb_dtv)
+               free(tcb->tcb_dtv);
        data_size = (tls_static_space + RTLD_STATIC_TLS_ALIGN_MASK) &
                    ~RTLD_STATIC_TLS_ALIGN_MASK;
        free((char *)tcb - data_size);
@@ -127,10 +124,13 @@ __libc_allocate_tls(struct tls_tcb *old_tcb, size_t tcb_size, int flags)
                    ~RTLD_STATIC_TLS_ALIGN_MASK;
        tcb = malloc(data_size + tcb_size);
        tcb = (struct tls_tcb *)((char *)tcb + data_size);
-       bzero(tcb, tcb_size);
        dtv = malloc(3 * sizeof(Elf_Addr));
-       tcb->tcb_base = tcb;
-       tcb->dtv_base = dtv;
+
+#ifdef RTLD_TCB_HAS_SELF_POINTER
+       tcb->tcb_self = tcb;
+#endif
+       tcb->tcb_dtv = dtv;
+       tcb->tcb_pthread = NULL;
 
        dtv[0] = 1;
        dtv[1] = 1;
@@ -222,7 +222,7 @@ _init_tls()
 
        if (tls_static_space) {
                tcb = _rtld_allocate_tls(NULL, sizeof(struct tls_tcb), 0);
-               _set_tp(tcb, (size_t)-1);
+               tls_set_tcb(tcb);
        }
 #endif
 }
index 54de25e..2a212f4 100644 (file)
@@ -1,6 +1,6 @@
 #      @(#)Makefile.inc        8.1 (Berkeley) 6/4/93
 # $FreeBSD: src/lib/libc/i386/gen/Makefile.inc,v 1.10.2.1 2001/02/07 00:12:45 peter Exp $
-# $DragonFly: src/lib/libc/i386/gen/Makefile.inc,v 1.3 2005/03/08 13:32:08 davidxu Exp $
+# $DragonFly: src/lib/libc/i386/gen/Makefile.inc,v 1.4 2005/03/29 19:26:19 joerg Exp $
 
-SRCS+= _set_tp.c _setjmp.S alloca.S fabs.S frexp.c infinity.c isinf.c \
+SRCS+= _setjmp.S alloca.S fabs.S frexp.c infinity.c isinf.c \
        ldexp.c modf.S rfork_thread.S setjmp.S sigsetjmp.S
index c4e3892..7fecc57 100644 (file)
@@ -30,7 +30,7 @@
  * SUCH DAMAGE.
  *
  * $FreeBSD: src/lib/libc/include/libc_private.h,v 1.3 1999/08/27 23:59:47 peter Exp $
- * $DragonFly: src/lib/libc/include/libc_private.h,v 1.4 2005/03/08 13:09:40 davidxu Exp $
+ * $DragonFly: src/lib/libc/include/libc_private.h,v 1.5 2005/03/29 19:26:19 joerg Exp $
  *
  * Private definitions for libc, libc_r and libpthread.
  *
@@ -77,9 +77,4 @@ int _fseeko(FILE *, __off_t, int);
  */
 void _init_tls(void);
 
-/*
- * Set the TLS thread pointer
- */
-void _set_tp(void *p, int size);
-
 #endif /* _LIBC_PRIVATE_H_ */
index 554043f..fab2337 100644 (file)
@@ -1,5 +1,5 @@
 # $FreeBSD: src/lib/libpthread/Makefile,v 1.53 2004/10/24 15:32:32 ru Exp $
-# $DragonFly: src/lib/libthread_xu/Makefile,v 1.1 2005/02/01 12:38:26 davidxu Exp $
+# $DragonFly: src/lib/libthread_xu/Makefile,v 1.2 2005/03/29 19:26:20 joerg Exp $
 #
 # All library objects contain FreeBSD revision strings by default; they may be
 # excluded as a space-saving measure.  To produce a library that does
@@ -16,8 +16,6 @@ CFLAGS+=-I${.CURDIR}/../libc/include -I${.CURDIR}/thread \
        -I${.CURDIR}/../../include
 CFLAGS+=-I${.CURDIR}/arch/${MACHINE_ARCH}/include
 CFLAGS+=-I${.CURDIR}/sys
-CFLAGS+=-I${.CURDIR}/../../libexec/rtld-elf
-CFLAGS+=-I${.CURDIR}/../../libexec/rtld-elf/${MACHINE_ARCH}
 CFLAGS+=-Winline
 
 CFLAGS+= -g
index 470d76a..46919f1 100644 (file)
@@ -24,7 +24,7 @@
  * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
  *
  * $FreeBSD: src/lib/libpthread/arch/amd64/amd64/pthread_md.c,v 1.4 2004/11/06 03:33:19 peter Exp $
- * $DragonFly: src/lib/libthread_xu/arch/amd64/amd64/pthread_md.c,v 1.2 2005/03/28 03:33:13 dillon Exp $
+ * $DragonFly: src/lib/libthread_xu/arch/amd64/amd64/pthread_md.c,v 1.3 2005/03/29 19:26:20 joerg Exp $
  */
 
 #include <stdlib.h>
 /*
  * The constructors.
  */
-struct tcb *
+struct tls_tcb *
 _tcb_ctor(struct pthread *thread, int initial)
 {
-       struct tcb *old_tcb;
-       struct tcb *tcb;
+       struct tls_tcb *old_tcb, *tcb;
        int flags;
 
        old_tcb = NULL;
@@ -57,15 +56,14 @@ _tcb_ctor(struct pthread *thread, int initial)
                }
        }
        tcb = _rtld_allocate_tls(old_tcb, sizeof(struct tcb), flags);
-       if (tcb) {
-               tcb->tcb_thread = thread;
-       }
+       if (tcb)
+               tcb->tcb_pthread = thread;
 
        return (tcb);
 }
 
 void
-_tcb_dtor(struct tcb *tcb)
+_tcb_dtor(struct tls_tcb *tcb)
 {
-       _rtld_free_tls(tcb, sizeof(struct tcb), 16);
+       _rtld_free_tls(tcb, sizeof(struct tcb));
 }
index d50f465..5d5877f 100644 (file)
@@ -25,7 +25,7 @@
  * SUCH DAMAGE.
  *
  * $FreeBSD: src/lib/libpthread/arch/amd64/include/pthread_md.h,v 1.10 2004/08/25 23:42:40 davidxu Exp $
- * $DragonFly: src/lib/libthread_xu/arch/amd64/include/pthread_md.h,v 1.3 2005/03/15 15:09:22 davidxu Exp $
+ * $DragonFly: src/lib/libthread_xu/arch/amd64/include/pthread_md.h,v 1.4 2005/03/29 19:26:20 joerg Exp $
  */
 
 /*
 
 #include <stddef.h>
 #include <sys/types.h>
-#include <machine/sysarch.h>
 
-#define        DTV_OFFSET              offsetof(struct tcb, tcb_dtv)
+#include <machine/sysarch.h>
+#include <machine/tls.h>
 
 struct pthread;
 
-/*
- * Variant II tcb, %fs points to the struct. 
- */
-
-struct tcb {
-       struct tcb              *tcb_self;      /* required by rtld */
-       void                    *tcb_dtv;       /* required by rtld */
-       struct pthread          *tcb_thread;
-       void                    *tcb_spare[1];  /* align tcb_tmbx to 16 bytes */
-};
-
-/*
- * Evaluates to the byte offset of the per-tcb variable name.
- */
-#define        __tcb_offset(name)      __offsetof(struct tcb, name)
-
-/*
- * Evaluates to the type of the per-tcb variable name.
- */
-#define        __tcb_type(name)        __typeof(((struct tcb *)0)->name)
-
-/*
- * Evaluates to the value of the per-tcb variable name.
- */
-#define        TCB_GET64(name) ({                                      \
-       __tcb_type(name) __result;                              \
-                                                               \
-       u_long __i;                                             \
-       __asm __volatile("movq %%fs:%1, %0"                     \
-           : "=r" (__i)                                        \
-           : "m" (*(u_long *)(__tcb_offset(name))));           \
-       __result = (__tcb_type(name))__i;                       \
-                                                               \
-       __result;                                               \
-})
-
 /*
  * The constructors.
  */
-struct tcb     *_tcb_ctor(struct pthread *, int);
-void           _tcb_dtor(struct tcb *tcb);
-
-/* Thread calls this function to set its private data. */
-static __inline void
-_tcb_set(struct tcb *tcb)
-{
-       amd64_set_fsbase(tcb);
-}
-
-/* Get the current kcb. */
-static __inline struct tcb *
-_tcb_get(void)
-{
-       return (TCB_GET64(tcb_self));
-}
-
-extern struct pthread *_thr_initial;
+struct tls_tcb *_tcb_ctor(struct pthread *, int);
+void           _tcb_dtor(struct tls_tcb *tcb);
 
-/* Get the current thread. */
-static __inline struct pthread *
-_get_curthread(void)
-{
-       if (_thr_initial)
-               return (TCB_GET64(tcb_thread));
-       return (NULL);
-}
 #endif
index ae2ec6b..39a92b7 100644 (file)
  * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
  * SUCH DAMAGE.
  *
- * $DragonFly: src/lib/libthread_xu/arch/i386/i386/pthread_md.c,v 1.5 2005/03/28 03:33:14 dillon Exp $
+ * $DragonFly: src/lib/libthread_xu/arch/i386/i386/pthread_md.c,v 1.6 2005/03/29 19:26:20 joerg Exp $
  */
 
 #include <sys/types.h>
 #include <sys/tls.h>
+
+#include <machine/tls.h>
+
 #include <stdlib.h>
 
-#include "rtld_tls.h"
 #include "pthread_md.h"
 
-struct tcb *
+struct tls_tcb *
 _tcb_ctor(struct pthread *thread, int initial)
 {
-       struct tcb *old_tcb;
-       struct tcb *tcb;
+       struct tls_tcb *old_tcb, *tcb;
        int flags;
 
        old_tcb = 0;
@@ -55,28 +56,16 @@ _tcb_ctor(struct pthread *thread, int initial)
                        flags = RTLD_ALLOC_TLS_FREE_OLD;
                }
        }
-       tcb = _rtld_allocate_tls(old_tcb, sizeof(struct tcb), flags);
-       if (tcb) {
-               tcb->tcb_thread = thread;
-               tcb->tcb_seg = -1;
-       }
-       return (tcb);
-}
+       tcb = _rtld_allocate_tls(old_tcb, sizeof(*tcb), flags);
 
-void
-_tcb_set(struct tcb *tcb)
-{
-       struct tls_info info;
-       int seg;
+       if (tcb)
+               tcb->tcb_pthread = thread;
 
-       info.base = tcb;
-       info.size = sizeof(*tcb);
-       seg = tcb->tcb_seg = sys_set_tls_area(0, &info, sizeof(info));
-       __asm __volatile("movl %0, %%gs" : : "r" (seg));
+       return (tcb);
 }
 
 void
-_tcb_dtor(struct tcb *tcb)
+_tcb_dtor(struct tls_tcb *tcb)
 {
-       _rtld_free_tls(tcb, sizeof(struct tcb));
+       _rtld_free_tls(tcb, sizeof(*tcb));
 }
index 11a680e..9e470a3 100644 (file)
@@ -25,7 +25,7 @@
  * SUCH DAMAGE.
  *
  * $FreeBSD: src/lib/libpthread/arch/i386/include/pthread_md.h,v 1.13 2004/11/06 03:35:51 peter Exp $
- * $DragonFly: src/lib/libthread_xu/arch/i386/include/pthread_md.h,v 1.4 2005/03/15 11:26:34 davidxu Exp $
+ * $DragonFly: src/lib/libthread_xu/arch/i386/include/pthread_md.h,v 1.5 2005/03/29 19:26:20 joerg Exp $
  */
 
 /*
 
 #include <stddef.h>
 #include <sys/types.h>
-
-#define        DTV_OFFSET              offsetof(struct tcb, tcb_dtv)
+#include <machine/tls.h>
 
 struct pthread;
 
-/*
- * Variant II tcb, %gs points to the struct.
- */
-struct tcb {
-       struct tcb              *tcb_self;      /* required by rtld */
-       void                    *tcb_dtv;       /* required by rtld */
-       struct pthread          *tcb_thread;
-       int                     tcb_seg;
-};
-
-/*
- * Evaluates to the byte offset of the per-tcb variable name.
- */
-#define        __tcb_offset(name)      __offsetof(struct tcb, name)
-
-/*
- * Evaluates to the type of the per-tcb variable name.
- */
-#define        __tcb_type(name)        __typeof(((struct tcb *)0)->name)
-
-/*
- * Evaluates to the value of the per-tcb variable name.
- */
-#define        TCB_GET32(name) ({                                      \
-       __tcb_type(name) __result;                              \
-                                                               \
-       u_int __i;                                              \
-       __asm __volatile("movl %%gs:%1, %0"                     \
-           : "=r" (__i)                                        \
-           : "m" (*(u_int *)(__tcb_offset(name))));            \
-       __result = (__tcb_type(name))__i;                       \
-                                                               \
-       __result;                                               \
-})
-
 static __inline int
 atomic_cmpset_int(volatile int *dst, int exp, int src)
 {
@@ -100,27 +64,7 @@ atomic_cmpset_int(volatile int *dst, int exp, int src)
 /*
  * The constructors.
  */
-struct tcb     *_tcb_ctor(struct pthread *, int);
-void           _tcb_dtor(struct tcb *tcb);
-
-/* Called from the thread to set its private data. */
-void           _tcb_set(struct tcb *tcb);
-
-/* Get the current kcb. */
-static __inline struct tcb *
-_tcb_get(void)
-{
-       return (TCB_GET32(tcb_self));
-}
-
-extern struct pthread *_thr_initial;
+struct tls_tcb *_tcb_ctor(struct pthread *, int);
+void           _tcb_dtor(struct tls_tcb *tcb);
 
-/* Get the current thread. */
-static __inline struct pthread *
-_get_curthread(void)
-{
-       if (_thr_initial)
-               return (TCB_GET32(tcb_thread));
-       return (NULL);
-}
 #endif
index b561c78..69d60db 100644 (file)
@@ -1,5 +1,5 @@
 # $FreeBSD: src/lib/libpthread/pthread.map,v 1.13 2004/09/26 06:50:14 deischen Exp $
-# $DragonFly: src/lib/libthread_xu/pthread.map,v 1.1 2005/02/01 12:38:26 davidxu Exp $
+# $DragonFly: src/lib/libthread_xu/pthread.map,v 1.2 2005/03/29 19:26:20 joerg Exp $
 
 LIBTHREAD_1_0 {
 global:
@@ -353,7 +353,6 @@ global:
        _thread_list;
        _thread_max_keys;
        _thread_off_attr_flags;
-       _thread_off_dtv;
        _thread_off_linkmap;
        _thread_off_next;
        _thread_off_tcb;
index 87a571a..90cf48b 100644 (file)
@@ -32,8 +32,9 @@
  * SUCH DAMAGE.
  *
  * $FreeBSD: src/lib/libpthread/sys/thr_error.c,v 1.7 2003/04/23 21:46:50 deischen Exp $
- * $DragonFly: src/lib/libthread_xu/sys/Attic/thr_error.c,v 1.1 2005/02/01 12:38:27 davidxu Exp $
+ * $DragonFly: src/lib/libthread_xu/sys/Attic/thr_error.c,v 1.2 2005/03/29 19:26:20 joerg Exp $
  */
+#include <machine/tls.h>
 #include <pthread.h>
 #include "libc_private.h"
 #include "thr_private.h"
@@ -44,9 +45,9 @@ extern        int     errno;
 int *
 __error(void)
 {
-       struct pthread *curthread = _get_curthread();
+       struct pthread *curthread = tls_get_curthread();
 
-       if (curthread != NULL && curthread != _thr_initial)
+       if (curthread != _thr_initial)
                return (&curthread->error);
        else
                return (&errno);
index f5772e7..2957336 100644 (file)
  * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
  * SUCH DAMAGE.
  *
- * $DragonFly: src/lib/libthread_xu/thread/thr_attr.c,v 1.2 2005/02/21 13:47:21 davidxu Exp $
+ * $DragonFly: src/lib/libthread_xu/thread/thr_attr.c,v 1.3 2005/03/29 19:26:20 joerg Exp $
  */
 
+#include <machine/tls.h>
+
 #include <errno.h>
 #include <pthread.h>
 #include <stdlib.h>
@@ -141,7 +143,7 @@ _pthread_attr_get_np(pthread_t pid, pthread_attr_t *dst)
        if (pid == NULL || dst == NULL || *dst == NULL)
                return (EINVAL);
 
-       curthread = _get_curthread();
+       curthread = tls_get_curthread();
        if ((ret = _thr_ref_add(curthread, pid, /*include dead*/0)) != 0)
                return (ret);
        attr = pid->attr;
index 85b5b64..fdc1c00 100644 (file)
  * SUCH DAMAGE.
  *
  * $FreeBSD: src/lib/libpthread/thread/thr_barrier.c,v 1.1 2003/09/04 14:06:43 davidxu Exp $
- * $DragonFly: src/lib/libthread_xu/thread/thr_barrier.c,v 1.3 2005/03/23 11:21:02 davidxu Exp $
+ * $DragonFly: src/lib/libthread_xu/thread/thr_barrier.c,v 1.4 2005/03/29 19:26:20 joerg Exp $
  */
 
+#include <machine/tls.h>
+
 #include <errno.h>
 #include <stdlib.h>
 #include <pthread.h>
@@ -78,7 +80,7 @@ _pthread_barrier_init(pthread_barrier_t *barrier,
 int
 _pthread_barrier_wait(pthread_barrier_t *barrier)
 {
-       struct pthread *curthread = _get_curthread();
+       struct pthread *curthread = tls_get_curthread();
        pthread_barrier_t bar;
        long cycle;
        int ret;
index c5a1e40..862606b 100644 (file)
  * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF
  * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
  *
- * $DragonFly: src/lib/libthread_xu/thread/thr_cancel.c,v 1.1 2005/02/01 12:38:27 davidxu Exp $
+ * $DragonFly: src/lib/libthread_xu/thread/thr_cancel.c,v 1.2 2005/03/29 19:26:20 joerg Exp $
  */
 
+#include <machine/tls.h>
+
 #include <pthread.h>
 #include "thr_private.h"
 
@@ -39,7 +41,7 @@ int _pthread_setcanceltype(int type, int *oldtype);
 int
 _pthread_cancel(pthread_t pthread)
 {
-       struct pthread *curthread = _get_curthread();
+       struct pthread *curthread = tls_get_curthread();
        int oldval, newval = 0;
        int oldtype;
        int ret;
@@ -82,7 +84,7 @@ testcancel(struct pthread *curthread)
 int
 _pthread_setcancelstate(int state, int *oldstate)
 {
-       struct pthread *curthread = _get_curthread();
+       struct pthread *curthread = tls_get_curthread();
        int oldval, ret;
 
        oldval = curthread->cancelflags;
@@ -109,7 +111,7 @@ _pthread_setcancelstate(int state, int *oldstate)
 int
 _pthread_setcanceltype(int type, int *oldtype)
 {
-       struct pthread  *curthread = _get_curthread();
+       struct pthread  *curthread = tls_get_curthread();
        int oldval, ret;
 
        oldval = curthread->cancelflags;
@@ -137,7 +139,7 @@ _pthread_setcanceltype(int type, int *oldtype)
 void
 _pthread_testcancel(void)
 {
-       testcancel(_get_curthread());
+       testcancel(tls_get_curthread());
 }
 
 int
index 3e0d221..dc47bf6 100644 (file)
  * SUCH DAMAGE.
  *
  * $FreeBSD: src/lib/libpthread/thread/thr_clean.c,v 1.9 2004/12/18 18:07:37 deischen Exp $
- * $DragonFly: src/lib/libthread_xu/thread/thr_clean.c,v 1.1 2005/02/01 12:38:27 davidxu Exp $
+ * $DragonFly: src/lib/libthread_xu/thread/thr_clean.c,v 1.2 2005/03/29 19:26:20 joerg Exp $
  */
+
+#include <machine/tls.h>
+
 #include <signal.h>
 #include <errno.h>
 #include <stdlib.h>
@@ -44,7 +47,7 @@ __weak_reference(_pthread_cleanup_pop, pthread_cleanup_pop);
 void
 _pthread_cleanup_push(void (*routine) (void *), void *routine_arg)
 {
-       struct pthread  *curthread = _get_curthread();
+       struct pthread  *curthread = tls_get_curthread();
        struct pthread_cleanup *new;
 
        if ((new = (struct pthread_cleanup *)
@@ -61,7 +64,7 @@ _pthread_cleanup_push(void (*routine) (void *), void *routine_arg)
 void
 _pthread_cleanup_pop(int execute)
 {
-       struct pthread  *curthread = _get_curthread();
+       struct pthread  *curthread = tls_get_curthread();
        struct pthread_cleanup *old;
 
        if ((old = curthread->cleanup) != NULL) {
index 0acfc54..64c0b00 100644 (file)
  * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF
  * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
  *
- * $DragonFly: src/lib/libthread_xu/thread/thr_cond.c,v 1.3 2005/03/15 11:24:23 davidxu Exp $
+ * $DragonFly: src/lib/libthread_xu/thread/thr_cond.c,v 1.4 2005/03/29 19:26:20 joerg Exp $
  */
 
+#include <machine/tls.h>
+
 #include <stdlib.h>
 #include <errno.h>
 #include <string.h>
@@ -113,7 +115,7 @@ int
 _pthread_cond_destroy(pthread_cond_t *cond)
 {
        struct pthread_cond     *cv;
-       struct pthread          *curthread = _get_curthread();
+       struct pthread          *curthread = tls_get_curthread();
        int                     rval = 0;
 
        if (*cond == NULL)
@@ -159,7 +161,7 @@ struct cond_cancel_info
 static void
 cond_cancel_handler(void *arg)
 {
-       struct pthread *curthread = _get_curthread();
+       struct pthread *curthread = tls_get_curthread();
        struct cond_cancel_info *cci = (struct cond_cancel_info *)arg;
        pthread_cond_t cv;
 
@@ -183,7 +185,7 @@ static int
 cond_wait_common(pthread_cond_t *cond, pthread_mutex_t *mutex,
        const struct timespec *abstime, int cancel)
 {
-       struct pthread  *curthread = _get_curthread();
+       struct pthread  *curthread = tls_get_curthread();
        struct timespec ts, ts2, *tsp;
        struct cond_cancel_info cci;
        pthread_cond_t  cv;
@@ -299,7 +301,7 @@ __pthread_cond_timedwait(pthread_cond_t *cond, pthread_mutex_t *mutex,
 static int
 cond_signal_common(pthread_cond_t *cond, int broadcast)
 {
-       struct pthread  *curthread = _get_curthread();
+       struct pthread  *curthread = tls_get_curthread();
        pthread_cond_t  cv;
        int             ret = 0;
 
index 49e0fdb..191309a 100644 (file)
@@ -32,7 +32,7 @@
  * SUCH DAMAGE.
  *
  * $FreeBSD: src/lib/libpthread/thread/thr_create.c,v 1.58 2004/10/23 23:28:36 davidxu Exp $
- * $DragonFly: src/lib/libthread_xu/thread/thr_create.c,v 1.2 2005/03/15 11:24:23 davidxu Exp $
+ * $DragonFly: src/lib/libthread_xu/thread/thr_create.c,v 1.3 2005/03/29 19:26:20 joerg Exp $
  */
 #include <errno.h>
 #include <stdlib.h>
@@ -42,6 +42,8 @@
 #include <stddef.h>
 #include <sys/time.h>
 #include <machine/reg.h>
+#include <machine/tls.h>
+
 #include <pthread.h>
 #include <sys/signalvar.h>
 
@@ -78,7 +80,7 @@ _pthread_create(pthread_t * thread, const pthread_attr_t * attr,
        if (_thr_isthreaded() == 0 && _thr_setthreaded(1))
                return (EAGAIN);
 
-       curthread = _get_curthread();
+       curthread = tls_get_curthread();
        if ((new_thread = _thr_alloc(curthread)) == NULL)
                return (EAGAIN);
 
@@ -234,7 +236,7 @@ thread_start(void *arg)
 
        curthread = start_arg->thread;
        curthread->tid = _thr_get_tid();
-       _tcb_set(curthread->tcb);
+       tls_set_tcb(curthread->tcb);
        start_arg->started = 1;
        _thr_umtx_wake(&start_arg->started, 1);
 
index 6f32310..29d6c9f 100644 (file)
  * SUCH DAMAGE.
  *
  * $FreeBSD: src/lib/libpthread/thread/thr_detach.c,v 1.23 2003/07/23 02:11:07 deischen Exp $
- * $DragonFly: src/lib/libthread_xu/thread/thr_detach.c,v 1.1 2005/02/01 12:38:27 davidxu Exp $
+ * $DragonFly: src/lib/libthread_xu/thread/thr_detach.c,v 1.2 2005/03/29 19:26:20 joerg Exp $
  */
 #include <sys/types.h>
 #include <machine/atomic.h>
+#include <machine/tls.h>
+
 #include <errno.h>
 #include <pthread.h>
 #include "thr_private.h"
@@ -43,7 +45,7 @@ __weak_reference(_pthread_detach, pthread_detach);
 int
 _pthread_detach(pthread_t pthread)
 {
-       struct pthread *curthread = _get_curthread();
+       struct pthread *curthread = tls_get_curthread();
        int rval;
 
        if (pthread == NULL)
index 6c5b293..f7755e6 100644 (file)
  * SUCH DAMAGE.
  *
  * $FreeBSD: src/lib/libpthread/thread/thr_exit.c,v 1.39 2004/10/23 23:37:54 davidxu Exp $
- * $DragonFly: src/lib/libthread_xu/thread/thr_exit.c,v 1.1 2005/02/01 12:38:27 davidxu Exp $
+ * $DragonFly: src/lib/libthread_xu/thread/thr_exit.c,v 1.2 2005/03/29 19:26:20 joerg Exp $
  */
+
+#include <machine/tls.h>
+
 #include <errno.h>
 #include <unistd.h>
 #include <fcntl.h>
@@ -65,7 +68,7 @@ _thread_exit(char *fname, int lineno, char *msg)
 void
 _thr_exit_cleanup(void)
 {
-       struct pthread  *curthread = _get_curthread();
+       struct pthread  *curthread = tls_get_curthread();
 
        /*
         * POSIX states that cancellation/termination of a thread should
@@ -86,7 +89,7 @@ _thr_exit_cleanup(void)
 void
 _pthread_exit(void *status)
 {
-       struct pthread *curthread = _get_curthread();
+       struct pthread *curthread = tls_get_curthread();
 
        /* Check if this thread is already in the process of exiting: */
        if ((curthread->cancelflags & THR_CANCEL_EXITING) != 0) {
index a41d134..130072f 100644 (file)
  * SUCH DAMAGE.
  *
  * $FreeBSD: src/lib/libpthread/thread/thr_fork.c,v 1.34 2003/11/05 18:18:45 deischen Exp $
- * $DragonFly: src/lib/libthread_xu/thread/thr_fork.c,v 1.2 2005/03/15 11:24:23 davidxu Exp $
+ * $DragonFly: src/lib/libthread_xu/thread/thr_fork.c,v 1.3 2005/03/29 19:26:20 joerg Exp $
  */
+
+#include <machine/tls.h>
+
 #include <errno.h>
 #include <string.h>
 #include <stdlib.h>
@@ -86,7 +89,7 @@ _pthread_atfork(void (*prepare)(void), void (*parent)(void),
        if ((af = malloc(sizeof(struct pthread_atfork))) == NULL)
                return (ENOMEM);
 
-       curthread = _get_curthread();
+       curthread = tls_get_curthread();
        af->prepare = prepare;
        af->parent = parent;
        af->child = child;
@@ -122,7 +125,7 @@ _fork(void)
        if (!_thr_is_inited())
                return (__sys_fork());
 
-       curthread = _get_curthread();
+       curthread = tls_get_curthread();
 
        THR_UMTX_LOCK(curthread, &_thr_atfork_lock);
        tmp = inprogress;
index 8bdd28c..44c9db0 100644 (file)
  * SUCH DAMAGE.
  *
  * $FreeBSD: src/lib/libpthread/thread/thr_getschedparam.c,v 1.10 2003/07/07 04:28:23 davidxu Exp $
- * $DragonFly: src/lib/libthread_xu/thread/thr_getschedparam.c,v 1.1 2005/02/01 12:38:27 davidxu Exp $
+ * $DragonFly: src/lib/libthread_xu/thread/thr_getschedparam.c,v 1.2 2005/03/29 19:26:20 joerg Exp $
  */
+
+#include <machine/tls.h>
+
 #include <errno.h>
 #include <pthread.h>
 #include "thr_private.h"
@@ -42,7 +45,7 @@ int
 _pthread_getschedparam(pthread_t pthread, int *policy, 
        struct sched_param *param)
 {
-       struct pthread *curthread = _get_curthread();
+       struct pthread *curthread = tls_get_curthread();
        int ret, tmp;
 
        if ((param == NULL) || (policy == NULL))
index 01b6300..ff6aa8b 100644 (file)
  * SUCH DAMAGE.
  *
  * $FreeBSD: src/lib/libpthread/thread/thr_info.c,v 1.27 2003/09/22 00:40:23 davidxu Exp $
- * $DragonFly: src/lib/libthread_xu/thread/thr_info.c,v 1.1 2005/02/01 12:38:27 davidxu Exp $
+ * $DragonFly: src/lib/libthread_xu/thread/thr_info.c,v 1.2 2005/03/29 19:26:20 joerg Exp $
  */
+
+#include <machine/tls.h>
+
 #include <stdio.h>
 #include <stdlib.h>
 #include <fcntl.h>
@@ -131,7 +134,7 @@ _thread_dump_info(void)
 static void
 dump_thread(int fd, pthread_t pthread, int long_version)
 {
-       struct pthread *curthread = _get_curthread();
+       struct pthread *curthread = tls_get_curthread();
        char s[512];
        int i;
 
index 7da9567..b5859da 100644 (file)
@@ -31,7 +31,7 @@
  * SUCH DAMAGE.
  *
  * $FreeBSD: src/lib/libpthread/thread/thr_init.c,v 1.66 2004/08/21 11:49:19 davidxu Exp $
- * $DragonFly: src/lib/libthread_xu/thread/thr_init.c,v 1.2 2005/02/21 13:47:21 davidxu Exp $
+ * $DragonFly: src/lib/libthread_xu/thread/thr_init.c,v 1.3 2005/03/29 19:26:20 joerg Exp $
  */
 
 /* Allocate space for global thread variables here: */
@@ -42,6 +42,7 @@
 #include <sys/types.h>
 #include <sys/signalvar.h>
 #include <machine/reg.h>
+#include <machine/tls.h>
 
 #include <sys/ioctl.h>
 #include <sys/mount.h>
@@ -54,6 +55,7 @@
 #include <sys/ttycom.h>
 #include <sys/wait.h>
 #include <sys/mman.h>
+
 #include <dirent.h>
 #include <errno.h>
 #include <fcntl.h>
@@ -289,7 +291,7 @@ _libpthread_init(struct pthread *curthread)
        _thread_active_threads = 1;
 
        /* Setup the thread specific data */
-       _tcb_set(curthread->tcb);
+       tls_set_tcb(curthread->tcb);
 
        if (first) {
                SIGFILLSET(sigset);
index e4dc61c..5bc19a1 100644 (file)
  * SUCH DAMAGE.
  *
  * $FreeBSD: src/lib/libpthread/thread/thr_join.c,v 1.28 2003/12/09 02:20:56 davidxu Exp $
- * $DragonFly: src/lib/libthread_xu/thread/thr_join.c,v 1.2 2005/03/15 11:24:23 davidxu Exp $
+ * $DragonFly: src/lib/libthread_xu/thread/thr_join.c,v 1.3 2005/03/29 19:26:20 joerg Exp $
  */
+
+#include <machine/tls.h>
+
 #include <errno.h>
 #include <pthread.h>
 #include "thr_private.h"
@@ -40,7 +43,7 @@ __weak_reference(_pthread_join, pthread_join);
 
 static void backout_join(void *arg)
 {
-       struct pthread *curthread = _get_curthread();
+       struct pthread *curthread = tls_get_curthread();
        struct pthread *pthread = (struct pthread *)arg;
 
        THREAD_LIST_LOCK(curthread);
@@ -51,7 +54,7 @@ static void backout_join(void *arg)
 int
 _pthread_join(pthread_t pthread, void **thread_return)
 {
-       struct pthread *curthread = _get_curthread();
+       struct pthread *curthread = tls_get_curthread();
        void *tmp;
        long state;
        int oldcancel;
index 2902a0b..aa95229 100644 (file)
  * SUCH DAMAGE.
  *
  * $FreeBSD: src/lib/libpthread/thread/thr_kill.c,v 1.16 2003/06/28 09:55:02 davidxu Exp $
- * $DragonFly: src/lib/libthread_xu/thread/thr_kill.c,v 1.1 2005/02/01 12:38:27 davidxu Exp $
+ * $DragonFly: src/lib/libthread_xu/thread/thr_kill.c,v 1.2 2005/03/29 19:26:20 joerg Exp $
  */
+
+#include <machine/tls.h>
+
 #include <errno.h>
 #include <signal.h>
 #include <pthread.h>
@@ -42,7 +45,7 @@ __weak_reference(_pthread_kill, pthread_kill);
 int
 _pthread_kill(pthread_t pthread, int sig)
 {
-       struct pthread *curthread = _get_curthread();
+       struct pthread *curthread = tls_get_curthread();
        int ret;
 
        /* Check for invalid signal numbers: */
index 7520951..40957c4 100644 (file)
@@ -24,7 +24,7 @@
  * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF
  * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
  *
- * $DragonFly: src/lib/libthread_xu/thread/thr_list.c,v 1.2 2005/03/24 12:38:39 davidxu Exp $
+ * $DragonFly: src/lib/libthread_xu/thread/thr_list.c,v 1.3 2005/03/29 19:26:20 joerg Exp $
  */
 
 #include <sys/cdefs.h>
@@ -140,7 +140,7 @@ struct pthread *
 _thr_alloc(struct pthread *curthread)
 {
        struct pthread  *thread = NULL;
-       struct tcb      *tcb;
+       struct tls_tcb  *tcb;
 
        if (curthread != NULL) {
                if (GC_NEEDED())
index aa11b69..cdc51df 100644 (file)
  * SUCH DAMAGE.
  *
  * $FreeBSD: src/lib/libpthread/thread/thr_mutex.c,v 1.46 2004/10/31 05:03:50 green Exp $
- * $DragonFly: src/lib/libthread_xu/thread/thr_mutex.c,v 1.2 2005/03/15 11:24:23 davidxu Exp $
+ * $DragonFly: src/lib/libthread_xu/thread/thr_mutex.c,v 1.3 2005/03/29 19:26:20 joerg Exp $
  */
+
+#include <machine/tls.h>
+
 #include <stdlib.h>
 #include <errno.h>
 #include <string.h>
@@ -277,7 +280,7 @@ _mutex_fork(struct pthread *curthread)
 int
 _pthread_mutex_destroy(pthread_mutex_t *mutex)
 {
-       struct pthread *curthread = _get_curthread();
+       struct pthread *curthread = tls_get_curthread();
        pthread_mutex_t m;
        int ret = 0;
 
@@ -453,7 +456,7 @@ mutex_trylock_common(struct pthread *curthread, pthread_mutex_t *mutex)
 int
 __pthread_mutex_trylock(pthread_mutex_t *mutex)
 {
-       struct pthread *curthread = _get_curthread();
+       struct pthread *curthread = tls_get_curthread();
        int ret = 0;
 
        /*
@@ -470,7 +473,7 @@ __pthread_mutex_trylock(pthread_mutex_t *mutex)
 int
 _pthread_mutex_trylock(pthread_mutex_t *mutex)
 {
-       struct pthread  *curthread = _get_curthread();
+       struct pthread  *curthread = tls_get_curthread();
        int     ret = 0;
 
        /*
@@ -755,7 +758,7 @@ __pthread_mutex_lock(pthread_mutex_t *m)
 
        _thr_check_init();
 
-       curthread = _get_curthread();
+       curthread = tls_get_curthread();
 
        /*
         * If the mutex is statically initialized, perform the dynamic
@@ -777,7 +780,7 @@ _pthread_mutex_lock(pthread_mutex_t *m)
 
        _thr_check_init();
 
-       curthread = _get_curthread();
+       curthread = tls_get_curthread();
 
        /*
         * If the mutex is statically initialized, perform the dynamic
@@ -799,7 +802,7 @@ __pthread_mutex_timedlock(pthread_mutex_t *m,
 
        _thr_check_init();
 
-       curthread = _get_curthread();
+       curthread = tls_get_curthread();
 
        /*
         * If the mutex is statically initialized, perform the dynamic
@@ -820,7 +823,7 @@ _pthread_mutex_timedlock(pthread_mutex_t *m,
 
        _thr_check_init();
 
-       curthread = _get_curthread();
+       curthread = tls_get_curthread();
 
        /*
         * If the mutex is statically initialized, perform the dynamic
@@ -853,7 +856,7 @@ _mutex_cv_lock(pthread_mutex_t *m)
        struct  pthread *curthread;
        int     ret;
 
-       curthread = _get_curthread();
+       curthread = tls_get_curthread();
        if ((ret = _pthread_mutex_lock(m)) == 0)
                (*m)->m_refcount--;
        return (ret);
@@ -955,7 +958,7 @@ mutex_self_lock(struct pthread *curthread, pthread_mutex_t m,
 static int
 mutex_unlock_common(pthread_mutex_t *m, int add_reference)
 {
-       struct pthread *curthread = _get_curthread();
+       struct pthread *curthread = tls_get_curthread();
        long tid = -1;
        int ret = 0;
 
index 9fda6af..2f43deb 100644 (file)
@@ -32,7 +32,7 @@
  * Private thread definitions for the uthread kernel.
  *
  * $FreeBSD: src/lib/libpthread/thread/thr_private.h,v 1.120 2004/11/01 10:49:34 davidxu Exp $
- * $DragonFly: src/lib/libthread_xu/thread/thr_private.h,v 1.2 2005/02/21 13:47:21 davidxu Exp $
+ * $DragonFly: src/lib/libthread_xu/thread/thr_private.h,v 1.3 2005/03/29 19:26:20 joerg Exp $
  */
 
 #ifndef _THR_PRIVATE_H
@@ -499,7 +499,7 @@ struct pthread {
        int                     rtld_bits;
 
        /* Thread control block */
-       struct tcb              *tcb;
+       struct tls_tcb          *tcb;
 
        /* Cleanup handlers Link List */
        struct pthread_cleanup *cleanup;
index 0d53fc1..93f3a79 100644 (file)
  * SUCH DAMAGE.
  *
  * $FreeBSD: src/lib/libpthread/thread/thr_pspinlock.c,v 1.2 2003/11/04 19:56:12 deischen Exp $
- * $DragonFly: src/lib/libthread_xu/thread/thr_pspinlock.c,v 1.1 2005/02/01 12:38:27 davidxu Exp $
+ * $DragonFly: src/lib/libthread_xu/thread/thr_pspinlock.c,v 1.2 2005/03/29 19:26:20 joerg Exp $
  */
 
+#include <machine/tls.h>
+
 #include <errno.h>
 #include <stdlib.h>
 #include <pthread.h>
@@ -78,7 +80,7 @@ _pthread_spin_destroy(pthread_spinlock_t *lock)
 int
 _pthread_spin_trylock(pthread_spinlock_t *lock)
 {
-       struct pthread *curthread = _get_curthread();
+       struct pthread *curthread = tls_get_curthread();
        struct pthread_spinlock *lck;
        int ret;
 
@@ -92,7 +94,7 @@ _pthread_spin_trylock(pthread_spinlock_t *lock)
 int
 _pthread_spin_lock(pthread_spinlock_t *lock)
 {
-       struct pthread *curthread = _get_curthread();
+       struct pthread *curthread = tls_get_curthread();
        struct pthread_spinlock *lck;
        int ret, count;
 
@@ -121,7 +123,7 @@ _pthread_spin_lock(pthread_spinlock_t *lock)
 int
 _pthread_spin_unlock(pthread_spinlock_t *lock)
 {
-       struct pthread *curthread = _get_curthread();
+       struct pthread *curthread = tls_get_curthread();
        struct pthread_spinlock *lck;
        int ret;
 
index c865ea2..77a39cd 100644 (file)
  * SUCH DAMAGE.
  *
  * $FreeBSD: src/lib/libpthread/thread/thr_resume_np.c,v 1.18 2003/07/23 02:11:07 deischen Exp $
- * $DragonFly: src/lib/libthread_xu/thread/thr_resume_np.c,v 1.1 2005/02/01 12:38:27 davidxu Exp $
+ * $DragonFly: src/lib/libthread_xu/thread/thr_resume_np.c,v 1.2 2005/03/29 19:26:20 joerg Exp $
  */
+
+#include <machine/tls.h>
+
 #include <errno.h>
 #include <pthread.h>
 #include "thr_private.h"
@@ -45,7 +48,7 @@ static void resume_common(struct pthread *thread);
 int
 _pthread_resume_np(pthread_t thread)
 {
-       struct pthread *curthread = _get_curthread();
+       struct pthread *curthread = tls_get_curthread();
        int ret;
 
        /* Add a reference to the thread: */
@@ -62,7 +65,7 @@ _pthread_resume_np(pthread_t thread)
 void
 _pthread_resume_all_np(void)
 {
-       struct pthread *curthread = _get_curthread();
+       struct pthread *curthread = tls_get_curthread();
        struct pthread *thread;
 
        /* Take the thread list lock: */
index 179d75a..65c2e69 100644 (file)
  * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
  *
  * $FreeBSD: src/lib/libpthread/thread/thr_rtld.c,v 1.5 2003/11/05 18:19:24 deischen Exp $
- * $DragonFly: src/lib/libthread_xu/thread/thr_rtld.c,v 1.1 2005/02/01 12:38:27 davidxu Exp $
+ * $DragonFly: src/lib/libthread_xu/thread/thr_rtld.c,v 1.2 2005/03/29 19:26:20 joerg Exp $
  */
-#include <sys/cdefs.h>
+#include <machine/tls.h>
+
 #include <stdlib.h>
 #include <pthread.h>
 
@@ -96,7 +97,7 @@ _thr_rtld_set_flag(int mask)
        struct pthread *curthread;
        int bits;
 
-       curthread = _get_curthread();
+       curthread = tls_get_curthread();
        if (curthread != NULL) {
                bits = curthread->rtld_bits;
                curthread->rtld_bits |= mask;
@@ -114,7 +115,7 @@ _thr_rtld_clr_flag(int mask)
        struct pthread *curthread;
        int bits;
 
-       curthread = _get_curthread();
+       curthread = tls_get_curthread();
        if (curthread != NULL) {
                bits = curthread->rtld_bits;
                curthread->rtld_bits &= ~mask;
index 4d77459..571bfbc 100644 (file)
  * SUCH DAMAGE.
  *
  * $FreeBSD: src/lib/libpthread/thread/thr_rwlock.c,v 1.14 2004/01/08 15:37:09 deischen Exp $
- * $DragonFly: src/lib/libthread_xu/thread/thr_rwlock.c,v 1.1 2005/02/01 12:38:27 davidxu Exp $
+ * $DragonFly: src/lib/libthread_xu/thread/thr_rwlock.c,v 1.2 2005/03/29 19:26:20 joerg Exp $
  */
 
+#include <machine/tls.h>
+
 #include <errno.h>
 #include <limits.h>
 #include <stdlib.h>
@@ -144,7 +146,7 @@ _pthread_rwlock_init (pthread_rwlock_t *rwlock, const pthread_rwlockattr_t *attr
 static int
 rwlock_rdlock_common (pthread_rwlock_t *rwlock, const struct timespec *abstime)
 {
-       struct pthread *curthread = _get_curthread();
+       struct pthread *curthread = tls_get_curthread();
        pthread_rwlock_t prwlock;
        int ret;
 
@@ -171,7 +173,7 @@ rwlock_rdlock_common (pthread_rwlock_t *rwlock, const struct timespec *abstime)
                return (EAGAIN);
        }
 
-       curthread = _get_curthread();
+       curthread = tls_get_curthread();
        if ((curthread->rdlock_count > 0) && (prwlock->state > 0)) {
                /*
                 * To avoid having to track all the rdlocks held by
@@ -236,7 +238,7 @@ _pthread_rwlock_timedrdlock (pthread_rwlock_t *rwlock,
 int
 _pthread_rwlock_tryrdlock (pthread_rwlock_t *rwlock)
 {
-       struct pthread *curthread = _get_curthread();
+       struct pthread *curthread = tls_get_curthread();
        pthread_rwlock_t prwlock;
        int ret;
 
@@ -257,7 +259,7 @@ _pthread_rwlock_tryrdlock (pthread_rwlock_t *rwlock)
        if ((ret = _pthread_mutex_lock(&prwlock->lock)) != 0)
                return (ret);
 
-       curthread = _get_curthread();
+       curthread = tls_get_curthread();
        if (prwlock->state == MAX_READ_LOCKS)
                ret = EAGAIN;
        else if ((curthread->rdlock_count > 0) && (prwlock->state > 0)) {
@@ -282,7 +284,7 @@ _pthread_rwlock_tryrdlock (pthread_rwlock_t *rwlock)
 int
 _pthread_rwlock_trywrlock (pthread_rwlock_t *rwlock)
 {
-       struct pthread *curthread = _get_curthread();
+       struct pthread *curthread = tls_get_curthread();
        pthread_rwlock_t prwlock;
        int ret;
 
@@ -334,7 +336,7 @@ _pthread_rwlock_unlock (pthread_rwlock_t *rwlock)
        if ((ret = _thr_mutex_lock(&prwlock->lock)) != 0)
                return (ret);
 
-       curthread = _get_curthread();
+       curthread = tls_get_curthread();
        if (prwlock->state > 0) {
                curthread->rdlock_count--;
                prwlock->state--;
@@ -361,7 +363,7 @@ __strong_reference(_pthread_rwlock_unlock, _thr_rwlock_unlock);
 static int
 rwlock_wrlock_common (pthread_rwlock_t *rwlock, const struct timespec *abstime)
 {
-       struct pthread *curthread = _get_curthread();
+       struct pthread *curthread = tls_get_curthread();
        pthread_rwlock_t prwlock;
        int ret;
 
index 16ce6b9..b98ee1a 100644 (file)
  * SUCH DAMAGE.
  *
  * $FreeBSD: src/lib/libpthread/thread/thr_self.c,v 1.7 2003/04/18 05:04:16 deischen Exp $
- * $DragonFly: src/lib/libthread_xu/thread/thr_self.c,v 1.1 2005/02/01 12:38:27 davidxu Exp $
+ * $DragonFly: src/lib/libthread_xu/thread/thr_self.c,v 1.2 2005/03/29 19:26:20 joerg Exp $
  */
+
+#include <machine/tls.h>
+
 #include <pthread.h>
 #include "thr_private.h"
 
@@ -43,5 +46,5 @@ _pthread_self(void)
        _thr_check_init();
 
        /* Return the running thread pointer: */
-       return (_get_curthread());
+       return (tls_get_curthread());
 }
index 7d71450..901d26c 100644 (file)
  * EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
  *
  * $FreeBSD: src/lib/libpthread/thread/thr_sem.c,v 1.16 2004/12/18 18:07:37 deischen Exp $
- * $DragonFly: src/lib/libthread_xu/thread/thr_sem.c,v 1.2 2005/03/15 11:24:23 davidxu Exp $
+ * $DragonFly: src/lib/libthread_xu/thread/thr_sem.c,v 1.3 2005/03/29 19:26:20 joerg Exp $
  */
 
 #include <sys/queue.h>
+
+#include <machine/tls.h>
+
 #include <errno.h>
 #include <fcntl.h>
 #include <pthread.h>
@@ -180,7 +183,7 @@ _sem_wait(sem_t *sem)
        if (sem_check_validity(sem) != 0)
                return (-1);
 
-       curthread = _get_curthread();
+       curthread = tls_get_curthread();
        _pthread_testcancel();
        do {
                while ((val = (*sem)->count) > 0) {
@@ -205,7 +208,7 @@ _sem_timedwait(sem_t * __restrict sem, struct timespec * __restrict abstime)
        if (sem_check_validity(sem) != 0)
                return (-1);
 
-       curthread = _get_curthread();
+       curthread = tls_get_curthread();
 
        /*
         * The timeout argument is only supposed to
index 9953cad..00214f3 100644 (file)
  * SUCH DAMAGE.
  *
  * $FreeBSD: src/lib/libpthread/thread/thr_setschedparam.c,v 1.13 2003/04/21 04:02:56 deischen Exp $
- * $DragonFly: src/lib/libthread_xu/thread/thr_setschedparam.c,v 1.1 2005/02/01 12:38:27 davidxu Exp $
+ * $DragonFly: src/lib/libthread_xu/thread/thr_setschedparam.c,v 1.2 2005/03/29 19:26:20 joerg Exp $
  */
+
+#include <machine/tls.h>
+
 #include <errno.h>
 #include <sys/param.h>
 #include <pthread.h>
@@ -43,7 +46,7 @@ int
 _pthread_setschedparam(pthread_t pthread, int policy, 
        const struct sched_param *param)
 {
-       struct pthread *curthread = _get_curthread();
+       struct pthread *curthread = tls_get_curthread();
        int     in_syncq;
        int     in_readyq = 0;
        int     old_prio;
index 0ed55e0..48cf5e3 100644 (file)
  * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
  * SUCH DAMAGE.
  *
- * $DragonFly: src/lib/libthread_xu/thread/thr_sig.c,v 1.3 2005/03/15 11:24:23 davidxu Exp $
+ * $DragonFly: src/lib/libthread_xu/thread/thr_sig.c,v 1.4 2005/03/29 19:26:20 joerg Exp $
  */
 
 #include <sys/param.h>
-#include <sys/types.h>
 #include <sys/signalvar.h>
+
+#include <machine/tls.h>
+
 #include <signal.h>
 #include <errno.h>
 #include <fcntl.h>
@@ -54,7 +56,7 @@
 static void
 sigcancel_handler(int sig, siginfo_t *info, ucontext_t *ucp)
 {
-       struct pthread *curthread = _get_curthread();
+       struct pthread *curthread = tls_get_curthread();
 
        if (curthread->cancelflags & THR_CANCEL_AT_POINT)
                pthread_testcancel();
@@ -154,7 +156,7 @@ __weak_reference(_sigsuspend, sigsuspend);
 int
 _sigsuspend(const sigset_t * set)
 {
-       struct pthread *curthread = _get_curthread();
+       struct pthread *curthread = tls_get_curthread();
        sigset_t newset;
        const sigset_t *pset;
        int oldcancel;
@@ -182,7 +184,7 @@ int
 __sigtimedwait(const sigset_t *set, siginfo_t *info,
        const struct timespec * timeout)
 {
-       struct pthread  *curthread = _get_curthread();
+       struct pthread  *curthread = tls_get_curthread();
        sigset_t newset;
        const sigset_t *pset;
        int oldcancel;
@@ -203,7 +205,7 @@ __sigtimedwait(const sigset_t *set, siginfo_t *info,
 int
 __sigwaitinfo(const sigset_t *set, siginfo_t *info)
 {
-       struct pthread  *curthread = _get_curthread();
+       struct pthread  *curthread = tls_get_curthread();
        sigset_t newset;
        const sigset_t *pset;
        int oldcancel;
index d6390f4..3bad9d8 100644 (file)
  * SUCH DAMAGE.
  *
  * $FreeBSD: src/lib/libpthread/thread/thr_spec.c,v 1.22 2004/07/13 22:49:58 davidxu Exp $
- * $DragonFly: src/lib/libthread_xu/thread/thr_spec.c,v 1.1 2005/02/01 12:38:27 davidxu Exp $
+ * $DragonFly: src/lib/libthread_xu/thread/thr_spec.c,v 1.2 2005/03/29 19:26:20 joerg Exp $
  */
+
+#include <machine/tls.h>
+
 #include <signal.h>
 #include <stdlib.h>
 #include <string.h>
@@ -51,7 +54,7 @@ __weak_reference(_pthread_setspecific, pthread_setspecific);
 int
 _pthread_key_create(pthread_key_t *key, void (*destructor) (void *))
 {
-       struct pthread *curthread = _get_curthread();
+       struct pthread *curthread = tls_get_curthread();
        int i;
 
        /* Lock the key table: */
@@ -78,7 +81,7 @@ _pthread_key_create(pthread_key_t *key, void (*destructor) (void *))
 int
 _pthread_key_delete(pthread_key_t key)
 {
-       struct pthread *curthread = _get_curthread();
+       struct pthread *curthread = tls_get_curthread();
        int ret = 0;
 
        if ((unsigned int)key < PTHREAD_KEYS_MAX) {
@@ -100,7 +103,7 @@ _pthread_key_delete(pthread_key_t key)
 void 
 _thread_cleanupspecific(void)
 {
-       struct pthread  *curthread = _get_curthread();
+       struct pthread  *curthread = tls_get_curthread();
        void            (*destructor)( void *);
        void            *data = NULL;
        int             key;
@@ -174,7 +177,7 @@ _pthread_setspecific(pthread_key_t key, const void *value)
        int             ret = 0;
 
        /* Point to the running thread: */
-       pthread = _get_curthread();
+       pthread = tls_get_curthread();
 
        if ((pthread->specific) ||
            (pthread->specific = pthread_key_allocate_data())) {
@@ -205,7 +208,7 @@ _pthread_getspecific(pthread_key_t key)
        void            *data;
 
        /* Point to the running thread: */
-       pthread = _get_curthread();
+       pthread = tls_get_curthread();
 
        /* Check if there is specific data: */
        if (pthread->specific != NULL && (unsigned int)key < PTHREAD_KEYS_MAX) {
index c6daf41..a30a6d3 100644 (file)
  * SUCH DAMAGE.
  *
  * $FreeBSD: src/lib/libpthread/thread/thr_spinlock.c,v 1.21 2003/12/09 02:37:40 davidxu Exp $
- * $DragonFly: src/lib/libthread_xu/thread/thr_spinlock.c,v 1.1 2005/02/01 12:38:27 davidxu Exp $
+ * $DragonFly: src/lib/libthread_xu/thread/thr_spinlock.c,v 1.2 2005/03/29 19:26:20 joerg Exp $
  */
 
 #include <sys/types.h>
 #include <machine/atomic.h>
+#include <machine/tls.h>
 #include <pthread.h>
 #include <libc_private.h>
 #include "spinlock.h"
@@ -65,19 +66,25 @@ static void init_spinlock(spinlock_t *lck);
 void
 _spinunlock(spinlock_t *lck)
 {
-       THR_UMTX_UNLOCK(_get_curthread(), (umtx_t *)&lck->access_lock);
+       struct pthread *curthread = tls_get_curthread();
+
+       THR_UMTX_UNLOCK(curthread, (umtx_t *)&lck->access_lock);
 }
 
 void
 _spinlock(spinlock_t *lck)
 {
+       struct pthread *curthread;
+
        if (!__isthreaded)
                PANIC("Spinlock called when not threaded.");
        if (!initialized)
                PANIC("Spinlocks not initialized.");
        if (lck->fname == NULL)
                init_spinlock(lck);
-       THR_UMTX_LOCK(_get_curthread(), (umtx_t *)&lck->access_lock);
+
+       curthread = tls_get_curthread();
+       THR_UMTX_LOCK(curthread, (umtx_t *)&lck->access_lock);
 }
 
 void
@@ -90,14 +97,15 @@ static void
 init_spinlock(spinlock_t *lck)
 {
        static int count = 0;
+       struct pthread *curthread = tls_get_curthread();
 
-       THR_UMTX_LOCK(_get_curthread(), &spinlock_static_lock);
+       THR_UMTX_LOCK(curthread, &spinlock_static_lock);
        if ((lck->fname == NULL) && (spinlock_count < MAX_SPINLOCKS)) {
                lck->fname = (char *)&extra[spinlock_count];
                extra[spinlock_count].owner = lck;
                spinlock_count++;
        }
-       THR_UMTX_UNLOCK(_get_curthread(), &spinlock_static_lock);
+       THR_UMTX_UNLOCK(curthread, &spinlock_static_lock);
        if (lck->fname == NULL && ++count < 5)
                stderr_debug("Warning: exceeded max spinlocks");
 }
index 4ac8b6b..c9168d2 100644 (file)
  * SUCH DAMAGE.
  *
  * $FreeBSD: src/lib/libpthread/thread/thr_stack.c,v 1.9 2004/10/06 08:11:07 davidxu Exp $
- * $DragonFly: src/lib/libthread_xu/thread/thr_stack.c,v 1.2 2005/02/21 13:47:21 davidxu Exp $
+ * $DragonFly: src/lib/libthread_xu/thread/thr_stack.c,v 1.3 2005/03/29 19:26:20 joerg Exp $
  */
 #include <sys/types.h>
 #include <sys/mman.h>
 #include <sys/queue.h>
+
+#include <machine/tls.h>
+
 #include <stdlib.h>
 #include <pthread.h>
 #include "thr_private.h"
@@ -130,7 +133,7 @@ round_up(size_t size)
 int
 _thr_stack_alloc(struct pthread_attr *attr)
 {
-       struct pthread *curthread = _get_curthread();
+       struct pthread *curthread = tls_get_curthread();
        struct stack *spare_stack;
        size_t stacksize;
        size_t guardsize;
index de71e61..a8779de 100644 (file)
  * SUCH DAMAGE.
  *
  * $FreeBSD: src/lib/libpthread/thread/thr_suspend_np.c,v 1.19 2003/05/04 16:17:01 deischen Exp $
- * $DragonFly: src/lib/libthread_xu/thread/thr_suspend_np.c,v 1.1 2005/02/01 12:38:27 davidxu Exp $
+ * $DragonFly: src/lib/libthread_xu/thread/thr_suspend_np.c,v 1.2 2005/03/29 19:26:20 joerg Exp $
  */
+
+#include <machine/tls.h>
 #include <errno.h>
 #include <pthread.h>
 #include "thr_private.h"
@@ -45,11 +47,11 @@ __weak_reference(_pthread_suspend_all_np, pthread_suspend_all_np);
 int
 _pthread_suspend_np(pthread_t thread)
 {
-       struct pthread *curthread = _get_curthread();
+       struct pthread *curthread = tls_get_curthread();
        int ret;
 
        /* Suspending the current thread doesn't make sense. */
-       if (thread == _get_curthread())
+       if (thread == curthread)
                ret = EDEADLK;
 
        /* Add a reference to the thread: */
@@ -70,7 +72,7 @@ _pthread_suspend_np(pthread_t thread)
 void
 _pthread_suspend_all_np(void)
 {
-       struct pthread  *curthread = _get_curthread();
+       struct pthread  *curthread = tls_get_curthread();
        struct pthread  *thread;
 
        /* Take the thread list lock: */
index d38da54..1e4b3e5 100644 (file)
@@ -30,7 +30,7 @@
  * SUCH DAMAGE.
  *
  * $FreeBSD: src/lib/libpthread/thread/thr_symbols.c,v 1.1 2004/08/16 03:25:07 davidxu Exp $
- * $DragonFly: src/lib/libthread_xu/thread/thr_symbols.c,v 1.1 2005/02/01 12:38:27 davidxu Exp $
+ * $DragonFly: src/lib/libthread_xu/thread/thr_symbols.c,v 1.2 2005/03/29 19:26:20 joerg Exp $
  */
 
 #include <stddef.h>
@@ -53,7 +53,6 @@ int _thread_size_key = sizeof(struct pthread_key);
 int _thread_off_key_allocated = offsetof(struct pthread_key, allocated);
 int _thread_off_key_destructor = offsetof(struct pthread_key, destructor);
 int _thread_max_keys = PTHREAD_KEYS_MAX;
-int _thread_off_dtv = DTV_OFFSET;
 int _thread_off_state = offsetof(struct pthread, state);
 int _thread_state_running = PS_RUNNING;
 int _thread_state_zoombie = PS_DEAD;
index 684c093..0d630f1 100644 (file)
@@ -28,7 +28,7 @@
  * OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE,
  * EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
  *
- * $DragonFly: src/lib/libthread_xu/thread/thr_syscalls.c,v 1.2 2005/02/21 13:40:00 davidxu Exp $
+ * $DragonFly: src/lib/libthread_xu/thread/thr_syscalls.c,v 1.3 2005/03/29 19:26:20 joerg Exp $
  */
 
 /*
@@ -64,7 +64,6 @@
  *
  */
 
-#include <sys/cdefs.h>
 #include <sys/types.h>
 #include <sys/mman.h>
 #include <sys/param.h>
@@ -75,6 +74,9 @@
 #include <sys/time.h>
 #include <sys/uio.h>
 #include <sys/wait.h>
+
+#include <machine/tls.h>
+
 #include <aio.h>
 #include <dirent.h>
 #include <errno.h>
@@ -110,7 +112,7 @@ __accept(int s, struct sockaddr *addr, socklen_t *addrlen)
        int oldcancel;
        int ret;
 
-       curthread = _get_curthread();
+       curthread = tls_get_curthread();
        oldcancel = _thr_cancel_enter(curthread);
        ret = __sys_accept(s, addr, addrlen);
        _thr_cancel_leave(curthread, oldcancel);
@@ -124,7 +126,7 @@ int
 _aio_suspend(const struct aiocb * const iocbs[], int niocb, const struct
     timespec *timeout)
 {
-       struct pthread *curthread = _get_curthread();
+       struct pthread *curthread = tls_get_curthread();
        int oldcancel;
        int ret;
 
@@ -140,7 +142,7 @@ __weak_reference(__close, close);
 int
 __close(int fd)
 {
-       struct pthread  *curthread = _get_curthread();
+       struct pthread  *curthread = tls_get_curthread();
        int     oldcancel;
        int     ret;
 
@@ -156,11 +158,11 @@ __weak_reference(__connect, connect);
 int
 __connect(int fd, const struct sockaddr *name, socklen_t namelen)
 {
-       struct pthread *curthread = _get_curthread();
+       struct pthread *curthread = tls_get_curthread();
        int oldcancel;
        int ret;
 
-       curthread = _get_curthread();
+       curthread = tls_get_curthread();
        oldcancel = _thr_cancel_enter(curthread);
        ret = __sys_connect(fd, name, namelen);
        _thr_cancel_leave(curthread, oldcancel);
@@ -173,7 +175,7 @@ __weak_reference(___creat, creat);
 int
 ___creat(const char *path, mode_t mode)
 {
-       struct pthread *curthread = _get_curthread();
+       struct pthread *curthread = tls_get_curthread();
        int oldcancel;
        int ret;
 
@@ -189,7 +191,7 @@ __weak_reference(__fcntl, fcntl);
 int
 __fcntl(int fd, int cmd,...)
 {
-       struct pthread *curthread = _get_curthread();
+       struct pthread *curthread = tls_get_curthread();
        int     oldcancel;
        int     ret;
        va_list ap;
@@ -224,7 +226,7 @@ __weak_reference(__fsync, fsync);
 int
 __fsync(int fd)
 {
-       struct pthread *curthread = _get_curthread();
+       struct pthread *curthread = tls_get_curthread();
        int     oldcancel;
        int     ret;
 
@@ -240,7 +242,7 @@ __weak_reference(__msync, msync);
 int
 __msync(void *addr, size_t len, int flags)
 {
-       struct pthread *curthread = _get_curthread();
+       struct pthread *curthread = tls_get_curthread();
        int     oldcancel;
        int     ret;
 
@@ -257,7 +259,7 @@ int
 __nanosleep(const struct timespec *time_to_sleep,
     struct timespec *time_remaining)
 {
-       struct pthread *curthread = _get_curthread();
+       struct pthread *curthread = tls_get_curthread();
        int             oldcancel;
        int             ret;
 
@@ -273,7 +275,7 @@ __weak_reference(___open, open);
 int
 ___open(const char *path, int flags,...)
 {
-       struct pthread *curthread = _get_curthread();
+       struct pthread *curthread = tls_get_curthread();
        int     oldcancel;
        int     ret;
        int     mode = 0;
@@ -301,7 +303,7 @@ __weak_reference(_pause, pause);
 int
 _pause(void)
 {
-       struct pthread *curthread = _get_curthread();
+       struct pthread *curthread = tls_get_curthread();
        int     oldcancel;
        int     ret;
 
@@ -317,7 +319,7 @@ __weak_reference(__poll, poll);
 int
 __poll(struct pollfd *fds, unsigned int nfds, int timeout)
 {
-       struct pthread *curthread = _get_curthread();
+       struct pthread *curthread = tls_get_curthread();
        int oldcancel;
        int ret;
 
@@ -335,7 +337,7 @@ int
 _pselect(int count, fd_set *rfds, fd_set *wfds, fd_set *efds, 
        const struct timespec *timo, const sigset_t *mask)
 {
-       struct pthread *curthread = _get_curthread();
+       struct pthread *curthread = tls_get_curthread();
        int oldcancel;
        int ret;
 
@@ -371,7 +373,7 @@ __weak_reference(__read, read);
 ssize_t
 __read(int fd, void *buf, size_t nbytes)
 {
-       struct pthread *curthread = _get_curthread();
+       struct pthread *curthread = tls_get_curthread();
        int oldcancel;
        ssize_t ret;
 
@@ -387,7 +389,7 @@ __weak_reference(__readv, readv);
 ssize_t
 __readv(int fd, const struct iovec *iov, int iovcnt)
 {
-       struct pthread *curthread = _get_curthread();
+       struct pthread *curthread = tls_get_curthread();
        int oldcancel;
        ssize_t ret;
 
@@ -404,7 +406,7 @@ ssize_t
 __recvfrom(int s, void *b, size_t l, int f, struct sockaddr *from,
     socklen_t *fl)
 {
-       struct pthread *curthread = _get_curthread();
+       struct pthread *curthread = tls_get_curthread();
        int oldcancel;
        ssize_t ret;
 
@@ -419,7 +421,7 @@ __weak_reference(__recvmsg, recvmsg);
 ssize_t
 __recvmsg(int s, struct msghdr *m, int f)
 {
-       struct pthread *curthread = _get_curthread();
+       struct pthread *curthread = tls_get_curthread();
        ssize_t ret;
        int oldcancel;
 
@@ -435,7 +437,7 @@ int
 __select(int numfds, fd_set *readfds, fd_set *writefds, fd_set *exceptfds,
        struct timeval *timeout)
 {
-       struct pthread *curthread = _get_curthread();
+       struct pthread *curthread = tls_get_curthread();
        int oldcancel;
        int ret;
 
@@ -450,7 +452,7 @@ __weak_reference(__sendmsg, sendmsg);
 ssize_t
 __sendmsg(int s, const struct msghdr *m, int f)
 {
-       struct pthread *curthread = _get_curthread();
+       struct pthread *curthread = tls_get_curthread();
        ssize_t ret;
        int oldcancel;
 
@@ -466,7 +468,7 @@ ssize_t
 __sendto(int s, const void *m, size_t l, int f, const struct sockaddr *t,
     socklen_t tl)
 {
-       struct pthread *curthread = _get_curthread();
+       struct pthread *curthread = tls_get_curthread();
        ssize_t ret;
        int oldcancel;
 
@@ -479,7 +481,7 @@ __sendto(int s, const void *m, size_t l, int f, const struct sockaddr *t,
 unsigned int
 _sleep(unsigned int seconds)
 {
-       struct pthread *curthread = _get_curthread();
+       struct pthread *curthread = tls_get_curthread();
        int             oldcancel;
        unsigned int    ret;
 
@@ -495,7 +497,7 @@ __weak_reference(_system, system);
 int
 _system(const char *string)
 {
-       struct pthread *curthread = _get_curthread();
+       struct pthread *curthread = tls_get_curthread();
        int     oldcancel;
        int     ret;
 
@@ -511,7 +513,7 @@ __weak_reference(_tcdrain, tcdrain);
 int
 _tcdrain(int fd)
 {
-       struct pthread *curthread = _get_curthread();
+       struct pthread *curthread = tls_get_curthread();
        int     oldcancel;
        int     ret;
        
@@ -535,7 +537,7 @@ __weak_reference(_wait, wait);
 pid_t
 _wait(int *istat)
 {
-       struct pthread *curthread = _get_curthread();
+       struct pthread *curthread = tls_get_curthread();
        int     oldcancel;
        pid_t   ret;
 
@@ -551,7 +553,7 @@ __weak_reference(__wait4, wait4);
 pid_t
 __wait4(pid_t pid, int *istat, int options, struct rusage *rusage)
 {
-       struct pthread *curthread = _get_curthread();
+       struct pthread *curthread = tls_get_curthread();
        int oldcancel;
        pid_t ret;
 
@@ -567,7 +569,7 @@ __weak_reference(_waitpid, waitpid);
 pid_t
 _waitpid(pid_t wpid, int *status, int options)
 {
-       struct pthread *curthread = _get_curthread();
+       struct pthread *curthread = tls_get_curthread();
        int     oldcancel;
        pid_t   ret;
 
@@ -583,7 +585,7 @@ __weak_reference(__write, write);
 ssize_t
 __write(int fd, const void *buf, size_t nbytes)
 {
-       struct pthread *curthread = _get_curthread();
+       struct pthread *curthread = tls_get_curthread();
        int     oldcancel;
        ssize_t ret;
 
@@ -599,7 +601,7 @@ __weak_reference(__writev, writev);
 ssize_t
 __writev(int fd, const struct iovec *iov, int iovcnt)
 {
-       struct pthread *curthread = _get_curthread();
+       struct pthread *curthread = tls_get_curthread();
        int     oldcancel;
        ssize_t ret;
 
index 8197dd1..e8a524e 100644 (file)
@@ -23,7 +23,7 @@
  * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
  *
  * $FreeBSD: src/libexec/rtld-elf/i386/reloc.c,v 1.6.2.2 2002/06/16 20:02:09 dillon Exp $
- * $DragonFly: src/libexec/rtld-elf/i386/reloc.c,v 1.5 2005/03/28 03:33:20 dillon Exp $
+ * $DragonFly: src/libexec/rtld-elf/i386/reloc.c,v 1.6 2005/03/29 19:26:20 joerg Exp $
  */
 
 /*
@@ -36,6 +36,8 @@
 #include <sys/mman.h>
 #include <sys/tls.h>
 
+#include <machine/tls.h>
+
 #include <dlfcn.h>
 #include <err.h>
 #include <errno.h>
@@ -329,7 +331,6 @@ allocate_initial_tls(Obj_Entry *objs)
     struct tls_info ti;
     int flags;
     void *tls;
-    int sel;
 
     /*
      * Fix the size of the static TLS block by using the maximum
@@ -350,10 +351,7 @@ allocate_initial_tls(Obj_Entry *objs)
                flags = 0;
        }
        tls = allocate_tls(objs, old_tcb, sizeof(struct tls_tcb), flags);
-       ti.base = tls;
-       ti.size = -1;
-       sel = sys_set_tls_area(0, &ti, sizeof(ti));
-       __asm __volatile("movl %0,%%gs" : : "rm" (sel));
+       tls_set_tcb(tls);
     }
 }
 
@@ -364,8 +362,8 @@ ___tls_get_addr(tls_index *ti)
 {
     struct tls_tcb *tcb;
 
-    __asm __volatile("movl %%gs:0, %0" : "=r" (tcb));
-    return tls_get_addr_common(&tcb->dtv_base, ti->ti_module, ti->ti_offset);
+    tcb = tls_get_tcb();
+    return tls_get_addr_common(&tcb->tcb_dtv, ti->ti_module, ti->ti_offset);
 }
 
 /* Sun ABI */
@@ -374,7 +372,7 @@ __tls_get_addr(tls_index *ti)
 {
     struct tls_tcb *tcb;
 
-    __asm __volatile("movl %%gs:0, %0" : "=r" (tcb));
-    return tls_get_addr_common(&tcb->dtv_base, ti->ti_module, ti->ti_offset);
+    tcb = tls_get_tcb();
+    return tls_get_addr_common(&tcb->tcb_dtv, ti->ti_module, ti->ti_offset);
 }
 
index 6515a66..6b129aa 100644 (file)
@@ -24,7 +24,7 @@
  * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
  *
  * $FreeBSD: src/libexec/rtld-elf/rtld.c,v 1.43.2.15 2003/02/20 20:42:46 kan Exp $
- * $DragonFly: src/libexec/rtld-elf/rtld.c,v 1.19 2005/03/28 03:33:16 dillon Exp $
+ * $DragonFly: src/libexec/rtld-elf/rtld.c,v 1.20 2005/03/29 19:26:20 joerg Exp $
  */
 
 /*
@@ -43,6 +43,8 @@
 #include <sys/resident.h>
 #include <sys/tls.h>
 
+#include <machine/tls.h>
+
 #include <dlfcn.h>
 #include <err.h>
 #include <errno.h>
@@ -55,7 +57,6 @@
 
 #include "debug.h"
 #include "rtld.h"
-#include "rtld_tls.h"
 
 #define PATH_RTLD      "/usr/libexec/ld-elf.so.1"
 #define LD_ARY_CACHE   16
@@ -2607,16 +2608,7 @@ tls_get_addr_common(void **dtvp, int index, size_t offset)
     return (void*) (dtv[index + 1] + offset);
 }
 
-/* XXX not sure what variants to use for arm. */
-
-#if defined(__ia64__) || defined(__powerpc__)
-
-#error x
-
-#endif
-
-#if defined(__i386__) || defined(__amd64__) || defined(__sparc64__) || \
-    defined(__arm__)
+#if defined(RTLD_STATIC_TLS_VARIANT_II)
 
 /*
  * Allocate the static TLS area.  Return a pointer to the TCB.  The 
@@ -2645,14 +2637,16 @@ allocate_tls(Obj_Entry *objs, struct tls_tcb *old_tcb,
     full_size = data_size + tcb_size;
     tcb = malloc(full_size);
     tcb = (void *)((char *)tcb + data_size);   /* actual tcb location */
-    bzero(tcb, tcb_size);
 
     dtv_size = (tls_max_index + 2) * sizeof(Elf_Addr);
     dtv = malloc(dtv_size);
     bzero(dtv, dtv_size);
 
-    tcb->tcb_base = tcb;
-    tcb->dtv_base = dtv;
+#ifdef RTLD_TCB_HAS_SELF_POINTER
+    tcb->tcb_self = tcb;
+#endif
+    tcb->tcb_dtv = dtv;
+    tcb->tcb_pthread = NULL;
 
     dtv[0] = tls_dtv_generation;
     dtv[1] = tls_max_index;
@@ -2671,7 +2665,7 @@ allocate_tls(Obj_Entry *objs, struct tls_tcb *old_tcb,
         * If any dynamic TLS blocks have been created tls_get_addr(),
         * move them over.
         */
-       old_dtv = old_tcb->dtv_base;
+       old_dtv = old_tcb->tcb_dtv;
        for (i = 0; i < old_dtv[1]; i++) {
            if (old_dtv[i+2] < (Elf_Addr)((char *)old_tcb - data_size) ||
                old_dtv[i+2] >= (Elf_Addr)((char *)old_tcb)
@@ -2707,7 +2701,7 @@ free_tls(struct tls_tcb *tcb, size_t tcb_size)
 
     data_size = (tls_static_space + RTLD_STATIC_TLS_ALIGN_MASK) &
                ~RTLD_STATIC_TLS_ALIGN_MASK;
-    dtv = tcb->dtv_base;
+    dtv = tcb->tcb_dtv;
     dtv_size = dtv[1];
     tls_end = (Elf_Addr)tcb;
     tls_start = (Elf_Addr)tcb - data_size;
@@ -2719,6 +2713,8 @@ free_tls(struct tls_tcb *tcb, size_t tcb_size)
     free((void *)tls_start);
 }
 
+#else
+#error "Unsupported TLS layout"
 #endif
 
 /*
@@ -2786,8 +2782,7 @@ allocate_tls_offset(Obj_Entry *obj)
 void
 free_tls_offset(Obj_Entry *obj)
 {
-#if defined(__i386__) || defined(__amd64__) || defined(__sparc64__) || \
-    defined(__arm__)
+#ifdef RTLD_STATIC_TLS_VARIANT_II
     /*
      * If we were the last thing to allocate out of the static TLS
      * block, we give our space back to the 'allocator'. This is a
diff --git a/libexec/rtld-elf/rtld_tls.h b/libexec/rtld-elf/rtld_tls.h
deleted file mode 100644 (file)
index 7c32bad..0000000
+++ /dev/null
@@ -1,71 +0,0 @@
-/*-
- * Copyright (c) 2004 Doug Rabson
- * All rights reserved.
- *
- * Redistribution and use in source and binary forms, with or without
- * modification, are permitted provided that the following conditions
- * are met:
- * 1. Redistributions of source code must retain the above copyright
- *    notice, this list of conditions and the following disclaimer.
- * 2. Redistributions in binary form must reproduce the above copyright
- *    notice, this list of conditions and the following disclaimer in the
- *    documentation and/or other materials provided with the distribution.
- *
- * THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND
- * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
- * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
- * ARE DISCLAIMED.  IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE
- * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
- * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
- * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
- * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
- * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
- * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
- * SUCH DAMAGE.
- *
- * $FreeBSD: src/libexec/rtld-elf/rtld_tls.h,v 1.1 2004/08/03 08:50:58 dfr Exp $
- * $DragonFly: src/libexec/rtld-elf/Attic/rtld_tls.h,v 1.2 2005/03/28 03:33:17 dillon Exp $
- */
-
-/*
- * Semi-public interface from thread libraries to rtld for managing
- * TLS.
- */
-
-#ifndef _RTLD_TLS_H_
-#define        _RTLD_TLS_H_
-
-/*
- * Allocate a TLS block for a new thread. The memory allocated will
- * include 'tcbsize' bytes aligned to a 'tcbalign' boundary (in bytes)
- * for the thread library's private purposes. The location of the TCB
- * block is returned by this function. For architectures using
- * 'Variant I' TLS, the thread local storage follows the TCB, and for
- * 'Variant II', the thread local storage precedes it. For
- * architectures using the 'Variant II' model (e.g. i386, amd64,
- * sparc64), the TCB must begin with two pointer fields which are used
- * by rtld for its TLS implementation. For the 'Variant I' model, the
- * TCB must begin with a single pointer field for rtld's
- * implementation.
- *
- * If the value of 'oldtls' is non-NULL, the new TLS block will be
- * initialised using the values contained in 'oldtls' and 'oldtls'
- * will be freed. This is typically used when initialising a thread
- * library to migrate from using the initial bootstrap TLS block
- * created by rtld to one which contains suitable thread library
- * private data.
- *
- * The value returned from this function is suitable for installing
- * directly into the thread pointer register.
- */
-extern struct tls_tcb *_rtld_allocate_tls(struct tls_tcb *old_tls, 
-                                           size_t tcb_size, int flags);
-
-/*
- * Free a TLS block allocated using _rtld_allocate_tls(). The tcbsize
- * and tcbalign parameters must be the same as those used to allocate
- * the block.
- */
-extern void _rtld_free_tls(struct tls_tcb *tcb, size_t tcb_size);
-
-#endif
similarity index 51%
copy from lib/libc/i386/gen/_set_tp.c
copy to sys/cpu/i386/include/tls.h
index e98e444..e29c27c 100644 (file)
@@ -1,13 +1,10 @@
-/*-
+/*
  * Copyright (c) 2005 The DragonFly Project.  All rights reserved.
- *
- * This code is derived from software contributed to The DragonFly Project
- * by David Xu.
- *
+ * 
  * Redistribution and use in source and binary forms, with or without
  * modification, are permitted provided that the following conditions
  * are met:
- *
+ * 
  * 1. Redistributions of source code must retain the above copyright
  *    notice, this list of conditions and the following disclaimer.
  * 2. Redistributions in binary form must reproduce the above copyright
  * OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
  * SUCH DAMAGE.
  * 
- * $DragonFly: src/lib/libc/i386/gen/Attic/_set_tp.c,v 1.2 2005/03/08 13:17:03 davidxu Exp $
+ * $DragonFly: src/sys/cpu/i386/include/tls.h,v 1.1 2005/03/29 19:26:20 joerg Exp $
  */
 
+#ifndef        _MACHINE_TLS_H_
+#define        _MACHINE_TLS_H_
+
+#include <sys/types.h>
 #include <sys/tls.h>
 
-#include "libc_private.h"
+struct tls_tcb {
+       struct tls_tcb *tcb_self;       /* pointer to self*/
+       void *tcb_dtv;                  /* Dynamic Thread Vector */
+       void *tcb_pthread;              /* thread library's data*/
+};
+
+struct tls_dtv {
+       uintptr_t dtv_generation;
+       uintptr_t dtv_max_index;
+       void *dtv_offset[__ARRAY_ZERO];
+};
+
+#define        RTLD_TCB_HAS_SELF_POINTER
+#define        RTLD_STATIC_TLS_ALIGN           16
+#define        RTLD_STATIC_TLS_ALIGN_MASK      (RTLD_STATIC_TLS_ALIGN - 1)
+#define RTLD_STATIC_TLS_VARIANT_II
+
+/* Get the current TCB. */
+static __inline struct tls_tcb *
+tls_get_tcb(void)
+{
+       void *self;
+
+#if 0
+       __asm __volatile ("movl %%gs:%1, %0"
+           : "=r" (self)
+           : "i" (__offsetof(struct tls_tcb, tcb_self)));
+#else
+       __asm __volatile ("movl %%gs:0, %0" : "=r" (self));
+#endif
+
+       return(self);
+}
 
-void
-_set_tp(void *tp, int size)
+/* Get the current thread. */
+static __inline void *
+tls_get_curthread(void)
 {
-       struct tls_info t;
+       void *self;
+
+#if 0
+       __asm __volatile ("movl %%gs:%1, %0"
+           : "=r" (self)
+           : "i" (__offsetof(struct tls_tcb, tcb_pthread)));
+#else
+       __asm __volatile ("movl %%gs:8, %0" : "=r" (self));
+#endif
+
+       return(self);
+}
+
+static __inline void
+tls_set_tcb(struct tls_tcb *tcb)
+{
+       struct tls_info info;
        int seg;
 
-       t.base = tp;
-       t.size = size;
-       seg = sys_set_tls_area(0, &t, sizeof(t));
+       info.base = tcb;
+       info.size = -1;
+       seg = sys_set_tls_area(0, &info, sizeof(info));
        __asm __volatile("movl %0, %%gs" : : "r" (seg));
 }
+
+/*
+ * flags for _rtld_allocate_tls() and allocate_tls()
+ */
+#define RTLD_ALLOC_TLS_FREE_OLD                0x0001
+
+struct tls_tcb *_rtld_allocate_tls(struct tls_tcb *, size_t, int);
+void            _rtld_free_tls(struct tls_tcb *, size_t);
+
+#endif /* !_MACHINE_TLS_H_ */
similarity index 51%
rename from lib/libc/i386/gen/_set_tp.c
rename to sys/i386/include/tls.h
index e98e444..5030c02 100644 (file)
@@ -1,13 +1,10 @@
-/*-
+/*
  * Copyright (c) 2005 The DragonFly Project.  All rights reserved.
- *
- * This code is derived from software contributed to The DragonFly Project
- * by David Xu.
- *
+ * 
  * Redistribution and use in source and binary forms, with or without
  * modification, are permitted provided that the following conditions
  * are met:
- *
+ * 
  * 1. Redistributions of source code must retain the above copyright
  *    notice, this list of conditions and the following disclaimer.
  * 2. Redistributions in binary form must reproduce the above copyright
  * OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
  * SUCH DAMAGE.
  * 
- * $DragonFly: src/lib/libc/i386/gen/Attic/_set_tp.c,v 1.2 2005/03/08 13:17:03 davidxu Exp $
+ * $DragonFly: src/sys/i386/include/Attic/tls.h,v 1.1 2005/03/29 19:26:20 joerg Exp $
  */
 
+#ifndef        _MACHINE_TLS_H_
+#define        _MACHINE_TLS_H_
+
+#include <sys/types.h>
 #include <sys/tls.h>
 
-#include "libc_private.h"
+struct tls_tcb {
+       struct tls_tcb *tcb_self;       /* pointer to self*/
+       void *tcb_dtv;                  /* Dynamic Thread Vector */
+       void *tcb_pthread;              /* thread library's data*/
+};
+
+struct tls_dtv {
+       uintptr_t dtv_generation;
+       uintptr_t dtv_max_index;
+       void *dtv_offset[__ARRAY_ZERO];
+};
+
+#define        RTLD_TCB_HAS_SELF_POINTER
+#define        RTLD_STATIC_TLS_ALIGN           16
+#define        RTLD_STATIC_TLS_ALIGN_MASK      (RTLD_STATIC_TLS_ALIGN - 1)
+#define RTLD_STATIC_TLS_VARIANT_II
+
+/* Get the current TCB. */
+static __inline struct tls_tcb *
+tls_get_tcb(void)
+{
+       void *self;
+
+#if 0
+       __asm __volatile ("movl %%gs:%1, %0"
+           : "=r" (self)
+           : "i" (__offsetof(struct tls_tcb, tcb_self)));
+#else
+       __asm __volatile ("movl %%gs:0, %0" : "=r" (self));
+#endif
+
+       return(self);
+}
 
-void
-_set_tp(void *tp, int size)
+/* Get the current thread. */
+static __inline void *
+tls_get_curthread(void)
 {
-       struct tls_info t;
+       void *self;
+
+#if 0
+       __asm __volatile ("movl %%gs:%1, %0"
+           : "=r" (self)
+           : "i" (__offsetof(struct tls_tcb, tcb_pthread)));
+#else
+       __asm __volatile ("movl %%gs:8, %0" : "=r" (self));
+#endif
+
+       return(self);
+}
+
+static __inline void
+tls_set_tcb(struct tls_tcb *tcb)
+{
+       struct tls_info info;
        int seg;
 
-       t.base = tp;
-       t.size = size;
-       seg = sys_set_tls_area(0, &t, sizeof(t));
+       info.base = tcb;
+       info.size = -1;
+       seg = sys_set_tls_area(0, &info, sizeof(info));
        __asm __volatile("movl %0, %%gs" : : "r" (seg));
 }
+
+/*
+ * flags for _rtld_allocate_tls() and allocate_tls()
+ */
+#define RTLD_ALLOC_TLS_FREE_OLD                0x0001
+
+struct tls_tcb *_rtld_allocate_tls(struct tls_tcb *, size_t, int);
+void            _rtld_free_tls(struct tls_tcb *, size_t);
+
+#endif /* !_MACHINE_TLS_H_ */
index 83554df..196a6f2 100644 (file)
@@ -1,9 +1,34 @@
 /*
- * SYS/TLS.H
+ * Copyright (c) 2005 The DragonFly Project.  All rights reserved.
+ * 
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ * 
+ * 1. Redistributions of source code must retain the above copyright
+ *    notice, this list of conditions and the following disclaimer.
+ * 2. Redistributions in binary form must reproduce the above copyright
+ *    notice, this list of conditions and the following disclaimer in
+ *    the documentation and/or other materials provided with the
+ *    distribution.
+ * 3. Neither the name of The DragonFly Project nor the names of its
+ *    contributors may be used to endorse or promote products derived
+ *    from this software without specific, prior written permission.
+ * 
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+ * ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+ * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS
+ * FOR A PARTICULAR PURPOSE ARE DISCLAIMED.  IN NO EVENT SHALL THE
+ * COPYRIGHT HOLDERS OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT,
+ * INCIDENTAL, SPECIAL, EXEMPLARY OR CONSEQUENTIAL DAMAGES (INCLUDING,
+ * BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
+ * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED
+ * AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,
+ * OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT
+ * OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
+ * SUCH DAMAGE.
  *
- *     Implements the architecture independant TLS info structure.
- *
- * $DragonFly: src/sys/sys/tls.h,v 1.5 2005/03/28 03:33:08 dillon Exp $
+ * $DragonFly: src/sys/sys/tls.h,v 1.6 2005/03/29 19:26:20 joerg Exp $
  */
 
 #ifndef _SYS_TLS_H_
@@ -16,20 +41,6 @@ struct tls_info {
        int size;
 };
 
-struct tls_tcb {
-       struct tls_tcb *tcb_base;       /* self pointer (data at -OFFSET) */
-       void *dtv_base;         /* RTLD tls_get_addr info base */
-       void *reserved[6];
-};
-
-#define RTLD_STATIC_TLS_ALIGN           16
-#define RTLD_STATIC_TLS_ALIGN_MASK      (RTLD_STATIC_TLS_ALIGN - 1)
-
-/*
- * flags for _rtld_allocate_tls() and allocate_tls()
- */
-#define RTLD_ALLOC_TLS_FREE_OLD                0x0001
-
 #ifndef _KERNEL
 int sys_set_tls_area(int which, struct tls_info *info, size_t infosize);
 int sys_get_tls_area(int which, struct tls_info *info, size_t infosize);