Message ID | 1508186653-24430-1-git-send-email-adhemerval.zanella@linaro.org |
---|---|
State | New |
Headers | show |
Series | [1/3] Define __PTHREAD_MUTEX_HAVE_PREV for all architectures [BZ #22298] | expand |
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.
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