From 30efab519e242a2c8f4894a7259a2ffbd5f3827a Mon Sep 17 00:00:00 2001 From: Daniel Jacobowitz Date: Wed, 6 Jun 2007 17:27:04 +0000 Subject: [PATCH] * sysdeps/arm/nptl/tls.h (THREAD_GSCOPE_FLAG_UNUSED, THREAD_GSCOPE_FLAG_USED, THREAD_GSCOPE_FLAG_WAIT): Define. (THREAD_GSCOPE_RESET_FLAG, THREAD_GSCOPE_SET_FLAG, THREAD_GSCOPE_WAIT): Define. * sysdeps/unix/sysv/linux/arm/nptl/lowlevellock.c (lll_unlock_wake_cb): Delete. * sysdeps/unix/sysv/linux/arm/nptl/lowlevellock.h (FUTEX_PRIVATE_FLAG): Define. (lll_unlock_wake_cb): Delete prototype. * sysdeps/unix/sysv/linux/arm/nptl/bits/pthreadtypes.h: Include . (pthread_rwlock_t): Shrink __flags and add __shared. * sysdeps/unix/sysv/linux/arm/nptl/sysdep-cancel.h (RTLD_SINGLE_THREAD_P): Define. * sysdeps/mips/nptl/tls.h (THREAD_GSCOPE_FLAG_UNUSED, THREAD_GSCOPE_FLAG_USED, THREAD_GSCOPE_FLAG_WAIT): Define. (THREAD_GSCOPE_RESET_FLAG, THREAD_GSCOPE_SET_FLAG, THREAD_GSCOPE_WAIT): Define. * sysdeps/unix/sysv/linux/mips/nptl/lowlevellock.h (FUTEX_PRIVATE_FLAG): Define. (lll_unlock_wake_cb): Delete prototype. * sysdeps/unix/sysv/linux/mips/nptl/bits/pthreadtypes.h: Include . (pthread_rwlock_t): Shrink __flags and add __shared. --- ChangeLog.arm | 17 +++++++++++++ ChangeLog.mips | 13 ++++++++++ sysdeps/arm/nptl/tls.h | 25 ++++++++++++++++++- sysdeps/mips/nptl/tls.h | 25 ++++++++++++++++++- .../sysv/linux/arm/nptl/bits/pthreadtypes.h | 16 +++++++++++- .../unix/sysv/linux/arm/nptl/lowlevellock.c | 17 ++----------- .../unix/sysv/linux/arm/nptl/lowlevellock.h | 5 ++-- .../unix/sysv/linux/arm/nptl/sysdep-cancel.h | 6 +++++ .../sysv/linux/mips/nptl/bits/pthreadtypes.h | 20 ++++++++++++--- .../unix/sysv/linux/mips/nptl/lowlevellock.h | 5 ++-- 10 files changed, 122 insertions(+), 27 deletions(-) diff --git a/ChangeLog.arm b/ChangeLog.arm index e733cb6fc5..39e14dca95 100644 --- a/ChangeLog.arm +++ b/ChangeLog.arm @@ -1,3 +1,20 @@ +2007-06-06 Daniel Jacobowitz + + * sysdeps/arm/nptl/tls.h (THREAD_GSCOPE_FLAG_UNUSED, + THREAD_GSCOPE_FLAG_USED, THREAD_GSCOPE_FLAG_WAIT): Define. + (THREAD_GSCOPE_RESET_FLAG, THREAD_GSCOPE_SET_FLAG, + THREAD_GSCOPE_WAIT): Define. + * sysdeps/unix/sysv/linux/arm/nptl/lowlevellock.c + (lll_unlock_wake_cb): Delete. + * sysdeps/unix/sysv/linux/arm/nptl/lowlevellock.h + (FUTEX_PRIVATE_FLAG): Define. + (lll_unlock_wake_cb): Delete prototype. + * sysdeps/unix/sysv/linux/arm/nptl/bits/pthreadtypes.h: Include + . + (pthread_rwlock_t): Shrink __flags and add __shared. + * sysdeps/unix/sysv/linux/arm/nptl/sysdep-cancel.h + (RTLD_SINGLE_THREAD_P): Define. + 2007-05-23 Joseph Myers * sysdeps/unix/sysv/linux/arm/kernel-features.h diff --git a/ChangeLog.mips b/ChangeLog.mips index 34e25614f8..a99e165372 100644 --- a/ChangeLog.mips +++ b/ChangeLog.mips @@ -1,3 +1,16 @@ +2007-06-06 Daniel Jacobowitz + + * sysdeps/mips/nptl/tls.h (THREAD_GSCOPE_FLAG_UNUSED, + THREAD_GSCOPE_FLAG_USED, THREAD_GSCOPE_FLAG_WAIT): Define. + (THREAD_GSCOPE_RESET_FLAG, THREAD_GSCOPE_SET_FLAG, + THREAD_GSCOPE_WAIT): Define. + * sysdeps/unix/sysv/linux/mips/nptl/lowlevellock.h + (FUTEX_PRIVATE_FLAG): Define. + (lll_unlock_wake_cb): Delete prototype. + * sysdeps/unix/sysv/linux/mips/nptl/bits/pthreadtypes.h: Include + . + (pthread_rwlock_t): Shrink __flags and add __shared. + 2007-05-24 Atsushi Nemoto * sysdeps/unix/sysv/linux/mips/mips32/posix_fadvise.c diff --git a/sysdeps/arm/nptl/tls.h b/sysdeps/arm/nptl/tls.h index 26ef70961c..ae2aecc42b 100644 --- a/sysdeps/arm/nptl/tls.h +++ b/sysdeps/arm/nptl/tls.h @@ -1,5 +1,5 @@ /* Definition for thread-local data handling. NPTL/ARM version. - Copyright (C) 2005 Free Software Foundation, Inc. + Copyright (C) 2005, 2007 Free Software Foundation, Inc. This file is part of the GNU C Library. The GNU C Library is free software; you can redistribute it and/or @@ -132,6 +132,29 @@ typedef struct is not available. */ #define TLS_INIT_TP_EXPENSIVE 1 +/* Get and set the global scope generation counter in struct pthread. */ +#define THREAD_GSCOPE_FLAG_UNUSED 0 +#define THREAD_GSCOPE_FLAG_USED 1 +#define THREAD_GSCOPE_FLAG_WAIT 2 +#define THREAD_GSCOPE_RESET_FLAG() \ + do \ + { int __res \ + = atomic_exchange_rel (&THREAD_SELF->header.gscope_flag, \ + THREAD_GSCOPE_FLAG_UNUSED); \ + if (__res == THREAD_GSCOPE_FLAG_WAIT) \ + lll_futex_wake (&THREAD_SELF->header.gscope_flag, 1); \ + } \ + while (0) +#define THREAD_GSCOPE_SET_FLAG() \ + do \ + { \ + THREAD_SELF->header.gscope_flag = THREAD_GSCOPE_FLAG_USED; \ + atomic_write_barrier (); \ + } \ + while (0) +#define THREAD_GSCOPE_WAIT() \ + GL(dl_wait_lookup_done) () + #endif /* __ASSEMBLER__ */ #endif /* tls.h */ diff --git a/sysdeps/mips/nptl/tls.h b/sysdeps/mips/nptl/tls.h index 1cef161010..dbe806a5f8 100644 --- a/sysdeps/mips/nptl/tls.h +++ b/sysdeps/mips/nptl/tls.h @@ -1,5 +1,5 @@ /* Definition for thread-local data handling. NPTL/MIPS version. - Copyright (C) 2005 Free Software Foundation, Inc. + Copyright (C) 2005, 2007 Free Software Foundation, Inc. This file is part of the GNU C Library. The GNU C Library is free software; you can redistribute it and/or @@ -156,6 +156,29 @@ typedef struct different value to mean unset l_tls_offset. */ # define NO_TLS_OFFSET -1 +/* Get and set the global scope generation counter in struct pthread. */ +#define THREAD_GSCOPE_FLAG_UNUSED 0 +#define THREAD_GSCOPE_FLAG_USED 1 +#define THREAD_GSCOPE_FLAG_WAIT 2 +#define THREAD_GSCOPE_RESET_FLAG() \ + do \ + { int __res \ + = atomic_exchange_rel (&THREAD_SELF->header.gscope_flag, \ + THREAD_GSCOPE_FLAG_UNUSED); \ + if (__res == THREAD_GSCOPE_FLAG_WAIT) \ + lll_futex_wake (&THREAD_SELF->header.gscope_flag, 1); \ + } \ + while (0) +#define THREAD_GSCOPE_SET_FLAG() \ + do \ + { \ + THREAD_SELF->header.gscope_flag = THREAD_GSCOPE_FLAG_USED; \ + atomic_write_barrier (); \ + } \ + while (0) +#define THREAD_GSCOPE_WAIT() \ + GL(dl_wait_lookup_done) () + #endif /* __ASSEMBLER__ */ #endif /* tls.h */ diff --git a/sysdeps/unix/sysv/linux/arm/nptl/bits/pthreadtypes.h b/sysdeps/unix/sysv/linux/arm/nptl/bits/pthreadtypes.h index ea8d6a2f0b..e1b115c8ca 100644 --- a/sysdeps/unix/sysv/linux/arm/nptl/bits/pthreadtypes.h +++ b/sysdeps/unix/sysv/linux/arm/nptl/bits/pthreadtypes.h @@ -19,6 +19,8 @@ #ifndef _BITS_PTHREADTYPES_H #define _BITS_PTHREADTYPES_H 1 +#include + #define __SIZEOF_PTHREAD_ATTR_T 36 #define __SIZEOF_PTHREAD_MUTEX_T 24 #define __SIZEOF_PTHREAD_MUTEXATTR_T 4 @@ -126,9 +128,21 @@ typedef union unsigned int __writer_wakeup; unsigned int __nr_readers_queued; unsigned int __nr_writers_queued; +#if __BYTE_ORDER == __BIG_ENDIAN + unsigned char __pad1; + unsigned char __pad2; + unsigned char __shared; /* FLAGS must stay at this position in the structure to maintain binary compatibility. */ - unsigned int __flags; + unsigned char __flags; +#else + /* FLAGS must stay at this position in the structure to maintain + binary compatibility. */ + unsigned char __flags; + unsigned char __shared; + unsigned char __pad1; + unsigned char __pad2; +#endif int __writer; } __data; char __size[__SIZEOF_PTHREAD_RWLOCK_T]; diff --git a/sysdeps/unix/sysv/linux/arm/nptl/lowlevellock.c b/sysdeps/unix/sysv/linux/arm/nptl/lowlevellock.c index e0643a9f3b..66a4d7b360 100644 --- a/sysdeps/unix/sysv/linux/arm/nptl/lowlevellock.c +++ b/sysdeps/unix/sysv/linux/arm/nptl/lowlevellock.c @@ -1,5 +1,5 @@ /* low level locking for pthread library. Generic futex-using version. - Copyright (C) 2003, 2005 Free Software Foundation, Inc. + Copyright (C) 2003, 2005, 2007 Free Software Foundation, Inc. This file is part of the GNU C Library. The GNU C Library is free software; you can redistribute it and/or @@ -63,20 +63,8 @@ __lll_timedlock_wait (int *futex, const struct timespec *abstime) } -/* These don't get included in libc.so */ +/* This function doesn't get included in libc.so */ #ifdef IS_IN_libpthread -int -lll_unlock_wake_cb (int *futex) -{ - int val = atomic_exchange_rel (futex, 0); - - if (__builtin_expect (val > 1, 0)) - lll_futex_wake (futex, 1); - - return 0; -} - - int __lll_timedwait_tid (int *tidp, const struct timespec *abstime) { @@ -114,5 +102,4 @@ __lll_timedwait_tid (int *tidp, const struct timespec *abstime) return 0; } - #endif diff --git a/sysdeps/unix/sysv/linux/arm/nptl/lowlevellock.h b/sysdeps/unix/sysv/linux/arm/nptl/lowlevellock.h index 4bae953251..15cf1478fd 100644 --- a/sysdeps/unix/sysv/linux/arm/nptl/lowlevellock.h +++ b/sysdeps/unix/sysv/linux/arm/nptl/lowlevellock.h @@ -1,4 +1,4 @@ -/* Copyright (C) 2005, 2006 Free Software Foundation, Inc. +/* Copyright (C) 2005, 2006, 2007 Free Software Foundation, Inc. This file is part of the GNU C Library. The GNU C Library is free software; you can redistribute it and/or @@ -34,6 +34,7 @@ #define FUTEX_LOCK_PI 6 #define FUTEX_UNLOCK_PI 7 #define FUTEX_TRYLOCK_PI 8 +#define FUTEX_PRIVATE_FLAG 128 /* Initializer for compatibility lock. */ #define LLL_MUTEX_LOCK_INITIALIZER (0) @@ -267,8 +268,6 @@ typedef int lll_lock_t; #define LLL_LOCK_INITIALIZER (0) #define LLL_LOCK_INITIALIZER_LOCKED (1) -extern int lll_unlock_wake_cb (int *__futex) attribute_hidden; - /* The states of a lock are: 0 - untaken 1 - taken by one user diff --git a/sysdeps/unix/sysv/linux/arm/nptl/sysdep-cancel.h b/sysdeps/unix/sysv/linux/arm/nptl/sysdep-cancel.h index a44ee95e18..3fb2186d21 100644 --- a/sysdeps/unix/sysv/linux/arm/nptl/sysdep-cancel.h +++ b/sysdeps/unix/sysv/linux/arm/nptl/sysdep-cancel.h @@ -126,3 +126,9 @@ extern int __local_multiple_threads attribute_hidden; # define NO_CANCELLATION 1 #endif + +#ifndef __ASSEMBLER__ +# define RTLD_SINGLE_THREAD_P \ + __builtin_expect (THREAD_GETMEM (THREAD_SELF, \ + header.multiple_threads) == 0, 1) +#endif diff --git a/sysdeps/unix/sysv/linux/mips/nptl/bits/pthreadtypes.h b/sysdeps/unix/sysv/linux/mips/nptl/bits/pthreadtypes.h index eda0a2fbe9..166a6c6aee 100644 --- a/sysdeps/unix/sysv/linux/mips/nptl/bits/pthreadtypes.h +++ b/sysdeps/unix/sysv/linux/mips/nptl/bits/pthreadtypes.h @@ -20,6 +20,8 @@ #ifndef _BITS_PTHREADTYPES_H #define _BITS_PTHREADTYPES_H 1 +#include + #if _MIPS_SIM == _ABI64 # define __SIZEOF_PTHREAD_ATTR_T 56 # define __SIZEOF_PTHREAD_MUTEX_T 40 @@ -157,9 +159,9 @@ typedef union unsigned int __nr_readers_queued; unsigned int __nr_writers_queued; int __writer; - int __pad1; + int __shared; + unsigned long int __pad1; unsigned long int __pad2; - unsigned long int __pad3; /* FLAGS must stay at this position in the structure to maintain binary compatibility. */ unsigned int __flags; @@ -173,9 +175,21 @@ typedef union unsigned int __writer_wakeup; unsigned int __nr_readers_queued; unsigned int __nr_writers_queued; +#if __BYTE_ORDER == __BIG_ENDIAN + unsigned char __pad1; + unsigned char __pad2; + unsigned char __shared; /* FLAGS must stay at this position in the structure to maintain binary compatibility. */ - unsigned int __flags; + unsigned char __flags; +#else + /* FLAGS must stay at this position in the structure to maintain + binary compatibility. */ + unsigned char __flags; + unsigned char __shared; + unsigned char __pad1; + unsigned char __pad2; +#endif int __writer; } __data; # endif diff --git a/sysdeps/unix/sysv/linux/mips/nptl/lowlevellock.h b/sysdeps/unix/sysv/linux/mips/nptl/lowlevellock.h index 36a20f164a..4542e5b91f 100644 --- a/sysdeps/unix/sysv/linux/mips/nptl/lowlevellock.h +++ b/sysdeps/unix/sysv/linux/mips/nptl/lowlevellock.h @@ -1,4 +1,4 @@ -/* Copyright (C) 2003, 2004, 2005, 2006 Free Software Foundation, Inc. +/* Copyright (C) 2003, 2004, 2005, 2006, 2007 Free Software Foundation, Inc. This file is part of the GNU C Library. The GNU C Library is free software; you can redistribute it and/or @@ -35,6 +35,7 @@ #define FUTEX_LOCK_PI 6 #define FUTEX_UNLOCK_PI 7 #define FUTEX_TRYLOCK_PI 8 +#define FUTEX_PRIVATE_FLAG 128 /* Initializer for compatibility lock. */ #define LLL_MUTEX_LOCK_INITIALIZER (0) @@ -234,8 +235,6 @@ typedef int lll_lock_t; #define LLL_LOCK_INITIALIZER (0) #define LLL_LOCK_INITIALIZER_LOCKED (1) -extern int lll_unlock_wake_cb (int *__futex) attribute_hidden; - /* The states of a lock are: 0 - untaken 1 - taken by one user