[v2,3/3] nptl: Define __PTHREAD_MUTEX_{NUSERS_AFTER_KIND,USE_UNION}
Commit Message
Changes from previous version:
- Fixed __nusers placement for __PTHREAD_MUTEX_NUSERS_AFTER_KIND.
- Fixed typos.
---
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.
Signed-off-by: Adhemerval Zanella <adhemerval.zanella@linaro.org>
[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 | 32 +++++++++--
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, 136 insertions(+), 12 deletions(-)
Comments
Ping.
On 26/10/2017 15:14, Adhemerval Zanella wrote:
> Changes from previous version:
>
> - Fixed __nusers placement for __PTHREAD_MUTEX_NUSERS_AFTER_KIND.
> - Fixed typos.
>
> ---
>
> 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.
>
> Signed-off-by: Adhemerval Zanella <adhemerval.zanella@linaro.org>
>
> [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 | 32 +++++++++--
> 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, 136 insertions(+), 12 deletions(-)
>
> diff --git a/ChangeLog b/ChangeLog
> index 09e25be..203f014 100644
> --- a/ChangeLog
> +++ b/ChangeLog
> @@ -1,5 +1,72 @@
> 2017-10-25 Adhemerval Zanella <adhemerval.zanella@linaro.org>
>
> + [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.
> +
> * nptl/pthreadP.h (ASSERT_TYPE_SIZE, ASSERT_PTHREAD_INTERNAL_SIZE):
> New macros.
> * nptl/pthread_attr_init.c (__pthread_mutex_init): Add build time
> 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..da4358a 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 a 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_NUSERS_AFTER_KIND
> + unsigned int __nusers;
> +#endif
> +#if !__PTHREAD_MUTEX_USE_UNION
> __PTHREAD_SPINS_DATA;
> __pthread_list_t __list;
> # define __PTHREAD_MUTEX_HAVE_PREV 1
> #else
> - unsigned int __nusers;
> __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 Thu, Nov 2, 2017 at 5:14 AM, Adhemerval Zanella
<adhemerval.zanella@linaro.org> wrote:
> Ping.
>
> On 26/10/2017 15:14, Adhemerval Zanella wrote:
>> Changes from previous version:
>>
>> - Fixed __nusers placement for __PTHREAD_MUTEX_NUSERS_AFTER_KIND.
>> - Fixed typos.
>>
>> ---
>>
>> 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.
>>
>> Signed-off-by: Adhemerval Zanella <adhemerval.zanella@linaro.org>
>>
>> [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 | 32 +++++++++--
>> 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, 136 insertions(+), 12 deletions(-)
>>
>> diff --git a/ChangeLog b/ChangeLog
>> index 09e25be..203f014 100644
>> --- a/ChangeLog
>> +++ b/ChangeLog
>> @@ -1,5 +1,72 @@
>> 2017-10-25 Adhemerval Zanella <adhemerval.zanella@linaro.org>
>>
>> + [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.
>> +
>> * nptl/pthreadP.h (ASSERT_TYPE_SIZE, ASSERT_PTHREAD_INTERNAL_SIZE):
>> New macros.
>> * nptl/pthread_attr_init.c (__pthread_mutex_init): Add build time
>> 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..da4358a 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 a 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_NUSERS_AFTER_KIND
>> + unsigned int __nusers;
>> +#endif
>> +#if !__PTHREAD_MUTEX_USE_UNION
>> __PTHREAD_SPINS_DATA;
>> __pthread_list_t __list;
>> # define __PTHREAD_MUTEX_HAVE_PREV 1
>> #else
>> - unsigned int __nusers;
>> __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
>>
LGTM.
Thanks.
On Fri, Nov 3, 2017 at 8:25 AM, H.J. Lu <hjl.tools@gmail.com> wrote:
> On Thu, Nov 2, 2017 at 5:14 AM, Adhemerval Zanella
> <adhemerval.zanella@linaro.org> wrote:
>> Ping.
>>
>> On 26/10/2017 15:14, Adhemerval Zanella wrote:
>>> Changes from previous version:
>>>
>>> - Fixed __nusers placement for __PTHREAD_MUTEX_NUSERS_AFTER_KIND.
>>> - Fixed typos.
>>>
>>> ---
>>>
>>> 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.
>>>
>>> Signed-off-by: Adhemerval Zanella <adhemerval.zanella@linaro.org>
>>>
>>> [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.
> LGTM.
>
> Thanks.
>
> --
> H.J.
Are you going to check in your patches to fix BZ #22298?
On 06/11/2017 12:18, H.J. Lu wrote:
> On Fri, Nov 3, 2017 at 8:25 AM, H.J. Lu <hjl.tools@gmail.com> wrote:
>> On Thu, Nov 2, 2017 at 5:14 AM, Adhemerval Zanella
>> <adhemerval.zanella@linaro.org> wrote:
>>> Ping.
>>>
>>> On 26/10/2017 15:14, Adhemerval Zanella wrote:
>>>> Changes from previous version:
>>>>
>>>> - Fixed __nusers placement for __PTHREAD_MUTEX_NUSERS_AFTER_KIND.
>>>> - Fixed typos.
>>>>
>>>> ---
>>>>
>>>> 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.
>>>>
>>>> Signed-off-by: Adhemerval Zanella <adhemerval.zanella@linaro.org>
>>>>
>>>> [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.
>
>> LGTM.
>>
>> Thanks.
>>
>> --
>> H.J.
>
> Are you going to check in your patches to fix BZ #22298?
>
I think the onyl missing point for the patchset was Florian said
he need to double-check the coverage is adequate [1].
[1] https://sourceware.org/ml/libc-alpha/2017-11/msg00046.html
On 11/06/2017 03:59 PM, Adhemerval Zanella wrote:
> I think the onyl missing point for the patchset was Florian said
> he need to double-check the coverage is adequate [1].
I'm going to double-check that now.
Thanks,
Florian
@@ -1,5 +1,72 @@
2017-10-25 Adhemerval Zanella <adhemerval.zanella@linaro.org>
+ [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.
+
* nptl/pthreadP.h (ASSERT_TYPE_SIZE, ASSERT_PTHREAD_INTERNAL_SIZE):
New macros.
* nptl/pthread_attr_init.c (__pthread_mutex_init): Add build time
@@ -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;
@@ -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;
@@ -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;
@@ -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;
@@ -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
@@ -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
@@ -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
@@ -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
@@ -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
@@ -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)))
@@ -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
@@ -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
@@ -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
@@ -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 a 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_NUSERS_AFTER_KIND
+ unsigned int __nusers;
+#endif
+#if !__PTHREAD_MUTEX_USE_UNION
__PTHREAD_SPINS_DATA;
__pthread_list_t __list;
# define __PTHREAD_MUTEX_HAVE_PREV 1
#else
- unsigned int __nusers;
__extension__ union
{
__PTHREAD_SPINS_DATA;
__pthread_slist_t __list;
};
+# define __PTHREAD_MUTEX_HAVE_PREV 0
#endif
__PTHREAD_COMPAT_PADDING_END
};
@@ -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;
@@ -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
@@ -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
@@ -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
@@ -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
@@ -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
@@ -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
@@ -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