* pthread.c (__pthread_initialize_manager): Subtract
	TLS_PRE_TCB_SIZE bytes from tcbp to get to descr.
	* manager.c (pthread_handle_create): Subtract or add TLS_PRE_TCB_SIZE
	instead of sizeof (pthread_descr).
	(pthread_free): Add TLS_PRE_TCB_SIZE instead of sizeof (pthread_descr).
	* sysdeps/powerpc/tls.h (TLS_INIT_TCB_SIZE, TLS_TCB_SIZE): Define to 0.
This commit is contained in:
Ulrich Drepper 2003-04-25 22:28:13 +00:00
parent f24dca4829
commit 468777e1d0
17 changed files with 62 additions and 85 deletions

View File

@ -1,16 +1,11 @@
2003-04-22 Jakub Jelinek <jakub@redhat.com> 2003-04-22 Jakub Jelinek <jakub@redhat.com>
* descr.h (p_multiple_threads): Define as function-like macro. * pthread.c (__pthread_initialize_manager): Subtract
(struct _pthread_descr_struct) [TLS_MULTIPLE_THREADS_IN_TCB]: TLS_PRE_TCB_SIZE bytes from tcbp to get to descr.
Move multiple_threads to last int in the structure. * manager.c (pthread_handle_create): Subtract or add TLS_PRE_TCB_SIZE
* pthread.c (__pthread_initialize_manager): Use p_multiple_threads instead of sizeof (pthread_descr).
macro. Subtract TLS_PRE_TCB_SIZE bytes from tcbp to get to descr. (pthread_free): Add TLS_PRE_TCB_SIZE instead of sizeof (pthread_descr).
* manager.c (pthread_handle_create): Use p_multiple_threads macro. * sysdeps/powerpc/tls.h (TLS_INIT_TCB_SIZE, TLS_TCB_SIZE): Define to 0.
Subtract or add TLS_PRE_TCB_SIZE instead of sizeof (pthread_descr).
(pthread_free): Add TLS_PRE_TCB_SIZE instead of
sizeof (pthread_descr).
* sysdeps/powerpc/tls.h: Don't include tcb-offsets.h.
(TLS_INIT_TCB_SIZE, TLS_TCB_SIZE): Define to 0.
(TLS_INIT_TCB_ALIGN, TLS_TCB_ALIGN): Define to alignment of (TLS_INIT_TCB_ALIGN, TLS_TCB_ALIGN): Define to alignment of
pthread_descr. pthread_descr.
(TLS_PRE_TCB_SIZE): Increase to cover tcbhead_t preceeded by pad (TLS_PRE_TCB_SIZE): Increase to cover tcbhead_t preceeded by pad
@ -20,18 +15,6 @@
(TLS_INIT_TP, THREAD_SELF, INIT_THREAD_SELF): Don't add TLS_TCB_SIZE (TLS_INIT_TP, THREAD_SELF, INIT_THREAD_SELF): Don't add TLS_TCB_SIZE
unneccessarily. unneccessarily.
(NO_TLS_OFFSET): Define. (NO_TLS_OFFSET): Define.
* sysdeps/powerpc/powerpc32/tcb-offsets.sym: New file.
* sysdeps/powerpc/tcb-offsets.sym: Removed.
* sysdeps/unix/sysv/linux/powerpc/powerpc32/sysdep-cancel.h: Include
tcb-offsets.h if __ASSEMBLER__.
(SINGLE_THREAD_P): Use p_multiple_threads macro.
* sysdeps/ia64/tcb-offsets.sym (MULTIPLE_THREADS): Define to
-sizeof(int).
* sysdeps/unix/sysv/linux/ia64/sysdep-cancel.h (SINGLE_THREAD_P):
Use p_multiple_threads macro.
* sysdeps/unix/sysv/linux/sh/sysdep-cancel.h (SINGLE_THREAD_P):
Likewise.
* sysdeps/sh/tcb-offsets.sym (MULTIPLE_THREADS): Likewise.
2003-04-22 Roland McGrath <roland@redhat.com> 2003-04-22 Roland McGrath <roland@redhat.com>

View File

@ -643,7 +643,7 @@ static int pthread_handle_create(pthread_t *thread, const pthread_attr_t *attr,
new_thread->p_header.data.self = new_thread; new_thread->p_header.data.self = new_thread;
#endif #endif
#if TLS_MULTIPLE_THREADS_IN_TCB || !defined USE_TLS || !TLS_DTV_AT_TP #if TLS_MULTIPLE_THREADS_IN_TCB || !defined USE_TLS || !TLS_DTV_AT_TP
p_multiple_threads (new_thread) = 1; new_thread->p_multiple_threads = 1;
#endif #endif
new_thread->p_tid = new_thread_id; new_thread->p_tid = new_thread_id;
new_thread->p_lock = &(__pthread_handles[sseg].h_lock); new_thread->p_lock = &(__pthread_handles[sseg].h_lock);

View File

@ -1,9 +0,0 @@
#include <sysdep.h>
#include <tls.h>
--
#ifdef USE_TLS
MULTIPLE_THREADS_OFFSET ((void *) &p_multiple_threads ((pthread_descr) ((void *) 0 - TLS_TCB_OFFSET - TLS_PRE_TCB_SIZE)) - (void *) 0)
#else
MULTIPLE_THREADS_OFFSET offsetof (tcbhead_t, multiple_threads)
#endif

View File

@ -0,0 +1,24 @@
#include <sysdep.h>
#include <tls.h>
--
-- This could go into powerpc32/ instead and conditionalize #include of it.
#ifndef __powerpc64__
# ifdef USE_TLS
-- Abuse tls.h macros to derive offsets relative to the thread register.
# undef __thread_register
# define __thread_register ((void *) 0)
# define thread_offsetof(mem) ((void *) &THREAD_SELF->p_##mem - (void *) 0)
# else
# define thread_offsetof(mem) offsetof (tcbhead_t, mem)
# endif
MULTIPLE_THREADS_OFFSET thread_offsetof (multiple_threads)
#endif

View File

@ -101,7 +101,7 @@ __syscall_error_##args: \
# ifndef __ASSEMBLER__ # ifndef __ASSEMBLER__
# define SINGLE_THREAD_P \ # define SINGLE_THREAD_P \
__builtin_expect (p_multiple_threads (THREAD_SELF) == 0, 1) __builtin_expect (THREAD_GETMEM (THREAD_SELF, p_multiple_threads) == 0, 1)
# else # else
# define SINGLE_THREAD_P \ # define SINGLE_THREAD_P \
adds r14 = MULTIPLE_THREADS_OFFSET, r13 ;; ld4 r14 = [r14] ;; cmp4.ne p6, p7 = 0, r14 adds r14 = MULTIPLE_THREADS_OFFSET, r13 ;; ld4 r14 = [r14] ;; cmp4.ne p6, p7 = 0, r14

View File

@ -1,12 +1,9 @@
2003-04-22 Jakub Jelinek <jakub@redhat.com> 2003-04-22 Jakub Jelinek <jakub@redhat.com>
* descr.h (p_multiple_threads): Define.
(struct pthread) [TLS_MULTIPLE_THREADS_IN_TCB]: Move
multiple_threads to last int in the structure.
* allocatestack.c (TLS_TPADJ): Add TLS_PRE_TCB_SIZE instead of * allocatestack.c (TLS_TPADJ): Add TLS_PRE_TCB_SIZE instead of
sizeof (struct pthread). sizeof (struct pthread).
(allocate_stack): Subtract TLS_PRE_TCB_SIZE bytes instead of (allocate_stack): Subtract TLS_PRE_TCB_SIZE bytes instead of
1 struct pthread. Use p_multiple_threads macro. 1 struct pthread.
* sysdeps/pthread/createthread.c (create_thread): Use * sysdeps/pthread/createthread.c (create_thread): Use
p_multiple_threads macro if TLS_DTV_AT_TP. p_multiple_threads macro if TLS_DTV_AT_TP.
* sysdeps/powerpc/tls.h (TLS_INIT_TCB_SIZE, TLS_TCB_SIZE): Define * sysdeps/powerpc/tls.h (TLS_INIT_TCB_SIZE, TLS_TCB_SIZE): Define
@ -20,21 +17,8 @@
(TLS_INIT_TP, THREAD_SELF, INIT_THREAD_SELF): Don't add TLS_TCB_SIZE (TLS_INIT_TP, THREAD_SELF, INIT_THREAD_SELF): Don't add TLS_TCB_SIZE
unneccessarily. unneccessarily.
(NO_TLS_OFFSET): Define. (NO_TLS_OFFSET): Define.
* sysdeps/powerpc/tcb-offsets.sym (MULTIPLE_THREADS): Use
p_multiple_threads macro.
* sysdeps/unix/sysv/linux/powerpc/powerpc32/sysdep-cancel.h
(SINGLE_THREAD_P): Likewise.
* sysdeps/unix/sysv/linux/powerpc/powerpc64/sysdep-cancel.h
(SINGLE_THREAD_P): Likewise.
* sysdeps/unix/sysv/linux/powerpc/createthread.c (TLS_VALUE): Don't * sysdeps/unix/sysv/linux/powerpc/createthread.c (TLS_VALUE): Don't
add TLS_TCB_SIZE unnecessarily. add TLS_TCB_SIZE unnecessarily.
* sysdeps/ia64/tcb-offsets.sym (MULTIPLE_THREADS): Define to
-sizeof(int).
* sysdeps/unix/sysv/linux/ia64/sysdep-cancel.h (SINGLE_THREAD_P):
Use p_multiple_threads macro.
* sysdeps/sh/tcb-offsets.sym (MULTIPLE_THREADS): Likewise.
* sysdeps/unix/sysv/linux/sh/sysdep-cancel.h (SINGLE_THREAD_P):
Likewise.
2003-04-22 Roland McGrath <roland@redhat.com> 2003-04-22 Roland McGrath <roland@redhat.com>

View File

@ -322,7 +322,7 @@ allocate_stack (const struct pthread_attr *attr, struct pthread **pdp,
#ifdef TLS_MULTIPLE_THREADS_IN_TCB #ifdef TLS_MULTIPLE_THREADS_IN_TCB
/* This is at least the second thread. */ /* This is at least the second thread. */
p_multiple_threads (pd) = 1; pd->header.multiple_threads = 1;
#else #else
__pthread_multiple_threads = *__libc_multiple_threads_ptr = 1; __pthread_multiple_threads = *__libc_multiple_threads_ptr = 1;
#endif #endif
@ -449,7 +449,7 @@ allocate_stack (const struct pthread_attr *attr, struct pthread **pdp,
#ifdef TLS_MULTIPLE_THREADS_IN_TCB #ifdef TLS_MULTIPLE_THREADS_IN_TCB
/* This is at least the second thread. */ /* This is at least the second thread. */
p_multiple_threads (pd) = 1; pd->header.multiple_threads = 1;
#else #else
__pthread_multiple_threads = *__libc_multiple_threads_ptr = 1; __pthread_multiple_threads = *__libc_multiple_threads_ptr = 1;
#endif #endif

View File

@ -99,7 +99,11 @@ struct pthread
#if !TLS_DTV_AT_TP #if !TLS_DTV_AT_TP
/* This overlaps the TCB as used for TLS without threads (see tls.h). */ /* This overlaps the TCB as used for TLS without threads (see tls.h). */
tcbhead_t header; tcbhead_t header;
# define p_multiple_threads(descr) (descr)->header.multiple_threads #elif TLS_MULTIPLE_THREADS_IN_TCB
struct
{
int multiple_threads;
} header;
#endif #endif
/* This extra padding has no special purpose, and this structure layout /* This extra padding has no special purpose, and this structure layout
@ -228,21 +232,6 @@ struct pthread
size_t stackblock_size; size_t stackblock_size;
/* Size of the included guard area. */ /* Size of the included guard area. */
size_t guardsize; size_t guardsize;
#if TLS_DTV_AT_TP && TLS_MULTIPLE_THREADS_IN_TCB
/* Must come last. */
int __multiple_threads;
# define p_multiple_threads(descr) \
((union \
{ \
struct pthread s; \
struct \
{ \
char dummy[sizeof (struct pthread) - sizeof (int)]; \
int multiple_threads; \
} m; \
} *)(descr)->m.multiple_threads)
#endif
} __attribute ((aligned (TCB_ALIGNMENT))); } __attribute ((aligned (TCB_ALIGNMENT)));

View File

@ -1,4 +1,4 @@
#include <sysdep.h> #include <sysdep.h>
#include <tls.h> #include <tls.h>
MULTIPLE_THREADS_OFFSET -sizeof(int) MULTIPLE_THREADS_OFFSET offsetof (struct pthread, header.multiple_threads) - sizeof (struct pthread)

View File

@ -1,4 +1,13 @@
#include <sysdep.h> #include <sysdep.h>
#include <tls.h> #include <tls.h>
MULTIPLE_THREADS_OFFSET ((void *) &p_multiple_threads ((struct pthread) ((void *) 0 - TLS_TCB_OFFSET - TLS_PRE_TCB_SIZE)) - (void *) 0) --
-- Abuse tls.h macros to derive offsets relative to the thread register.
# undef __thread_register
# define __thread_register ((void *) 0)
# define thread_offsetof(mem) ((void *) &THREAD_SELF->mem - (void *) 0)
#if TLS_MULTIPLE_THREADS_IN_TCB
MULTIPLE_THREADS_OFFSET thread_offsetof (header.multiple_threads)
#endif

View File

@ -81,7 +81,9 @@ typedef struct
# define TLS_TCB_ALIGN __alignof__ (struct pthread) # define TLS_TCB_ALIGN __alignof__ (struct pthread)
/* This is the size we need before TCB. */ /* This is the size we need before TCB. */
# define TLS_PRE_TCB_SIZE (sizeof (struct pthread) + 32) # define TLS_PRE_TCB_SIZE \
(sizeof (struct pthread) \
+ ((sizeof (tcbhead_t) + TLS_TCB_ALIGN - 1) & ~(TLS_TCB_ALIGN - 1)))
# ifndef __powerpc64__ # ifndef __powerpc64__
/* Register r2 (tp) is reserved by the ABI as "thread pointer". */ /* Register r2 (tp) is reserved by the ABI as "thread pointer". */

View File

@ -87,11 +87,7 @@ create_thread (struct pthread *pd, STACK_VARIABLES_PARMS)
thread might not yet have the flag set. No need to set thread might not yet have the flag set. No need to set
the global variable again if this is what we use. */ the global variable again if this is what we use. */
#ifdef TLS_MULTIPLE_THREADS_IN_TCB #ifdef TLS_MULTIPLE_THREADS_IN_TCB
# if TLS_DTV_AT_TP
p_multiple_threads (THREAD_SELF) = 1;
# else
THREAD_SETMEM (THREAD_SELF, header.multiple_threads, 1); THREAD_SETMEM (THREAD_SELF, header.multiple_threads, 1);
# endif
#endif #endif
/* Now fill in the information about the new thread in /* Now fill in the information about the new thread in
@ -163,11 +159,7 @@ create_thread (struct pthread *pd, STACK_VARIABLES_PARMS)
not yet have the flag set. No need to set the global variable not yet have the flag set. No need to set the global variable
again if this is what we use. */ again if this is what we use. */
#ifdef TLS_MULTIPLE_THREADS_IN_TCB #ifdef TLS_MULTIPLE_THREADS_IN_TCB
# if TLS_DTV_AT_TP
p_multiple_threads (THREAD_SELF) = 1;
# else
THREAD_SETMEM (THREAD_SELF, header.multiple_threads, 1); THREAD_SETMEM (THREAD_SELF, header.multiple_threads, 1);
# endif
#endif #endif
return 0; return 0;

View File

@ -1,5 +1,5 @@
#include <sysdep.h> #include <sysdep.h>
#include <tls.h> #include <tls.h>
MULTIPLE_THREADS_OFFSET ((char *) &p_multiple_threads ((struct pthread *)0) - (char *) 0) MULTIPLE_THREADS_OFFSET offsetof (struct pthread, header.multiple_threads)
TLS_PRE_TCB_SIZE sizeof (struct pthread) TLS_PRE_TCB_SIZE sizeof (struct pthread)

View File

@ -101,7 +101,7 @@ __syscall_error_##args: \
# ifndef __ASSEMBLER__ # ifndef __ASSEMBLER__
# define SINGLE_THREAD_P \ # define SINGLE_THREAD_P \
__builtin_expect (p_multiple_threads (THREAD_SELF) == 0, 1) __builtin_expect (THREAD_GETMEM (THREAD_SELF, header.multiple_threads) == 0, 1)
# else # else
# define SINGLE_THREAD_P \ # define SINGLE_THREAD_P \
adds r14 = MULTIPLE_THREADS_OFFSET, r13 ;; ld4 r14 = [r14] ;; cmp4.ne p6, p7 = 0, r14 adds r14 = MULTIPLE_THREADS_OFFSET, r13 ;; ld4 r14 = [r14] ;; cmp4.ne p6, p7 = 0, r14

View File

@ -86,7 +86,8 @@
# ifndef __ASSEMBLER__ # ifndef __ASSEMBLER__
# define SINGLE_THREAD_P \ # define SINGLE_THREAD_P \
__builtin_expect (p_multiple_threads (THREAD_SELF) == 0, 1) __builtin_expect (THREAD_GETMEM (THREAD_SELF, \
header.multiple_threads) == 0, 1)
# else # else
# define SINGLE_THREAD_P \ # define SINGLE_THREAD_P \
lwz 10,MULTIPLE_THREADS_OFFSET(2); \ lwz 10,MULTIPLE_THREADS_OFFSET(2); \

View File

@ -86,7 +86,8 @@
# ifndef __ASSEMBLER__ # ifndef __ASSEMBLER__
# define SINGLE_THREAD_P \ # define SINGLE_THREAD_P \
__builtin_expect (p_multiple_threads (THREAD_SELF) == 0, 1) __builtin_expect (THREAD_GETMEM (THREAD_SELF, \
header.multiple_threads) == 0, 1)
# else # else
# define SINGLE_THREAD_P \ # define SINGLE_THREAD_P \
lwz 10,MULTIPLE_THREADS_OFFSET(13); \ lwz 10,MULTIPLE_THREADS_OFFSET(13); \

View File

@ -117,7 +117,8 @@
# ifndef __ASSEMBLER__ # ifndef __ASSEMBLER__
# define SINGLE_THREAD_P \ # define SINGLE_THREAD_P \
__builtin_expect (p_multiple_threads (THREAD_SELF) == 0, 1) __builtin_expect (THREAD_GETMEM (THREAD_SELF, \
header.multiple_threads) == 0, 1)
# else # else
# define SINGLE_THREAD_P \ # define SINGLE_THREAD_P \
stc gbr,r0; \ stc gbr,r0; \