Message ID | 1508446807-21704-3-git-send-email-adhemerval.zanella@linaro.org |
---|---|
State | New |
Headers | show |
Series | [1/3] nptl: Add tests for internal pthread_mutex_t offsets | expand |
Ping. On 19/10/2017 19:00, Adhemerval Zanella wrote: > This patch adds two new internal defines to set the internal > pthread_mutex_t layout required by the supported ABIS: > > 1. __PTHREAD_MUTEX_NUSERS_AFTER_KIND which control whether to define > __nusers fields before or after __kind. The preferred value for > is 0 for new ports and it sets __nusers before __kind. > > 2. __PTHREAD_MUTEX_USE_UNION which control whether internal __spins and > __list members will be place inside an union for linuxthreads > compatibility. The preferred value is 0 for ports and it sets > to not use an union to define both fields. > > It fixes the wrong offsets value for __kind value on x86_64-linux-gnu-x32. > Checked with a make check run-built-tests=no on all afected ABIs. > > [BZ #22298] > * nptl/allocatestack.c (allocate_stack): Check if > __PTHREAD_MUTEX_HAVE_PREV is non-zero, instead if > __PTHREAD_MUTEX_HAVE_PREV is defined. > * nptl/descr.h (pthread): Likewise. > * nptl/nptl-init.c (__pthread_initialize_minimal_internal): > Likewise. > * nptl/pthread_create.c (START_THREAD_DEFN): Likewise. > * sysdeps/nptl/fork.c (__libc_fork): Likewise. > * sysdeps/nptl/pthread.h (PTHREAD_MUTEX_INITIALIZER): Likewise. > * sysdeps/nptl/bits/thread-shared-types.h > (__PTHREAD_MUTEX_NUSERS_AFTER_KIND, __PTHREAD_MUTEX_USE_UNION): New > defines. > (__pthread_internal_list): Check __PTHREAD_MUTEX_USE_UNION instead > of __WORDSIZE for internal layout. > (__pthread_mutex_s): Check __PTHREAD_MUTEX_NUSERS_AFTER_KIND instead > of __WORDSIZE for internal __nusers layout and __PTHREAD_MUTEX_USE_UNION > instead of __WORDSIZE whether to use an union for __spins and __list > fields. > (__PTHREAD_MUTEX_HAVE_PREV): Define also for __PTHREAD_MUTEX_USE_UNION > case. > * sysdeps/aarch64/nptl/bits/pthreadtypes-arch.h > (__PTHREAD_MUTEX_NUSERS_AFTER_KIND, __PTHREAD_MUTEX_USE_UNION): New > defines. > * sysdeps/alpha/nptl/bits/pthreadtypes-arch.h > (__PTHREAD_MUTEX_NUSERS_AFTER_KIND, __PTHREAD_MUTEX_USE_UNION): New > defines. > * sysdeps/arm/nptl/bits/pthreadtypes-arch.h > (__PTHREAD_MUTEX_NUSERS_AFTER_KIND, __PTHREAD_MUTEX_USE_UNION): New > defines. > * sysdeps/hppa/nptl/bits/pthreadtypes-arch.h > (__PTHREAD_MUTEX_NUSERS_AFTER_KIND, __PTHREAD_MUTEX_USE_UNION): New > defines. > * sysdeps/ia64/nptl/bits/pthreadtypes-arch.h > (__PTHREAD_MUTEX_NUSERS_AFTER_KIND, __PTHREAD_MUTEX_USE_UNION): New > defines. > * sysdeps/m68k/nptl/bits/pthreadtypes-arch.h > (__PTHREAD_MUTEX_NUSERS_AFTER_KIND, __PTHREAD_MUTEX_USE_UNION): New > defines. > * sysdeps/microblaze/nptl/bits/pthreadtypes-arch.h > (__PTHREAD_MUTEX_NUSERS_AFTER_KIND, __PTHREAD_MUTEX_USE_UNION): New > defines. > * sysdeps/mips/nptl/bits/pthreadtypes-arch.h > (__PTHREAD_MUTEX_NUSERS_AFTER_KIND, __PTHREAD_MUTEX_USE_UNION): New > defines. > * sysdeps/nios2/nptl/bits/pthreadtypes-arch.h > (__PTHREAD_MUTEX_NUSERS_AFTER_KIND, __PTHREAD_MUTEX_USE_UNION): New > defines. > * sysdeps/powerpc/nptl/bits/pthreadtypes-arch.h > (__PTHREAD_MUTEX_NUSERS_AFTER_KIND, __PTHREAD_MUTEX_USE_UNION): New > defines. > * sysdeps/s390/nptl/bits/pthreadtypes-arch.h > (__PTHREAD_MUTEX_NUSERS_AFTER_KIND, __PTHREAD_MUTEX_USE_UNION): New > defines. > * sysdeps/sh/nptl/bits/pthreadtypes-arch.h > (__PTHREAD_MUTEX_NUSERS_AFTER_KIND, __PTHREAD_MUTEX_USE_UNION): New > defines. > * sysdeps/sparc/nptl/bits/pthreadtypes-arch.h > (__PTHREAD_MUTEX_NUSERS_AFTER_KIND, __PTHREAD_MUTEX_USE_UNION): New > defines. > * sysdeps/tile/nptl/bits/pthreadtypes-arch.h > (__PTHREAD_MUTEX_NUSERS_AFTER_KIND, __PTHREAD_MUTEX_USE_UNION): New > defines. > * sysdeps/x86/nptl/bits/pthreadtypes-arch.h > (__PTHREAD_MUTEX_NUSERS_AFTER_KIND, __PTHREAD_MUTEX_USE_UNION): New > defines. > --- > ChangeLog | 67 ++++++++++++++++++++++++ > nptl/allocatestack.c | 2 +- > nptl/descr.h | 2 +- > nptl/nptl-init.c | 2 +- > nptl/pthread_create.c | 4 +- > sysdeps/aarch64/nptl/bits/pthreadtypes-arch.h | 2 + > sysdeps/alpha/nptl/bits/pthreadtypes-arch.h | 2 + > sysdeps/arm/nptl/bits/pthreadtypes-arch.h | 2 + > sysdeps/hppa/nptl/bits/pthreadtypes-arch.h | 2 + > sysdeps/ia64/nptl/bits/pthreadtypes-arch.h | 2 + > sysdeps/m68k/nptl/bits/pthreadtypes-arch.h | 2 + > sysdeps/microblaze/nptl/bits/pthreadtypes-arch.h | 2 + > sysdeps/mips/nptl/bits/pthreadtypes-arch.h | 2 + > sysdeps/nios2/nptl/bits/pthreadtypes-arch.h | 2 + > sysdeps/nptl/bits/thread-shared-types.h | 30 +++++++++-- > sysdeps/nptl/fork.c | 2 +- > sysdeps/nptl/pthread.h | 2 +- > sysdeps/powerpc/nptl/bits/pthreadtypes-arch.h | 2 + > sysdeps/s390/nptl/bits/pthreadtypes-arch.h | 2 + > sysdeps/sh/nptl/bits/pthreadtypes-arch.h | 2 + > sysdeps/sparc/nptl/bits/pthreadtypes-arch.h | 2 + > sysdeps/tile/nptl/bits/pthreadtypes-arch.h | 2 + > sysdeps/x86/nptl/bits/pthreadtypes-arch.h | 7 +++ > 23 files changed, 135 insertions(+), 11 deletions(-) > > diff --git a/nptl/allocatestack.c b/nptl/allocatestack.c > index ad9add8..1cc7893 100644 > --- a/nptl/allocatestack.c > +++ b/nptl/allocatestack.c > @@ -753,7 +753,7 @@ allocate_stack (const struct pthread_attr *attr, struct pthread **pdp, > - offsetof (pthread_mutex_t, > __data.__list.__next)); > pd->robust_head.list_op_pending = NULL; > -#ifdef __PTHREAD_MUTEX_HAVE_PREV > +#if __PTHREAD_MUTEX_HAVE_PREV > pd->robust_prev = &pd->robust_head; > #endif > pd->robust_head.list = &pd->robust_head; > diff --git a/nptl/descr.h b/nptl/descr.h > index c5ad0c8..c83b17b 100644 > --- a/nptl/descr.h > +++ b/nptl/descr.h > @@ -169,7 +169,7 @@ struct pthread > pid_t pid_ununsed; > > /* List of robust mutexes the thread is holding. */ > -#ifdef __PTHREAD_MUTEX_HAVE_PREV > +#if __PTHREAD_MUTEX_HAVE_PREV > void *robust_prev; > struct robust_list_head robust_head; > > diff --git a/nptl/nptl-init.c b/nptl/nptl-init.c > index 2921607..869e926 100644 > --- a/nptl/nptl-init.c > +++ b/nptl/nptl-init.c > @@ -297,7 +297,7 @@ __pthread_initialize_minimal_internal (void) > > /* Initialize the robust mutex data. */ > { > -#ifdef __PTHREAD_MUTEX_HAVE_PREV > +#if __PTHREAD_MUTEX_HAVE_PREV > pd->robust_prev = &pd->robust_head; > #endif > pd->robust_head.list = &pd->robust_head; > diff --git a/nptl/pthread_create.c b/nptl/pthread_create.c > index 992331e..51ae60d 100644 > --- a/nptl/pthread_create.c > +++ b/nptl/pthread_create.c > @@ -518,7 +518,7 @@ START_THREAD_DEFN > > #ifndef __ASSUME_SET_ROBUST_LIST > /* If this thread has any robust mutexes locked, handle them now. */ > -# ifdef __PTHREAD_MUTEX_HAVE_PREV > +# if __PTHREAD_MUTEX_HAVE_PREV > void *robust = pd->robust_head.list; > # else > __pthread_slist_t *robust = pd->robust_list.__next; > @@ -536,7 +536,7 @@ START_THREAD_DEFN > __list.__next)); > robust = *((void **) robust); > > -# ifdef __PTHREAD_MUTEX_HAVE_PREV > +# if __PTHREAD_MUTEX_HAVE_PREV > this->__list.__prev = NULL; > # endif > this->__list.__next = NULL; > diff --git a/sysdeps/aarch64/nptl/bits/pthreadtypes-arch.h b/sysdeps/aarch64/nptl/bits/pthreadtypes-arch.h > index d13a75d..9ab23d0 100644 > --- a/sysdeps/aarch64/nptl/bits/pthreadtypes-arch.h > +++ b/sysdeps/aarch64/nptl/bits/pthreadtypes-arch.h > @@ -45,6 +45,8 @@ > #define __PTHREAD_COMPAT_PADDING_MID > #define __PTHREAD_COMPAT_PADDING_END > #define __PTHREAD_MUTEX_LOCK_ELISION 0 > +#define __PTHREAD_MUTEX_NUSERS_AFTER_KIND 0 > +#define __PTHREAD_MUTEX_USE_UNION 0 > > #define __LOCK_ALIGNMENT > #define __ONCE_ALIGNMENT > diff --git a/sysdeps/alpha/nptl/bits/pthreadtypes-arch.h b/sysdeps/alpha/nptl/bits/pthreadtypes-arch.h > index b6f6cb1..429df10 100644 > --- a/sysdeps/alpha/nptl/bits/pthreadtypes-arch.h > +++ b/sysdeps/alpha/nptl/bits/pthreadtypes-arch.h > @@ -33,6 +33,8 @@ > #define __PTHREAD_COMPAT_PADDING_MID > #define __PTHREAD_COMPAT_PADDING_END > #define __PTHREAD_MUTEX_LOCK_ELISION 0 > +#define __PTHREAD_MUTEX_NUSERS_AFTER_KIND 0 > +#define __PTHREAD_MUTEX_USE_UNION 0 > > #define __LOCK_ALIGNMENT > #define __ONCE_ALIGNMENT > diff --git a/sysdeps/arm/nptl/bits/pthreadtypes-arch.h b/sysdeps/arm/nptl/bits/pthreadtypes-arch.h > index 3f9eca4..3911c81 100644 > --- a/sysdeps/arm/nptl/bits/pthreadtypes-arch.h > +++ b/sysdeps/arm/nptl/bits/pthreadtypes-arch.h > @@ -34,6 +34,8 @@ > #define __PTHREAD_COMPAT_PADDING_MID > #define __PTHREAD_COMPAT_PADDING_END > #define __PTHREAD_MUTEX_LOCK_ELISION 0 > +#define __PTHREAD_MUTEX_NUSERS_AFTER_KIND 1 > +#define __PTHREAD_MUTEX_USE_UNION 1 > > #define __LOCK_ALIGNMENT > #define __ONCE_ALIGNMENT > diff --git a/sysdeps/hppa/nptl/bits/pthreadtypes-arch.h b/sysdeps/hppa/nptl/bits/pthreadtypes-arch.h > index c158562..865a14e 100644 > --- a/sysdeps/hppa/nptl/bits/pthreadtypes-arch.h > +++ b/sysdeps/hppa/nptl/bits/pthreadtypes-arch.h > @@ -48,6 +48,8 @@ > pthread_mutex_t is larger than Linuxthreads. */ > #define __PTHREAD_COMPAT_PADDING_END int __reserved[2]; > #define __PTHREAD_MUTEX_LOCK_ELISION 0 > +#define __PTHREAD_MUTEX_NUSERS_AFTER_KIND 1 > +#define __PTHREAD_MUTEX_USE_UNION 1 > > #define __LOCK_ALIGNMENT __attribute__ ((__aligned__(16))) > #define __ONCE_ALIGNMENT > diff --git a/sysdeps/ia64/nptl/bits/pthreadtypes-arch.h b/sysdeps/ia64/nptl/bits/pthreadtypes-arch.h > index 631cb33..2a3bc75 100644 > --- a/sysdeps/ia64/nptl/bits/pthreadtypes-arch.h > +++ b/sysdeps/ia64/nptl/bits/pthreadtypes-arch.h > @@ -33,6 +33,8 @@ > #define __PTHREAD_COMPAT_PADDING_MID > #define __PTHREAD_COMPAT_PADDING_END > #define __PTHREAD_MUTEX_LOCK_ELISION 0 > +#define __PTHREAD_MUTEX_NUSERS_AFTER_KIND 0 > +#define __PTHREAD_MUTEX_USE_UNION 0 > > #define __LOCK_ALIGNMENT > #define __ONCE_ALIGNMENT > diff --git a/sysdeps/m68k/nptl/bits/pthreadtypes-arch.h b/sysdeps/m68k/nptl/bits/pthreadtypes-arch.h > index 845b9e6..966cc75 100644 > --- a/sysdeps/m68k/nptl/bits/pthreadtypes-arch.h > +++ b/sysdeps/m68k/nptl/bits/pthreadtypes-arch.h > @@ -35,6 +35,8 @@ > #define __PTHREAD_COMPAT_PADDING_MID > #define __PTHREAD_COMPAT_PADDING_END > #define __PTHREAD_MUTEX_LOCK_ELISION 0 > +#define __PTHREAD_MUTEX_NUSERS_AFTER_KIND 1 > +#define __PTHREAD_MUTEX_USE_UNION 1 > > #define __LOCK_ALIGNMENT __attribute__ ((__aligned__ (4))) > #define __ONCE_ALIGNMENT __attribute__ ((__aligned__ (4))) > diff --git a/sysdeps/microblaze/nptl/bits/pthreadtypes-arch.h b/sysdeps/microblaze/nptl/bits/pthreadtypes-arch.h > index d687e2c..e44f2dc 100644 > --- a/sysdeps/microblaze/nptl/bits/pthreadtypes-arch.h > +++ b/sysdeps/microblaze/nptl/bits/pthreadtypes-arch.h > @@ -35,6 +35,8 @@ > #define __PTHREAD_COMPAT_PADDING_MID > #define __PTHREAD_COMPAT_PADDING_END > #define __PTHREAD_MUTEX_LOCK_ELISION 0 > +#define __PTHREAD_MUTEX_NUSERS_AFTER_KIND 1 > +#define __PTHREAD_MUTEX_USE_UNION 1 > > #define __LOCK_ALIGNMENT > #define __ONCE_ALIGNMENT > diff --git a/sysdeps/mips/nptl/bits/pthreadtypes-arch.h b/sysdeps/mips/nptl/bits/pthreadtypes-arch.h > index 6aa1bda..f03389a 100644 > --- a/sysdeps/mips/nptl/bits/pthreadtypes-arch.h > +++ b/sysdeps/mips/nptl/bits/pthreadtypes-arch.h > @@ -42,6 +42,8 @@ > #define __PTHREAD_COMPAT_PADDING_MID > #define __PTHREAD_COMPAT_PADDING_END > #define __PTHREAD_MUTEX_LOCK_ELISION 0 > +#define __PTHREAD_MUTEX_NUSERS_AFTER_KIND (_MIPS_SIM != _ABI64) > +#define __PTHREAD_MUTEX_USE_UNION (_MIPS_SIM != _ABI64) > > #define __LOCK_ALIGNMENT > #define __ONCE_ALIGNMENT > diff --git a/sysdeps/nios2/nptl/bits/pthreadtypes-arch.h b/sysdeps/nios2/nptl/bits/pthreadtypes-arch.h > index e2732f9..83f8684 100644 > --- a/sysdeps/nios2/nptl/bits/pthreadtypes-arch.h > +++ b/sysdeps/nios2/nptl/bits/pthreadtypes-arch.h > @@ -35,6 +35,8 @@ > #define __PTHREAD_COMPAT_PADDING_MID > #define __PTHREAD_COMPAT_PADDING_END > #define __PTHREAD_MUTEX_LOCK_ELISION 0 > +#define __PTHREAD_MUTEX_NUSERS_AFTER_KIND 1 > +#define __PTHREAD_MUTEX_USE_UNION 1 > > #define __LOCK_ALIGNMENT > #define __ONCE_ALIGNMENT > diff --git a/sysdeps/nptl/bits/thread-shared-types.h b/sysdeps/nptl/bits/thread-shared-types.h > index 68b82b6..26073f8 100644 > --- a/sysdeps/nptl/bits/thread-shared-types.h > +++ b/sysdeps/nptl/bits/thread-shared-types.h > @@ -42,6 +42,25 @@ > the internal structure. > __PTHREAD_MUTEX_LOCK_ELISION - 1 if the architecture supports lock > elision or 0 otherwise. > + __PTHREAD_MUTEX_NUSERS_AFTER_KIND - control where to put __nusers. The > + preferred value for new architectures > + is 0. > + __PTHREAD_MUTEX_USE_UNION - control whether internal __spins and > + __list will be place inside an union for > + linuxthreads compatibility. > + The preferred value for new architectures > + is 0. > + > + For a new port the preferred values for the required defines are: > + > + #define __PTHREAD_COMPAT_PADDING_MID > + #define __PTHREAD_COMPAT_PADDING_END > + #define __PTHREAD_MUTEX_LOCK_ELISION 0 > + #define __PTHREAD_MUTEX_NUSERS_AFTER_KIND 0 > + #define __PTHREAD_MUTEX_USE_UNION 0 > + > + __PTHREAD_MUTEX_LOCK_ELISION can be set to 1 if the hardware plans to > + eventually support lock elision using transactional memory. > > The additional macro defines any constraint for the lock alignment > inside the thread structures: > @@ -59,7 +78,7 @@ > > /* Common definition of pthread_mutex_t. */ > > -#if __WORDSIZE == 64 > +#if !__PTHREAD_MUTEX_USE_UNION > typedef struct __pthread_internal_list > { > struct __pthread_internal_list *__prev; > @@ -74,7 +93,7 @@ typedef struct __pthread_internal_slist > > /* Lock elision support. */ > #if __PTHREAD_MUTEX_LOCK_ELISION > -# if __WORDSIZE == 64 > +# if !__PTHREAD_MUTEX_USE_UNION > # define __PTHREAD_SPINS_DATA \ > short __spins; \ > short __elision > @@ -101,24 +120,27 @@ struct __pthread_mutex_s > int __lock __LOCK_ALIGNMENT; > unsigned int __count; > int __owner; > -#if __WORDSIZE == 64 > +#if !__PTHREAD_MUTEX_NUSERS_AFTER_KIND > unsigned int __nusers; > #endif > /* KIND must stay at this position in the structure to maintain > binary compatibility with static initializers. */ > int __kind; > __PTHREAD_COMPAT_PADDING_MID > -#if __WORDSIZE == 64 > +#if !__PTHREAD_MUTEX_USE_UNION > __PTHREAD_SPINS_DATA; > __pthread_list_t __list; > # define __PTHREAD_MUTEX_HAVE_PREV 1 > #else > +# if __PTHREAD_MUTEX_NUSERS_AFTER_KIND > unsigned int __nusers; > +# endif > __extension__ union > { > __PTHREAD_SPINS_DATA; > __pthread_slist_t __list; > }; > +# define __PTHREAD_MUTEX_HAVE_PREV 0 > #endif > __PTHREAD_COMPAT_PADDING_END > }; > diff --git a/sysdeps/nptl/fork.c b/sysdeps/nptl/fork.c > index 4bb87e2..48676c2 100644 > --- a/sysdeps/nptl/fork.c > +++ b/sysdeps/nptl/fork.c > @@ -166,7 +166,7 @@ __libc_fork (void) > inherit the correct value from the parent. We do not need to clear > the pending operation because it must have been zero when fork was > called. */ > -# ifdef __PTHREAD_MUTEX_HAVE_PREV > +# if __PTHREAD_MUTEX_HAVE_PREV > self->robust_prev = &self->robust_head; > # endif > self->robust_head.list = &self->robust_head; > diff --git a/sysdeps/nptl/pthread.h b/sysdeps/nptl/pthread.h > index 632ea7b..2b2b386 100644 > --- a/sysdeps/nptl/pthread.h > +++ b/sysdeps/nptl/pthread.h > @@ -83,7 +83,7 @@ enum > #endif > > > -#ifdef __PTHREAD_MUTEX_HAVE_PREV > +#if __PTHREAD_MUTEX_HAVE_PREV > # define PTHREAD_MUTEX_INITIALIZER \ > { { 0, 0, 0, 0, 0, __PTHREAD_SPINS, { 0, 0 } } } > # ifdef __USE_GNU > diff --git a/sysdeps/powerpc/nptl/bits/pthreadtypes-arch.h b/sysdeps/powerpc/nptl/bits/pthreadtypes-arch.h > index f29119b..8158cb5 100644 > --- a/sysdeps/powerpc/nptl/bits/pthreadtypes-arch.h > +++ b/sysdeps/powerpc/nptl/bits/pthreadtypes-arch.h > @@ -42,6 +42,8 @@ > #define __PTHREAD_COMPAT_PADDING_MID > #define __PTHREAD_COMPAT_PADDING_END > #define __PTHREAD_MUTEX_LOCK_ELISION 1 > +#define __PTHREAD_MUTEX_NUSERS_AFTER_KIND (__WORDSIZE != 64) > +#define __PTHREAD_MUTEX_USE_UNION (__WORDSIZE != 64) > > #define __LOCK_ALIGNMENT > #define __ONCE_ALIGNMENT > diff --git a/sysdeps/s390/nptl/bits/pthreadtypes-arch.h b/sysdeps/s390/nptl/bits/pthreadtypes-arch.h > index 3a9ac57..1ae2773 100644 > --- a/sysdeps/s390/nptl/bits/pthreadtypes-arch.h > +++ b/sysdeps/s390/nptl/bits/pthreadtypes-arch.h > @@ -45,6 +45,8 @@ > #else > #define __PTHREAD_MUTEX_LOCK_ELISION 0 > #endif > +#define __PTHREAD_MUTEX_NUSERS_AFTER_KIND (__WORDSIZE != 64) > +#define __PTHREAD_MUTEX_USE_UNION (__WORDSIZE != 64) > > #define __LOCK_ALIGNMENT > #define __ONCE_ALIGNMENT > diff --git a/sysdeps/sh/nptl/bits/pthreadtypes-arch.h b/sysdeps/sh/nptl/bits/pthreadtypes-arch.h > index b2615fe..e707751 100644 > --- a/sysdeps/sh/nptl/bits/pthreadtypes-arch.h > +++ b/sysdeps/sh/nptl/bits/pthreadtypes-arch.h > @@ -34,6 +34,8 @@ > #define __PTHREAD_COMPAT_PADDING_MID > #define __PTHREAD_COMPAT_PADDING_END > #define __PTHREAD_MUTEX_LOCK_ELISION 0 > +#define __PTHREAD_MUTEX_NUSERS_AFTER_KIND 1 > +#define __PTHREAD_MUTEX_USE_UNION 1 > > #define __LOCK_ALIGNMENT > #define __ONCE_ALIGNMENT > diff --git a/sysdeps/sparc/nptl/bits/pthreadtypes-arch.h b/sysdeps/sparc/nptl/bits/pthreadtypes-arch.h > index 1e188cf..0f96f37 100644 > --- a/sysdeps/sparc/nptl/bits/pthreadtypes-arch.h > +++ b/sysdeps/sparc/nptl/bits/pthreadtypes-arch.h > @@ -43,6 +43,8 @@ > #define __PTHREAD_COMPAT_PADDING_MID > #define __PTHREAD_COMPAT_PADDING_END > #define __PTHREAD_MUTEX_LOCK_ELISION 0 > +#define __PTHREAD_MUTEX_NUSERS_AFTER_KIND (__WORDSIZE != 64) > +#define __PTHREAD_MUTEX_USE_UNION (__WORDSIZE != 64) > > #define __LOCK_ALIGNMENT > #define __ONCE_ALIGNMENT > diff --git a/sysdeps/tile/nptl/bits/pthreadtypes-arch.h b/sysdeps/tile/nptl/bits/pthreadtypes-arch.h > index 145ee42..054474f 100644 > --- a/sysdeps/tile/nptl/bits/pthreadtypes-arch.h > +++ b/sysdeps/tile/nptl/bits/pthreadtypes-arch.h > @@ -43,6 +43,8 @@ > #define __PTHREAD_COMPAT_PADDING_MID > #define __PTHREAD_COMPAT_PADDING_END > #define __PTHREAD_MUTEX_LOCK_ELISION 0 > +#define __PTHREAD_MUTEX_NUSERS_AFTER_KIND (__WORDSIZE != 64) > +#define __PTHREAD_MUTEX_USE_UNION (__WORDSIZE != 64) > > #define __LOCK_ALIGNMENT > #define __ONCE_ALIGNMENT > diff --git a/sysdeps/x86/nptl/bits/pthreadtypes-arch.h b/sysdeps/x86/nptl/bits/pthreadtypes-arch.h > index fd86806..74d5f6d 100644 > --- a/sysdeps/x86/nptl/bits/pthreadtypes-arch.h > +++ b/sysdeps/x86/nptl/bits/pthreadtypes-arch.h > @@ -51,6 +51,13 @@ > #define __PTHREAD_COMPAT_PADDING_MID > #define __PTHREAD_COMPAT_PADDING_END > #define __PTHREAD_MUTEX_LOCK_ELISION 1 > +#ifdef __x86_64__ > +# define __PTHREAD_MUTEX_NUSERS_AFTER_KIND 0 > +# define __PTHREAD_MUTEX_USE_UNION 0 > +#else > +# define __PTHREAD_MUTEX_NUSERS_AFTER_KIND 1 > +# define __PTHREAD_MUTEX_USE_UNION 1 > +#endif > > #define __LOCK_ALIGNMENT > #define __ONCE_ALIGNMENT
On Okt 19 2017, Adhemerval Zanella <adhemerval.zanella@linaro.org> wrote: > [BZ #22298] > * nptl/allocatestack.c (allocate_stack): Check if > __PTHREAD_MUTEX_HAVE_PREV is non-zero, instead if > __PTHREAD_MUTEX_HAVE_PREV is defined. > * nptl/descr.h (pthread): Likewise. > * nptl/nptl-init.c (__pthread_initialize_minimal_internal): > Likewise. > * nptl/pthread_create.c (START_THREAD_DEFN): Likewise. > * sysdeps/nptl/fork.c (__libc_fork): Likewise. > * sysdeps/nptl/pthread.h (PTHREAD_MUTEX_INITIALIZER): Likewise. > * sysdeps/nptl/bits/thread-shared-types.h > (__PTHREAD_MUTEX_NUSERS_AFTER_KIND, __PTHREAD_MUTEX_USE_UNION): New > defines. > (__pthread_internal_list): Check __PTHREAD_MUTEX_USE_UNION instead > of __WORDSIZE for internal layout. > (__pthread_mutex_s): Check __PTHREAD_MUTEX_NUSERS_AFTER_KIND instead > of __WORDSIZE for internal __nusers layout and __PTHREAD_MUTEX_USE_UNION > instead of __WORDSIZE whether to use an union for __spins and __list > fields. > (__PTHREAD_MUTEX_HAVE_PREV): Define also for __PTHREAD_MUTEX_USE_UNION > case. > * sysdeps/aarch64/nptl/bits/pthreadtypes-arch.h > (__PTHREAD_MUTEX_NUSERS_AFTER_KIND, __PTHREAD_MUTEX_USE_UNION): New > defines. > * sysdeps/alpha/nptl/bits/pthreadtypes-arch.h > (__PTHREAD_MUTEX_NUSERS_AFTER_KIND, __PTHREAD_MUTEX_USE_UNION): New > defines. > * sysdeps/arm/nptl/bits/pthreadtypes-arch.h > (__PTHREAD_MUTEX_NUSERS_AFTER_KIND, __PTHREAD_MUTEX_USE_UNION): New > defines. > * sysdeps/hppa/nptl/bits/pthreadtypes-arch.h > (__PTHREAD_MUTEX_NUSERS_AFTER_KIND, __PTHREAD_MUTEX_USE_UNION): New > defines. > * sysdeps/ia64/nptl/bits/pthreadtypes-arch.h > (__PTHREAD_MUTEX_NUSERS_AFTER_KIND, __PTHREAD_MUTEX_USE_UNION): New > defines. > * sysdeps/m68k/nptl/bits/pthreadtypes-arch.h > (__PTHREAD_MUTEX_NUSERS_AFTER_KIND, __PTHREAD_MUTEX_USE_UNION): New > defines. > * sysdeps/microblaze/nptl/bits/pthreadtypes-arch.h > (__PTHREAD_MUTEX_NUSERS_AFTER_KIND, __PTHREAD_MUTEX_USE_UNION): New > defines. > * sysdeps/mips/nptl/bits/pthreadtypes-arch.h > (__PTHREAD_MUTEX_NUSERS_AFTER_KIND, __PTHREAD_MUTEX_USE_UNION): New > defines. > * sysdeps/nios2/nptl/bits/pthreadtypes-arch.h > (__PTHREAD_MUTEX_NUSERS_AFTER_KIND, __PTHREAD_MUTEX_USE_UNION): New > defines. > * sysdeps/powerpc/nptl/bits/pthreadtypes-arch.h > (__PTHREAD_MUTEX_NUSERS_AFTER_KIND, __PTHREAD_MUTEX_USE_UNION): New > defines. > * sysdeps/s390/nptl/bits/pthreadtypes-arch.h > (__PTHREAD_MUTEX_NUSERS_AFTER_KIND, __PTHREAD_MUTEX_USE_UNION): New > defines. > * sysdeps/sh/nptl/bits/pthreadtypes-arch.h > (__PTHREAD_MUTEX_NUSERS_AFTER_KIND, __PTHREAD_MUTEX_USE_UNION): New > defines. > * sysdeps/sparc/nptl/bits/pthreadtypes-arch.h > (__PTHREAD_MUTEX_NUSERS_AFTER_KIND, __PTHREAD_MUTEX_USE_UNION): New > defines. > * sysdeps/tile/nptl/bits/pthreadtypes-arch.h > (__PTHREAD_MUTEX_NUSERS_AFTER_KIND, __PTHREAD_MUTEX_USE_UNION): New > defines. > * sysdeps/x86/nptl/bits/pthreadtypes-arch.h > (__PTHREAD_MUTEX_NUSERS_AFTER_KIND, __PTHREAD_MUTEX_USE_UNION): New > defines. Ok. > diff --git a/sysdeps/nptl/bits/thread-shared-types.h b/sysdeps/nptl/bits/thread-shared-types.h > index 68b82b6..26073f8 100644 > --- a/sysdeps/nptl/bits/thread-shared-types.h > +++ b/sysdeps/nptl/bits/thread-shared-types.h > @@ -42,6 +42,25 @@ > the internal structure. > __PTHREAD_MUTEX_LOCK_ELISION - 1 if the architecture supports lock > elision or 0 otherwise. > + __PTHREAD_MUTEX_NUSERS_AFTER_KIND - control where to put __nusers. The > + preferred value for new architectures > + is 0. > + __PTHREAD_MUTEX_USE_UNION - control whether internal __spins and > + __list will be place inside an union for will be placed inside a union > @@ -101,24 +120,27 @@ struct __pthread_mutex_s > int __lock __LOCK_ALIGNMENT; > unsigned int __count; > int __owner; > -#if __WORDSIZE == 64 > +#if !__PTHREAD_MUTEX_NUSERS_AFTER_KIND > unsigned int __nusers; > #endif > /* KIND must stay at this position in the structure to maintain > binary compatibility with static initializers. */ > int __kind; > __PTHREAD_COMPAT_PADDING_MID > -#if __WORDSIZE == 64 > +#if !__PTHREAD_MUTEX_USE_UNION > __PTHREAD_SPINS_DATA; > __pthread_list_t __list; > # define __PTHREAD_MUTEX_HAVE_PREV 1 > #else > +# if __PTHREAD_MUTEX_NUSERS_AFTER_KIND > unsigned int __nusers; > +# endif The last 3 lines should be moved before the !__PTHREAD_MUTEX_USE_UNION conditional. Andreas. -- Andreas Schwab, SUSE Labs, schwab@suse.de GPG Key fingerprint = 0196 BAD8 1CE9 1970 F4BE 1748 E4D4 88E3 0EEA B9D7 "And now for something completely different."
On 25/10/2017 12:41, Andreas Schwab wrote: > On Okt 19 2017, Adhemerval Zanella <adhemerval.zanella@linaro.org> wrote: > >> [BZ #22298] >> * nptl/allocatestack.c (allocate_stack): Check if >> __PTHREAD_MUTEX_HAVE_PREV is non-zero, instead if >> __PTHREAD_MUTEX_HAVE_PREV is defined. >> * nptl/descr.h (pthread): Likewise. >> * nptl/nptl-init.c (__pthread_initialize_minimal_internal): >> Likewise. >> * nptl/pthread_create.c (START_THREAD_DEFN): Likewise. >> * sysdeps/nptl/fork.c (__libc_fork): Likewise. >> * sysdeps/nptl/pthread.h (PTHREAD_MUTEX_INITIALIZER): Likewise. >> * sysdeps/nptl/bits/thread-shared-types.h >> (__PTHREAD_MUTEX_NUSERS_AFTER_KIND, __PTHREAD_MUTEX_USE_UNION): New >> defines. >> (__pthread_internal_list): Check __PTHREAD_MUTEX_USE_UNION instead >> of __WORDSIZE for internal layout. >> (__pthread_mutex_s): Check __PTHREAD_MUTEX_NUSERS_AFTER_KIND instead >> of __WORDSIZE for internal __nusers layout and __PTHREAD_MUTEX_USE_UNION >> instead of __WORDSIZE whether to use an union for __spins and __list >> fields. >> (__PTHREAD_MUTEX_HAVE_PREV): Define also for __PTHREAD_MUTEX_USE_UNION >> case. >> * sysdeps/aarch64/nptl/bits/pthreadtypes-arch.h >> (__PTHREAD_MUTEX_NUSERS_AFTER_KIND, __PTHREAD_MUTEX_USE_UNION): New >> defines. >> * sysdeps/alpha/nptl/bits/pthreadtypes-arch.h >> (__PTHREAD_MUTEX_NUSERS_AFTER_KIND, __PTHREAD_MUTEX_USE_UNION): New >> defines. >> * sysdeps/arm/nptl/bits/pthreadtypes-arch.h >> (__PTHREAD_MUTEX_NUSERS_AFTER_KIND, __PTHREAD_MUTEX_USE_UNION): New >> defines. >> * sysdeps/hppa/nptl/bits/pthreadtypes-arch.h >> (__PTHREAD_MUTEX_NUSERS_AFTER_KIND, __PTHREAD_MUTEX_USE_UNION): New >> defines. >> * sysdeps/ia64/nptl/bits/pthreadtypes-arch.h >> (__PTHREAD_MUTEX_NUSERS_AFTER_KIND, __PTHREAD_MUTEX_USE_UNION): New >> defines. >> * sysdeps/m68k/nptl/bits/pthreadtypes-arch.h >> (__PTHREAD_MUTEX_NUSERS_AFTER_KIND, __PTHREAD_MUTEX_USE_UNION): New >> defines. >> * sysdeps/microblaze/nptl/bits/pthreadtypes-arch.h >> (__PTHREAD_MUTEX_NUSERS_AFTER_KIND, __PTHREAD_MUTEX_USE_UNION): New >> defines. >> * sysdeps/mips/nptl/bits/pthreadtypes-arch.h >> (__PTHREAD_MUTEX_NUSERS_AFTER_KIND, __PTHREAD_MUTEX_USE_UNION): New >> defines. >> * sysdeps/nios2/nptl/bits/pthreadtypes-arch.h >> (__PTHREAD_MUTEX_NUSERS_AFTER_KIND, __PTHREAD_MUTEX_USE_UNION): New >> defines. >> * sysdeps/powerpc/nptl/bits/pthreadtypes-arch.h >> (__PTHREAD_MUTEX_NUSERS_AFTER_KIND, __PTHREAD_MUTEX_USE_UNION): New >> defines. >> * sysdeps/s390/nptl/bits/pthreadtypes-arch.h >> (__PTHREAD_MUTEX_NUSERS_AFTER_KIND, __PTHREAD_MUTEX_USE_UNION): New >> defines. >> * sysdeps/sh/nptl/bits/pthreadtypes-arch.h >> (__PTHREAD_MUTEX_NUSERS_AFTER_KIND, __PTHREAD_MUTEX_USE_UNION): New >> defines. >> * sysdeps/sparc/nptl/bits/pthreadtypes-arch.h >> (__PTHREAD_MUTEX_NUSERS_AFTER_KIND, __PTHREAD_MUTEX_USE_UNION): New >> defines. >> * sysdeps/tile/nptl/bits/pthreadtypes-arch.h >> (__PTHREAD_MUTEX_NUSERS_AFTER_KIND, __PTHREAD_MUTEX_USE_UNION): New >> defines. >> * sysdeps/x86/nptl/bits/pthreadtypes-arch.h >> (__PTHREAD_MUTEX_NUSERS_AFTER_KIND, __PTHREAD_MUTEX_USE_UNION): New >> defines. > Ok. > >> diff --git a/sysdeps/nptl/bits/thread-shared-types.h b/sysdeps/nptl/bits/thread-shared-types.h >> index 68b82b6..26073f8 100644 >> --- a/sysdeps/nptl/bits/thread-shared-types.h >> +++ b/sysdeps/nptl/bits/thread-shared-types.h >> @@ -42,6 +42,25 @@ >> the internal structure. >> __PTHREAD_MUTEX_LOCK_ELISION - 1 if the architecture supports lock >> elision or 0 otherwise. >> + __PTHREAD_MUTEX_NUSERS_AFTER_KIND - control where to put __nusers. The >> + preferred value for new architectures >> + is 0. >> + __PTHREAD_MUTEX_USE_UNION - control whether internal __spins and >> + __list will be place inside an union for > will be placed inside a union Ack. > >> @@ -101,24 +120,27 @@ struct __pthread_mutex_s >> int __lock __LOCK_ALIGNMENT; >> unsigned int __count; >> int __owner; >> -#if __WORDSIZE == 64 >> +#if !__PTHREAD_MUTEX_NUSERS_AFTER_KIND >> unsigned int __nusers; >> #endif >> /* KIND must stay at this position in the structure to maintain >> binary compatibility with static initializers. */ >> int __kind; >> __PTHREAD_COMPAT_PADDING_MID >> -#if __WORDSIZE == 64 >> +#if !__PTHREAD_MUTEX_USE_UNION >> __PTHREAD_SPINS_DATA; >> __pthread_list_t __list; >> # define __PTHREAD_MUTEX_HAVE_PREV 1 >> #else >> +# if __PTHREAD_MUTEX_NUSERS_AFTER_KIND >> unsigned int __nusers; >> +# endif > The last 3 lines should be moved before the !__PTHREAD_MUTEX_USE_UNION > conditional. > > Andreas. > Ack. I will resubmit the patchset with the change to include the _Static_assert inside the library.
diff --git a/nptl/allocatestack.c b/nptl/allocatestack.c index ad9add8..1cc7893 100644 --- a/nptl/allocatestack.c +++ b/nptl/allocatestack.c @@ -753,7 +753,7 @@ allocate_stack (const struct pthread_attr *attr, struct pthread **pdp, - offsetof (pthread_mutex_t, __data.__list.__next)); pd->robust_head.list_op_pending = NULL; -#ifdef __PTHREAD_MUTEX_HAVE_PREV +#if __PTHREAD_MUTEX_HAVE_PREV pd->robust_prev = &pd->robust_head; #endif pd->robust_head.list = &pd->robust_head; diff --git a/nptl/descr.h b/nptl/descr.h index c5ad0c8..c83b17b 100644 --- a/nptl/descr.h +++ b/nptl/descr.h @@ -169,7 +169,7 @@ struct pthread pid_t pid_ununsed; /* List of robust mutexes the thread is holding. */ -#ifdef __PTHREAD_MUTEX_HAVE_PREV +#if __PTHREAD_MUTEX_HAVE_PREV void *robust_prev; struct robust_list_head robust_head; diff --git a/nptl/nptl-init.c b/nptl/nptl-init.c index 2921607..869e926 100644 --- a/nptl/nptl-init.c +++ b/nptl/nptl-init.c @@ -297,7 +297,7 @@ __pthread_initialize_minimal_internal (void) /* Initialize the robust mutex data. */ { -#ifdef __PTHREAD_MUTEX_HAVE_PREV +#if __PTHREAD_MUTEX_HAVE_PREV pd->robust_prev = &pd->robust_head; #endif pd->robust_head.list = &pd->robust_head; diff --git a/nptl/pthread_create.c b/nptl/pthread_create.c index 992331e..51ae60d 100644 --- a/nptl/pthread_create.c +++ b/nptl/pthread_create.c @@ -518,7 +518,7 @@ START_THREAD_DEFN #ifndef __ASSUME_SET_ROBUST_LIST /* If this thread has any robust mutexes locked, handle them now. */ -# ifdef __PTHREAD_MUTEX_HAVE_PREV +# if __PTHREAD_MUTEX_HAVE_PREV void *robust = pd->robust_head.list; # else __pthread_slist_t *robust = pd->robust_list.__next; @@ -536,7 +536,7 @@ START_THREAD_DEFN __list.__next)); robust = *((void **) robust); -# ifdef __PTHREAD_MUTEX_HAVE_PREV +# if __PTHREAD_MUTEX_HAVE_PREV this->__list.__prev = NULL; # endif this->__list.__next = NULL; diff --git a/sysdeps/aarch64/nptl/bits/pthreadtypes-arch.h b/sysdeps/aarch64/nptl/bits/pthreadtypes-arch.h index d13a75d..9ab23d0 100644 --- a/sysdeps/aarch64/nptl/bits/pthreadtypes-arch.h +++ b/sysdeps/aarch64/nptl/bits/pthreadtypes-arch.h @@ -45,6 +45,8 @@ #define __PTHREAD_COMPAT_PADDING_MID #define __PTHREAD_COMPAT_PADDING_END #define __PTHREAD_MUTEX_LOCK_ELISION 0 +#define __PTHREAD_MUTEX_NUSERS_AFTER_KIND 0 +#define __PTHREAD_MUTEX_USE_UNION 0 #define __LOCK_ALIGNMENT #define __ONCE_ALIGNMENT diff --git a/sysdeps/alpha/nptl/bits/pthreadtypes-arch.h b/sysdeps/alpha/nptl/bits/pthreadtypes-arch.h index b6f6cb1..429df10 100644 --- a/sysdeps/alpha/nptl/bits/pthreadtypes-arch.h +++ b/sysdeps/alpha/nptl/bits/pthreadtypes-arch.h @@ -33,6 +33,8 @@ #define __PTHREAD_COMPAT_PADDING_MID #define __PTHREAD_COMPAT_PADDING_END #define __PTHREAD_MUTEX_LOCK_ELISION 0 +#define __PTHREAD_MUTEX_NUSERS_AFTER_KIND 0 +#define __PTHREAD_MUTEX_USE_UNION 0 #define __LOCK_ALIGNMENT #define __ONCE_ALIGNMENT diff --git a/sysdeps/arm/nptl/bits/pthreadtypes-arch.h b/sysdeps/arm/nptl/bits/pthreadtypes-arch.h index 3f9eca4..3911c81 100644 --- a/sysdeps/arm/nptl/bits/pthreadtypes-arch.h +++ b/sysdeps/arm/nptl/bits/pthreadtypes-arch.h @@ -34,6 +34,8 @@ #define __PTHREAD_COMPAT_PADDING_MID #define __PTHREAD_COMPAT_PADDING_END #define __PTHREAD_MUTEX_LOCK_ELISION 0 +#define __PTHREAD_MUTEX_NUSERS_AFTER_KIND 1 +#define __PTHREAD_MUTEX_USE_UNION 1 #define __LOCK_ALIGNMENT #define __ONCE_ALIGNMENT diff --git a/sysdeps/hppa/nptl/bits/pthreadtypes-arch.h b/sysdeps/hppa/nptl/bits/pthreadtypes-arch.h index c158562..865a14e 100644 --- a/sysdeps/hppa/nptl/bits/pthreadtypes-arch.h +++ b/sysdeps/hppa/nptl/bits/pthreadtypes-arch.h @@ -48,6 +48,8 @@ pthread_mutex_t is larger than Linuxthreads. */ #define __PTHREAD_COMPAT_PADDING_END int __reserved[2]; #define __PTHREAD_MUTEX_LOCK_ELISION 0 +#define __PTHREAD_MUTEX_NUSERS_AFTER_KIND 1 +#define __PTHREAD_MUTEX_USE_UNION 1 #define __LOCK_ALIGNMENT __attribute__ ((__aligned__(16))) #define __ONCE_ALIGNMENT diff --git a/sysdeps/ia64/nptl/bits/pthreadtypes-arch.h b/sysdeps/ia64/nptl/bits/pthreadtypes-arch.h index 631cb33..2a3bc75 100644 --- a/sysdeps/ia64/nptl/bits/pthreadtypes-arch.h +++ b/sysdeps/ia64/nptl/bits/pthreadtypes-arch.h @@ -33,6 +33,8 @@ #define __PTHREAD_COMPAT_PADDING_MID #define __PTHREAD_COMPAT_PADDING_END #define __PTHREAD_MUTEX_LOCK_ELISION 0 +#define __PTHREAD_MUTEX_NUSERS_AFTER_KIND 0 +#define __PTHREAD_MUTEX_USE_UNION 0 #define __LOCK_ALIGNMENT #define __ONCE_ALIGNMENT diff --git a/sysdeps/m68k/nptl/bits/pthreadtypes-arch.h b/sysdeps/m68k/nptl/bits/pthreadtypes-arch.h index 845b9e6..966cc75 100644 --- a/sysdeps/m68k/nptl/bits/pthreadtypes-arch.h +++ b/sysdeps/m68k/nptl/bits/pthreadtypes-arch.h @@ -35,6 +35,8 @@ #define __PTHREAD_COMPAT_PADDING_MID #define __PTHREAD_COMPAT_PADDING_END #define __PTHREAD_MUTEX_LOCK_ELISION 0 +#define __PTHREAD_MUTEX_NUSERS_AFTER_KIND 1 +#define __PTHREAD_MUTEX_USE_UNION 1 #define __LOCK_ALIGNMENT __attribute__ ((__aligned__ (4))) #define __ONCE_ALIGNMENT __attribute__ ((__aligned__ (4))) diff --git a/sysdeps/microblaze/nptl/bits/pthreadtypes-arch.h b/sysdeps/microblaze/nptl/bits/pthreadtypes-arch.h index d687e2c..e44f2dc 100644 --- a/sysdeps/microblaze/nptl/bits/pthreadtypes-arch.h +++ b/sysdeps/microblaze/nptl/bits/pthreadtypes-arch.h @@ -35,6 +35,8 @@ #define __PTHREAD_COMPAT_PADDING_MID #define __PTHREAD_COMPAT_PADDING_END #define __PTHREAD_MUTEX_LOCK_ELISION 0 +#define __PTHREAD_MUTEX_NUSERS_AFTER_KIND 1 +#define __PTHREAD_MUTEX_USE_UNION 1 #define __LOCK_ALIGNMENT #define __ONCE_ALIGNMENT diff --git a/sysdeps/mips/nptl/bits/pthreadtypes-arch.h b/sysdeps/mips/nptl/bits/pthreadtypes-arch.h index 6aa1bda..f03389a 100644 --- a/sysdeps/mips/nptl/bits/pthreadtypes-arch.h +++ b/sysdeps/mips/nptl/bits/pthreadtypes-arch.h @@ -42,6 +42,8 @@ #define __PTHREAD_COMPAT_PADDING_MID #define __PTHREAD_COMPAT_PADDING_END #define __PTHREAD_MUTEX_LOCK_ELISION 0 +#define __PTHREAD_MUTEX_NUSERS_AFTER_KIND (_MIPS_SIM != _ABI64) +#define __PTHREAD_MUTEX_USE_UNION (_MIPS_SIM != _ABI64) #define __LOCK_ALIGNMENT #define __ONCE_ALIGNMENT diff --git a/sysdeps/nios2/nptl/bits/pthreadtypes-arch.h b/sysdeps/nios2/nptl/bits/pthreadtypes-arch.h index e2732f9..83f8684 100644 --- a/sysdeps/nios2/nptl/bits/pthreadtypes-arch.h +++ b/sysdeps/nios2/nptl/bits/pthreadtypes-arch.h @@ -35,6 +35,8 @@ #define __PTHREAD_COMPAT_PADDING_MID #define __PTHREAD_COMPAT_PADDING_END #define __PTHREAD_MUTEX_LOCK_ELISION 0 +#define __PTHREAD_MUTEX_NUSERS_AFTER_KIND 1 +#define __PTHREAD_MUTEX_USE_UNION 1 #define __LOCK_ALIGNMENT #define __ONCE_ALIGNMENT diff --git a/sysdeps/nptl/bits/thread-shared-types.h b/sysdeps/nptl/bits/thread-shared-types.h index 68b82b6..26073f8 100644 --- a/sysdeps/nptl/bits/thread-shared-types.h +++ b/sysdeps/nptl/bits/thread-shared-types.h @@ -42,6 +42,25 @@ the internal structure. __PTHREAD_MUTEX_LOCK_ELISION - 1 if the architecture supports lock elision or 0 otherwise. + __PTHREAD_MUTEX_NUSERS_AFTER_KIND - control where to put __nusers. The + preferred value for new architectures + is 0. + __PTHREAD_MUTEX_USE_UNION - control whether internal __spins and + __list will be place inside an union for + linuxthreads compatibility. + The preferred value for new architectures + is 0. + + For a new port the preferred values for the required defines are: + + #define __PTHREAD_COMPAT_PADDING_MID + #define __PTHREAD_COMPAT_PADDING_END + #define __PTHREAD_MUTEX_LOCK_ELISION 0 + #define __PTHREAD_MUTEX_NUSERS_AFTER_KIND 0 + #define __PTHREAD_MUTEX_USE_UNION 0 + + __PTHREAD_MUTEX_LOCK_ELISION can be set to 1 if the hardware plans to + eventually support lock elision using transactional memory. The additional macro defines any constraint for the lock alignment inside the thread structures: @@ -59,7 +78,7 @@ /* Common definition of pthread_mutex_t. */ -#if __WORDSIZE == 64 +#if !__PTHREAD_MUTEX_USE_UNION typedef struct __pthread_internal_list { struct __pthread_internal_list *__prev; @@ -74,7 +93,7 @@ typedef struct __pthread_internal_slist /* Lock elision support. */ #if __PTHREAD_MUTEX_LOCK_ELISION -# if __WORDSIZE == 64 +# if !__PTHREAD_MUTEX_USE_UNION # define __PTHREAD_SPINS_DATA \ short __spins; \ short __elision @@ -101,24 +120,27 @@ struct __pthread_mutex_s int __lock __LOCK_ALIGNMENT; unsigned int __count; int __owner; -#if __WORDSIZE == 64 +#if !__PTHREAD_MUTEX_NUSERS_AFTER_KIND unsigned int __nusers; #endif /* KIND must stay at this position in the structure to maintain binary compatibility with static initializers. */ int __kind; __PTHREAD_COMPAT_PADDING_MID -#if __WORDSIZE == 64 +#if !__PTHREAD_MUTEX_USE_UNION __PTHREAD_SPINS_DATA; __pthread_list_t __list; # define __PTHREAD_MUTEX_HAVE_PREV 1 #else +# if __PTHREAD_MUTEX_NUSERS_AFTER_KIND unsigned int __nusers; +# endif __extension__ union { __PTHREAD_SPINS_DATA; __pthread_slist_t __list; }; +# define __PTHREAD_MUTEX_HAVE_PREV 0 #endif __PTHREAD_COMPAT_PADDING_END }; diff --git a/sysdeps/nptl/fork.c b/sysdeps/nptl/fork.c index 4bb87e2..48676c2 100644 --- a/sysdeps/nptl/fork.c +++ b/sysdeps/nptl/fork.c @@ -166,7 +166,7 @@ __libc_fork (void) inherit the correct value from the parent. We do not need to clear the pending operation because it must have been zero when fork was called. */ -# ifdef __PTHREAD_MUTEX_HAVE_PREV +# if __PTHREAD_MUTEX_HAVE_PREV self->robust_prev = &self->robust_head; # endif self->robust_head.list = &self->robust_head; diff --git a/sysdeps/nptl/pthread.h b/sysdeps/nptl/pthread.h index 632ea7b..2b2b386 100644 --- a/sysdeps/nptl/pthread.h +++ b/sysdeps/nptl/pthread.h @@ -83,7 +83,7 @@ enum #endif -#ifdef __PTHREAD_MUTEX_HAVE_PREV +#if __PTHREAD_MUTEX_HAVE_PREV # define PTHREAD_MUTEX_INITIALIZER \ { { 0, 0, 0, 0, 0, __PTHREAD_SPINS, { 0, 0 } } } # ifdef __USE_GNU diff --git a/sysdeps/powerpc/nptl/bits/pthreadtypes-arch.h b/sysdeps/powerpc/nptl/bits/pthreadtypes-arch.h index f29119b..8158cb5 100644 --- a/sysdeps/powerpc/nptl/bits/pthreadtypes-arch.h +++ b/sysdeps/powerpc/nptl/bits/pthreadtypes-arch.h @@ -42,6 +42,8 @@ #define __PTHREAD_COMPAT_PADDING_MID #define __PTHREAD_COMPAT_PADDING_END #define __PTHREAD_MUTEX_LOCK_ELISION 1 +#define __PTHREAD_MUTEX_NUSERS_AFTER_KIND (__WORDSIZE != 64) +#define __PTHREAD_MUTEX_USE_UNION (__WORDSIZE != 64) #define __LOCK_ALIGNMENT #define __ONCE_ALIGNMENT diff --git a/sysdeps/s390/nptl/bits/pthreadtypes-arch.h b/sysdeps/s390/nptl/bits/pthreadtypes-arch.h index 3a9ac57..1ae2773 100644 --- a/sysdeps/s390/nptl/bits/pthreadtypes-arch.h +++ b/sysdeps/s390/nptl/bits/pthreadtypes-arch.h @@ -45,6 +45,8 @@ #else #define __PTHREAD_MUTEX_LOCK_ELISION 0 #endif +#define __PTHREAD_MUTEX_NUSERS_AFTER_KIND (__WORDSIZE != 64) +#define __PTHREAD_MUTEX_USE_UNION (__WORDSIZE != 64) #define __LOCK_ALIGNMENT #define __ONCE_ALIGNMENT diff --git a/sysdeps/sh/nptl/bits/pthreadtypes-arch.h b/sysdeps/sh/nptl/bits/pthreadtypes-arch.h index b2615fe..e707751 100644 --- a/sysdeps/sh/nptl/bits/pthreadtypes-arch.h +++ b/sysdeps/sh/nptl/bits/pthreadtypes-arch.h @@ -34,6 +34,8 @@ #define __PTHREAD_COMPAT_PADDING_MID #define __PTHREAD_COMPAT_PADDING_END #define __PTHREAD_MUTEX_LOCK_ELISION 0 +#define __PTHREAD_MUTEX_NUSERS_AFTER_KIND 1 +#define __PTHREAD_MUTEX_USE_UNION 1 #define __LOCK_ALIGNMENT #define __ONCE_ALIGNMENT diff --git a/sysdeps/sparc/nptl/bits/pthreadtypes-arch.h b/sysdeps/sparc/nptl/bits/pthreadtypes-arch.h index 1e188cf..0f96f37 100644 --- a/sysdeps/sparc/nptl/bits/pthreadtypes-arch.h +++ b/sysdeps/sparc/nptl/bits/pthreadtypes-arch.h @@ -43,6 +43,8 @@ #define __PTHREAD_COMPAT_PADDING_MID #define __PTHREAD_COMPAT_PADDING_END #define __PTHREAD_MUTEX_LOCK_ELISION 0 +#define __PTHREAD_MUTEX_NUSERS_AFTER_KIND (__WORDSIZE != 64) +#define __PTHREAD_MUTEX_USE_UNION (__WORDSIZE != 64) #define __LOCK_ALIGNMENT #define __ONCE_ALIGNMENT diff --git a/sysdeps/tile/nptl/bits/pthreadtypes-arch.h b/sysdeps/tile/nptl/bits/pthreadtypes-arch.h index 145ee42..054474f 100644 --- a/sysdeps/tile/nptl/bits/pthreadtypes-arch.h +++ b/sysdeps/tile/nptl/bits/pthreadtypes-arch.h @@ -43,6 +43,8 @@ #define __PTHREAD_COMPAT_PADDING_MID #define __PTHREAD_COMPAT_PADDING_END #define __PTHREAD_MUTEX_LOCK_ELISION 0 +#define __PTHREAD_MUTEX_NUSERS_AFTER_KIND (__WORDSIZE != 64) +#define __PTHREAD_MUTEX_USE_UNION (__WORDSIZE != 64) #define __LOCK_ALIGNMENT #define __ONCE_ALIGNMENT diff --git a/sysdeps/x86/nptl/bits/pthreadtypes-arch.h b/sysdeps/x86/nptl/bits/pthreadtypes-arch.h index fd86806..74d5f6d 100644 --- a/sysdeps/x86/nptl/bits/pthreadtypes-arch.h +++ b/sysdeps/x86/nptl/bits/pthreadtypes-arch.h @@ -51,6 +51,13 @@ #define __PTHREAD_COMPAT_PADDING_MID #define __PTHREAD_COMPAT_PADDING_END #define __PTHREAD_MUTEX_LOCK_ELISION 1 +#ifdef __x86_64__ +# define __PTHREAD_MUTEX_NUSERS_AFTER_KIND 0 +# define __PTHREAD_MUTEX_USE_UNION 0 +#else +# define __PTHREAD_MUTEX_NUSERS_AFTER_KIND 1 +# define __PTHREAD_MUTEX_USE_UNION 1 +#endif #define __LOCK_ALIGNMENT #define __ONCE_ALIGNMENT