mirror of
https://sourceware.org/git/glibc.git
synced 2025-07-29 11:41:21 +03:00
2003-03-14 Roland McGrath <roland@redhat.com>
* descr.h (struct pthread): Move the union out of [!TLS_DTV_AT_TP], so we always define the padding space. [!TLS_DTV_AT_TP]: Give tcbhead_t field a name, `header', since GCC stopped supporting its own extensions fully. [TLS_MULTIPLE_THREADS_IN_TCB]: Put `multiple_threads' inside a wrapper struct also called `header', so `header.multiple_threads' is the field name to use on all machines. * allocatestack.c (allocate_stack): Use `header.' prefix. * sysdeps/pthread/createthread.c (create_thread): Likewise. * pthread_create.c (__pthread_create_2_1): Likewise. * sysdeps/i386/tls.h (INSTALL_NEW_DTV, THREAD_DTV): Likewise. (THREAD_SELF): Likewise. * sysdeps/x86_64/tls.h: Likewise. * sysdeps/unix/sysv/linux/i386/sysdep-cancel.h (SINGLE_THREAD_P): Likewise. * sysdeps/unix/sysv/linux/sh/sysdep-cancel.h (SINGLE_THREAD_P): Likewise. * sysdeps/unix/sysv/linux/s390/s390-64/sysdep-cancel.h (SINGLE_THREAD_P): Likewise.
This commit is contained in:
@ -321,14 +321,14 @@ 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. */
|
||||||
pd->multiple_threads = 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
|
||||||
|
|
||||||
#ifdef NEED_DL_SYSINFO
|
#ifdef NEED_DL_SYSINFO
|
||||||
/* Copy the sysinfo value from the parent. */
|
/* Copy the sysinfo value from the parent. */
|
||||||
pd->sysinfo = THREAD_GETMEM (THREAD_SELF, sysinfo);
|
pd->header.sysinfo = THREAD_GETMEM (THREAD_SELF, header.sysinfo);
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
/* Allocate the DTV for this thread. */
|
/* Allocate the DTV for this thread. */
|
||||||
@ -446,14 +446,14 @@ 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. */
|
||||||
pd->multiple_threads = 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
|
||||||
|
|
||||||
#ifdef NEED_DL_SYSINFO
|
#ifdef NEED_DL_SYSINFO
|
||||||
/* Copy the sysinfo value from the parent. */
|
/* Copy the sysinfo value from the parent. */
|
||||||
pd->sysinfo = THREAD_GETMEM (THREAD_SELF, sysinfo);
|
pd->header.sysinfo = THREAD_GETMEM (THREAD_SELF, header.sysinfo);
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
/* Allocate the DTV for this thread. */
|
/* Allocate the DTV for this thread. */
|
||||||
|
20
nptl/descr.h
20
nptl/descr.h
@ -57,16 +57,24 @@
|
|||||||
/* Thread descriptor data structure. */
|
/* Thread descriptor data structure. */
|
||||||
struct pthread
|
struct pthread
|
||||||
{
|
{
|
||||||
#if !TLS_DTV_AT_TP
|
|
||||||
/* This overlaps tcbhead_t (see tls.h), as used for TLS without threads. */
|
|
||||||
union
|
union
|
||||||
{
|
{
|
||||||
tcbhead_t;
|
#if !TLS_DTV_AT_TP
|
||||||
|
/* This overlaps the TCB as used for TLS without threads (see tls.h). */
|
||||||
|
tcbhead_t header;
|
||||||
|
#elif TLS_MULTIPLE_THREADS_IN_TCB
|
||||||
|
struct
|
||||||
|
{
|
||||||
|
int multiple_threads;
|
||||||
|
} header;
|
||||||
|
#endif
|
||||||
|
|
||||||
|
/* This extra padding has no special purpose, and this structure layout
|
||||||
|
is private and subject to change without affecting the official ABI.
|
||||||
|
We just have it here in case it might be convenient for some
|
||||||
|
implementation-specific instrumentation hack or suchlike. */
|
||||||
void *__padding[16];
|
void *__padding[16];
|
||||||
};
|
};
|
||||||
#elif TLS_MULTIPLE_THREADS_IN_TCB
|
|
||||||
int multiple_threads;
|
|
||||||
#endif
|
|
||||||
|
|
||||||
/* This descriptor's link on the `stack_used' or `__stack_user' list. */
|
/* This descriptor's link on the `stack_used' or `__stack_user' list. */
|
||||||
list_t list;
|
list_t list;
|
||||||
|
@ -347,10 +347,10 @@ __pthread_create_2_1 (newthread, attr, start_routine, arg)
|
|||||||
|
|
||||||
#ifdef TLS_TCB_AT_TP
|
#ifdef TLS_TCB_AT_TP
|
||||||
/* Reference to the TCB itself. */
|
/* Reference to the TCB itself. */
|
||||||
pd->self = pd;
|
pd->header.self = pd;
|
||||||
|
|
||||||
/* Self-reference for TLS. */
|
/* Self-reference for TLS. */
|
||||||
pd->tcb = pd;
|
pd->header.tcb = pd;
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
/* Store the address of the start routine and the parameter. Since
|
/* Store the address of the start routine and the parameter. Since
|
||||||
|
@ -122,7 +122,7 @@ union user_desc_init
|
|||||||
/* Install new dtv for current thread. */
|
/* Install new dtv for current thread. */
|
||||||
# define INSTALL_NEW_DTV(dtvp) \
|
# define INSTALL_NEW_DTV(dtvp) \
|
||||||
({ struct pthread *__pd; \
|
({ struct pthread *__pd; \
|
||||||
THREAD_SETMEM (__pd, dtv, (dtvp)); })
|
THREAD_SETMEM (__pd, header.dtv, (dtvp)); })
|
||||||
|
|
||||||
/* Return dtv of given thread descriptor. */
|
/* Return dtv of given thread descriptor. */
|
||||||
# define GET_DTV(descr) \
|
# define GET_DTV(descr) \
|
||||||
@ -228,7 +228,7 @@ union user_desc_init
|
|||||||
/* Return the address of the dtv for the current thread. */
|
/* Return the address of the dtv for the current thread. */
|
||||||
# define THREAD_DTV() \
|
# define THREAD_DTV() \
|
||||||
({ struct pthread *__pd; \
|
({ struct pthread *__pd; \
|
||||||
THREAD_GETMEM (__pd, dtv); })
|
THREAD_GETMEM (__pd, header.dtv); })
|
||||||
|
|
||||||
|
|
||||||
/* Return the thread descriptor for the current thread.
|
/* Return the thread descriptor for the current thread.
|
||||||
@ -240,7 +240,7 @@ union user_desc_init
|
|||||||
# define THREAD_SELF \
|
# define THREAD_SELF \
|
||||||
({ struct pthread *__self; \
|
({ struct pthread *__self; \
|
||||||
asm ("movl %%gs:%c1,%0" : "=r" (__self) \
|
asm ("movl %%gs:%c1,%0" : "=r" (__self) \
|
||||||
: "i" (offsetof (struct pthread, self))); \
|
: "i" (offsetof (struct pthread, header.self))); \
|
||||||
__self;})
|
__self;})
|
||||||
|
|
||||||
|
|
||||||
|
@ -55,7 +55,7 @@ create_thread (struct pthread *pd, STACK_VARIABLES_PARMS)
|
|||||||
#endif
|
#endif
|
||||||
|
|
||||||
#ifdef TLS_TCB_AT_TP
|
#ifdef TLS_TCB_AT_TP
|
||||||
assert (pd->tcb != NULL);
|
assert (pd->header.tcb != NULL);
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
if (__builtin_expect (THREAD_GETMEM (THREAD_SELF, report_events), 0))
|
if (__builtin_expect (THREAD_GETMEM (THREAD_SELF, report_events), 0))
|
||||||
@ -85,7 +85,7 @@ create_thread (struct pthread *pd, STACK_VARIABLES_PARMS)
|
|||||||
|
|
||||||
#ifdef TLS_MULTIPLE_THREADS_IN_TCB
|
#ifdef TLS_MULTIPLE_THREADS_IN_TCB
|
||||||
/* We now have for sure more than one thread. */
|
/* We now have for sure more than one thread. */
|
||||||
pd->multiple_threads = 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
|
||||||
@ -114,7 +114,7 @@ create_thread (struct pthread *pd, STACK_VARIABLES_PARMS)
|
|||||||
}
|
}
|
||||||
|
|
||||||
#ifdef NEED_DL_SYSINFO
|
#ifdef NEED_DL_SYSINFO
|
||||||
assert (THREAD_GETMEM (THREAD_SELF, sysinfo) == pd->sysinfo);
|
assert (THREAD_GETMEM (THREAD_SELF, header.sysinfo) == pd->header.sysinfo);
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
/* We rely heavily on various flags the CLONE function understands:
|
/* We rely heavily on various flags the CLONE function understands:
|
||||||
@ -157,7 +157,7 @@ create_thread (struct pthread *pd, STACK_VARIABLES_PARMS)
|
|||||||
|
|
||||||
#ifdef TLS_MULTIPLE_THREADS_IN_TCB
|
#ifdef TLS_MULTIPLE_THREADS_IN_TCB
|
||||||
/* We now have for sure more than one thread. */
|
/* We now have for sure more than one thread. */
|
||||||
THREAD_SETMEM (THREAD_SELF, multiple_threads, 1);
|
THREAD_SETMEM (THREAD_SELF, header.multiple_threads, 1);
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
return 0;
|
return 0;
|
||||||
|
@ -78,7 +78,8 @@
|
|||||||
|
|
||||||
# ifndef __ASSEMBLER__
|
# ifndef __ASSEMBLER__
|
||||||
# define SINGLE_THREAD_P \
|
# define SINGLE_THREAD_P \
|
||||||
__builtin_expect (THREAD_GETMEM (THREAD_SELF, multiple_threads) == 0, 1)
|
__builtin_expect (THREAD_GETMEM (THREAD_SELF, \
|
||||||
|
header.multiple_threads) == 0, 1)
|
||||||
# else
|
# else
|
||||||
# define SINGLE_THREAD_P cmpl $0, %gs:MULTIPLE_THREADS_OFFSET
|
# define SINGLE_THREAD_P cmpl $0, %gs:MULTIPLE_THREADS_OFFSET
|
||||||
# endif
|
# endif
|
||||||
|
@ -81,7 +81,7 @@ L(pseudo_end):
|
|||||||
# ifndef __ASSEMBLER__
|
# ifndef __ASSEMBLER__
|
||||||
# define SINGLE_THREAD_P \
|
# define SINGLE_THREAD_P \
|
||||||
__builtin_expect (THREAD_GETMEM (THREAD_SELF, \
|
__builtin_expect (THREAD_GETMEM (THREAD_SELF, \
|
||||||
header.data.multiple_threads) == 0, 1)
|
header.multiple_threads) == 0, 1)
|
||||||
# else
|
# else
|
||||||
# define SINGLE_THREAD_P \
|
# define SINGLE_THREAD_P \
|
||||||
ear %r1,%a0; \
|
ear %r1,%a0; \
|
||||||
|
@ -117,7 +117,8 @@
|
|||||||
|
|
||||||
# ifndef __ASSEMBLER__
|
# ifndef __ASSEMBLER__
|
||||||
# define SINGLE_THREAD_P \
|
# define SINGLE_THREAD_P \
|
||||||
__builtin_expect (THREAD_GETMEM (THREAD_SELF, multiple_threads) == 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; \
|
||||||
|
@ -92,7 +92,7 @@ typedef struct
|
|||||||
/* Install new dtv for current thread. */
|
/* Install new dtv for current thread. */
|
||||||
# define INSTALL_NEW_DTV(dtvp) \
|
# define INSTALL_NEW_DTV(dtvp) \
|
||||||
({ struct pthread *__pd; \
|
({ struct pthread *__pd; \
|
||||||
THREAD_SETMEM (__pd, dtv, (dtvp)); })
|
THREAD_SETMEM (__pd, header.dtv, (dtvp)); })
|
||||||
|
|
||||||
/* Return dtv of given thread descriptor. */
|
/* Return dtv of given thread descriptor. */
|
||||||
# define GET_DTV(descr) \
|
# define GET_DTV(descr) \
|
||||||
@ -136,7 +136,7 @@ typedef struct
|
|||||||
/* Return the address of the dtv for the current thread. */
|
/* Return the address of the dtv for the current thread. */
|
||||||
# define THREAD_DTV() \
|
# define THREAD_DTV() \
|
||||||
({ struct pthread *__pd; \
|
({ struct pthread *__pd; \
|
||||||
THREAD_GETMEM (__pd, dtv); })
|
THREAD_GETMEM (__pd, header.dtv); })
|
||||||
|
|
||||||
|
|
||||||
/* Return the thread descriptor for the current thread.
|
/* Return the thread descriptor for the current thread.
|
||||||
@ -148,7 +148,7 @@ typedef struct
|
|||||||
# define THREAD_SELF \
|
# define THREAD_SELF \
|
||||||
({ struct pthread *__self; \
|
({ struct pthread *__self; \
|
||||||
asm ("movq %%fs:%c1,%q0" : "=r" (__self) \
|
asm ("movq %%fs:%c1,%q0" : "=r" (__self) \
|
||||||
: "i" (offsetof (struct pthread, self))); \
|
: "i" (offsetof (struct pthread, header.self))); \
|
||||||
__self;})
|
__self;})
|
||||||
|
|
||||||
|
|
||||||
|
Reference in New Issue
Block a user