This is the mail archive of the
libc-alpha@sourceware.org
mailing list for the glibc project.
Re: [PATCH 1/3] Define __PTHREAD_MUTEX_HAVE_PREV for all architectures [BZ #22298]
- From: "H.J. Lu" <hjl dot tools at gmail dot com>
- To: Adhemerval Zanella <adhemerval dot zanella at linaro dot org>
- Cc: GNU C Library <libc-alpha at sourceware dot org>
- Date: Mon, 16 Oct 2017 14:37:28 -0700
- Subject: Re: [PATCH 1/3] Define __PTHREAD_MUTEX_HAVE_PREV for all architectures [BZ #22298]
- Authentication-results: sourceware.org; auth=none
- References: <1508186653-24430-1-git-send-email-adhemerval.zanella@linaro.org>
On Mon, Oct 16, 2017 at 1:44 PM, Adhemerval Zanella
<adhemerval.zanella@linaro.org> wrote:
> It is incorrect to define __PTHREAD_MUTEX_HAVE_PREV to 1 only when
> __WORDSIZE == 64. On x32, for instance, __PTHREAD_MUTEX_HAVE_PREV
> should be 1, but it has __WORDSIZE == 32.
>
> This patch defines __PTHREAD_MUTEX_HAVE_PREV for all architectures
> and its check is changed from "#ifdef" to "#if" to support values
> of 0 or 1.
>
> Checked on x86_64-linux-gnu and with a build for all major ABIs
> affected.
>
> H.J. Lu <hongjiu.lu@intel.com>
> Adhemerval Zanella <adhemerval.zanella@linaro.org>
Missing [BZ #22298] here. Otherwise, LGTM.
Thanks.
> * 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_internal_list,
> __pthread_mutex_s): Check __PTHREAD_MUTEX_HAVE_PREV instead of
> __WORDSIZE.
> * sysdeps/aarch64/nptl/bits/pthreadtypes-arch.h
> (__PTHREAD_MUTEX_HAVE_PREV): New define.
> * sysdeps/alpha/nptl/bits/pthreadtypes-arch.h
> (__PTHREAD_MUTEX_HAVE_PREV): Likewise.
> * sysdeps/arm/nptl/bits/pthreadtypes-arch.h
> (__PTHREAD_MUTEX_HAVE_PREV): Likewise.
> * sysdeps/hppa/nptl/bits/pthreadtypes-arch.h
> (__PTHREAD_MUTEX_HAVE_PREV): Likewise.
> * sysdeps/ia64/nptl/bits/pthreadtypes-arch.h
> (__PTHREAD_MUTEX_HAVE_PREV): Likewise.
> * sysdeps/m68k/nptl/bits/pthreadtypes-arch.h
> (__PTHREAD_MUTEX_HAVE_PREV): Likewise.
> * sysdeps/microblaze/nptl/bits/pthreadtypes-arch.h
> (__PTHREAD_MUTEX_HAVE_PREV): Likewise.
> * sysdeps/mips/nptl/bits/pthreadtypes-arch.h
> (__PTHREAD_MUTEX_HAVE_PREV): Likewise.
> * sysdeps/nios2/nptl/bits/pthreadtypes-arch.h
> (__PTHREAD_MUTEX_HAVE_PREV): Likewise.
> * sysdeps/powerpc/nptl/bits/pthreadtypes-arch.h
> (__PTHREAD_MUTEX_HAVE_PREV): Likewise.
> * sysdeps/s390/nptl/bits/pthreadtypes-arch.h
> (__PTHREAD_MUTEX_HAVE_PREV): Likewise.
> * sysdeps/sh/nptl/bits/pthreadtypes-arch.h
> (__PTHREAD_MUTEX_HAVE_PREV): Likewise.
> * sysdeps/sparc/nptl/bits/pthreadtypes-arch.h
> (__PTHREAD_MUTEX_HAVE_PREV): Likewise.
> * sysdeps/tile/nptl/bits/pthreadtypes-arch.h
> (__PTHREAD_MUTEX_HAVE_PREV): Likewise.
> * sysdeps/x86/nptl/bits/pthreadtypes-arch.h
> (__PTHREAD_MUTEX_HAVE_PREV): Likewise.
> ---
> ChangeLog | 46 ++++++++++++++++++++++++
> 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 | 5 +++
> sysdeps/alpha/nptl/bits/pthreadtypes-arch.h | 1 +
> sysdeps/arm/nptl/bits/pthreadtypes-arch.h | 1 +
> sysdeps/hppa/nptl/bits/pthreadtypes-arch.h | 1 +
> sysdeps/ia64/nptl/bits/pthreadtypes-arch.h | 1 +
> sysdeps/m68k/nptl/bits/pthreadtypes-arch.h | 1 +
> sysdeps/microblaze/nptl/bits/pthreadtypes-arch.h | 1 +
> sysdeps/mips/nptl/bits/pthreadtypes-arch.h | 1 +
> sysdeps/nios2/nptl/bits/pthreadtypes-arch.h | 1 +
> sysdeps/nptl/bits/thread-shared-types.h | 12 ++++---
> sysdeps/nptl/fork.c | 2 +-
> sysdeps/nptl/pthread.h | 2 +-
> sysdeps/powerpc/nptl/bits/pthreadtypes-arch.h | 1 +
> sysdeps/s390/nptl/bits/pthreadtypes-arch.h | 1 +
> sysdeps/sh/nptl/bits/pthreadtypes-arch.h | 1 +
> sysdeps/sparc/nptl/bits/pthreadtypes-arch.h | 1 +
> sysdeps/tile/nptl/bits/pthreadtypes-arch.h | 1 +
> sysdeps/x86/nptl/bits/pthreadtypes-arch.h | 5 +++
> 23 files changed, 83 insertions(+), 12 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..3c43707 100644
> --- a/sysdeps/aarch64/nptl/bits/pthreadtypes-arch.h
> +++ b/sysdeps/aarch64/nptl/bits/pthreadtypes-arch.h
> @@ -45,6 +45,11 @@
> #define __PTHREAD_COMPAT_PADDING_MID
> #define __PTHREAD_COMPAT_PADDING_END
> #define __PTHREAD_MUTEX_LOCK_ELISION 0
> +#ifdef __ILP32__
> +#define __PTHREAD_MUTEX_HAVE_PREV 0
> +#else
> +#define __PTHREAD_MUTEX_HAVE_PREV 1
> +#endif
>
> #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..687028a 100644
> --- a/sysdeps/alpha/nptl/bits/pthreadtypes-arch.h
> +++ b/sysdeps/alpha/nptl/bits/pthreadtypes-arch.h
> @@ -33,6 +33,7 @@
> #define __PTHREAD_COMPAT_PADDING_MID
> #define __PTHREAD_COMPAT_PADDING_END
> #define __PTHREAD_MUTEX_LOCK_ELISION 0
> +#define __PTHREAD_MUTEX_HAVE_PREV 1
>
> #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..fac38ac 100644
> --- a/sysdeps/arm/nptl/bits/pthreadtypes-arch.h
> +++ b/sysdeps/arm/nptl/bits/pthreadtypes-arch.h
> @@ -34,6 +34,7 @@
> #define __PTHREAD_COMPAT_PADDING_MID
> #define __PTHREAD_COMPAT_PADDING_END
> #define __PTHREAD_MUTEX_LOCK_ELISION 0
> +#define __PTHREAD_MUTEX_HAVE_PREV 0
>
> #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..7ad0ce7 100644
> --- a/sysdeps/hppa/nptl/bits/pthreadtypes-arch.h
> +++ b/sysdeps/hppa/nptl/bits/pthreadtypes-arch.h
> @@ -48,6 +48,7 @@
> pthread_mutex_t is larger than Linuxthreads. */
> #define __PTHREAD_COMPAT_PADDING_END int __reserved[2];
> #define __PTHREAD_MUTEX_LOCK_ELISION 0
> +#define __PTHREAD_MUTEX_HAVE_PREV 0
>
> #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..d456aba 100644
> --- a/sysdeps/ia64/nptl/bits/pthreadtypes-arch.h
> +++ b/sysdeps/ia64/nptl/bits/pthreadtypes-arch.h
> @@ -33,6 +33,7 @@
> #define __PTHREAD_COMPAT_PADDING_MID
> #define __PTHREAD_COMPAT_PADDING_END
> #define __PTHREAD_MUTEX_LOCK_ELISION 0
> +#define __PTHREAD_MUTEX_HAVE_PREV 1
>
> #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..25e93be 100644
> --- a/sysdeps/m68k/nptl/bits/pthreadtypes-arch.h
> +++ b/sysdeps/m68k/nptl/bits/pthreadtypes-arch.h
> @@ -35,6 +35,7 @@
> #define __PTHREAD_COMPAT_PADDING_MID
> #define __PTHREAD_COMPAT_PADDING_END
> #define __PTHREAD_MUTEX_LOCK_ELISION 0
> +#define __PTHREAD_MUTEX_HAVE_PREV 0
>
> #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..b9130b6 100644
> --- a/sysdeps/microblaze/nptl/bits/pthreadtypes-arch.h
> +++ b/sysdeps/microblaze/nptl/bits/pthreadtypes-arch.h
> @@ -35,6 +35,7 @@
> #define __PTHREAD_COMPAT_PADDING_MID
> #define __PTHREAD_COMPAT_PADDING_END
> #define __PTHREAD_MUTEX_LOCK_ELISION 0
> +#define __PTHREAD_MUTEX_HAVE_PREV 0
>
> #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..c5cc1f8 100644
> --- a/sysdeps/mips/nptl/bits/pthreadtypes-arch.h
> +++ b/sysdeps/mips/nptl/bits/pthreadtypes-arch.h
> @@ -42,6 +42,7 @@
> #define __PTHREAD_COMPAT_PADDING_MID
> #define __PTHREAD_COMPAT_PADDING_END
> #define __PTHREAD_MUTEX_LOCK_ELISION 0
> +#define __PTHREAD_MUTEX_HAVE_PREV (_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..431da41 100644
> --- a/sysdeps/nios2/nptl/bits/pthreadtypes-arch.h
> +++ b/sysdeps/nios2/nptl/bits/pthreadtypes-arch.h
> @@ -35,6 +35,7 @@
> #define __PTHREAD_COMPAT_PADDING_MID
> #define __PTHREAD_COMPAT_PADDING_END
> #define __PTHREAD_MUTEX_LOCK_ELISION 0
> +#define __PTHREAD_MUTEX_HAVE_PREV 0
>
> #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..0d24529 100644
> --- a/sysdeps/nptl/bits/thread-shared-types.h
> +++ b/sysdeps/nptl/bits/thread-shared-types.h
> @@ -59,7 +59,10 @@
>
> /* Common definition of pthread_mutex_t. */
>
> -#if __WORDSIZE == 64
> +/* __PTHREAD_MUTEX_HAVE_PREV also defines the internal layout of
> + __pthread_mutex_s internal __nusers, __PTHREAD_SPINS_DATA, and
> + __list members. */
> +#if __PTHREAD_MUTEX_HAVE_PREV
> typedef struct __pthread_internal_list
> {
> struct __pthread_internal_list *__prev;
> @@ -74,7 +77,7 @@ typedef struct __pthread_internal_slist
>
> /* Lock elision support. */
> #if __PTHREAD_MUTEX_LOCK_ELISION
> -# if __WORDSIZE == 64
> +# if __PTHREAD_MUTEX_HAVE_PREV
> # define __PTHREAD_SPINS_DATA \
> short __spins; \
> short __elision
> @@ -101,17 +104,16 @@ struct __pthread_mutex_s
> int __lock __LOCK_ALIGNMENT;
> unsigned int __count;
> int __owner;
> -#if __WORDSIZE == 64
> +#if __PTHREAD_MUTEX_HAVE_PREV
> 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_HAVE_PREV
> __PTHREAD_SPINS_DATA;
> __pthread_list_t __list;
> -# define __PTHREAD_MUTEX_HAVE_PREV 1
> #else
> unsigned int __nusers;
> __extension__ union
> 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..d56897b 100644
> --- a/sysdeps/powerpc/nptl/bits/pthreadtypes-arch.h
> +++ b/sysdeps/powerpc/nptl/bits/pthreadtypes-arch.h
> @@ -42,6 +42,7 @@
> #define __PTHREAD_COMPAT_PADDING_MID
> #define __PTHREAD_COMPAT_PADDING_END
> #define __PTHREAD_MUTEX_LOCK_ELISION 1
> +#define __PTHREAD_MUTEX_HAVE_PREV (__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..e4c164a 100644
> --- a/sysdeps/s390/nptl/bits/pthreadtypes-arch.h
> +++ b/sysdeps/s390/nptl/bits/pthreadtypes-arch.h
> @@ -45,6 +45,7 @@
> #else
> #define __PTHREAD_MUTEX_LOCK_ELISION 0
> #endif
> +#define __PTHREAD_MUTEX_HAVE_PREV (__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..711e7bb 100644
> --- a/sysdeps/sh/nptl/bits/pthreadtypes-arch.h
> +++ b/sysdeps/sh/nptl/bits/pthreadtypes-arch.h
> @@ -34,6 +34,7 @@
> #define __PTHREAD_COMPAT_PADDING_MID
> #define __PTHREAD_COMPAT_PADDING_END
> #define __PTHREAD_MUTEX_LOCK_ELISION 0
> +#define __PTHREAD_MUTEX_HAVE_PREV 0
>
> #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..6e7f47a 100644
> --- a/sysdeps/sparc/nptl/bits/pthreadtypes-arch.h
> +++ b/sysdeps/sparc/nptl/bits/pthreadtypes-arch.h
> @@ -43,6 +43,7 @@
> #define __PTHREAD_COMPAT_PADDING_MID
> #define __PTHREAD_COMPAT_PADDING_END
> #define __PTHREAD_MUTEX_LOCK_ELISION 0
> +#define __PTHREAD_MUTEX_HAVE_PREV (__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..c753a9b 100644
> --- a/sysdeps/tile/nptl/bits/pthreadtypes-arch.h
> +++ b/sysdeps/tile/nptl/bits/pthreadtypes-arch.h
> @@ -43,6 +43,7 @@
> #define __PTHREAD_COMPAT_PADDING_MID
> #define __PTHREAD_COMPAT_PADDING_END
> #define __PTHREAD_MUTEX_LOCK_ELISION 0
> +#define __PTHREAD_MUTEX_HAVE_PREV (__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..1df1e02 100644
> --- a/sysdeps/x86/nptl/bits/pthreadtypes-arch.h
> +++ b/sysdeps/x86/nptl/bits/pthreadtypes-arch.h
> @@ -51,6 +51,11 @@
> #define __PTHREAD_COMPAT_PADDING_MID
> #define __PTHREAD_COMPAT_PADDING_END
> #define __PTHREAD_MUTEX_LOCK_ELISION 1
> +#ifdef __x86_64__
> +# define __PTHREAD_MUTEX_HAVE_PREV 1
> +#else
> +# define __PTHREAD_MUTEX_HAVE_PREV 0
> +#endif
>
> #define __LOCK_ALIGNMENT
> #define __ONCE_ALIGNMENT
> --
> 2.7.4
>
--
H.J.