diff options
Diffstat (limited to 'libpthread/nptl/sysdeps')
16 files changed, 0 insertions, 4209 deletions
| diff --git a/libpthread/nptl/sysdeps/generic/lowlevellock.h b/libpthread/nptl/sysdeps/generic/lowlevellock.h deleted file mode 100644 index cced770d2..000000000 --- a/libpthread/nptl/sysdeps/generic/lowlevellock.h +++ /dev/null @@ -1,83 +0,0 @@ -/* Low level locking macros used in NPTL implementation.  Stub version. -   Copyright (C) 2002, 2007 Free Software Foundation, Inc. -   This file is part of the GNU C Library. -   Contributed by Ulrich Drepper <drepper@redhat.com>, 2002. - -   The GNU C Library is free software; you can redistribute it and/or -   modify it under the terms of the GNU Lesser General Public -   License as published by the Free Software Foundation; either -   version 2.1 of the License, or (at your option) any later version. - -   The GNU C Library is distributed in the hope that it will be useful, -   but WITHOUT ANY WARRANTY; without even the implied warranty of -   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU -   Lesser General Public License for more details. - -   You should have received a copy of the GNU Lesser General Public -   License along with the GNU C Library; if not, see -   <http://www.gnu.org/licenses/>.  */ - -#include <atomic.h> - - -/* Mutex lock counter: -   bit 31 clear means unlocked; -   bit 31 set means locked. - -   All code that looks at bit 31 first increases the 'number of -   interested threads' usage counter, which is in bits 0-30. - -   All negative mutex values indicate that the mutex is still locked.  */ - - -static inline void -__generic_mutex_lock (int *mutex) -{ -  unsigned int v; - -  /* Bit 31 was clear, we got the mutex.  (this is the fastpath).  */ -  if (atomic_bit_test_set (mutex, 31) == 0) -    return; - -  atomic_increment (mutex); - -  while (1) -    { -      if (atomic_bit_test_set (mutex, 31) == 0) -	{ -	  atomic_decrement (mutex); -	  return; -	} - -      /* We have to wait now. First make sure the futex value we are -	 monitoring is truly negative (i.e. locked). */ -      v = *mutex; -      if (v >= 0) -	continue; - -      lll_futex_wait (mutex, v, -		      // XYZ check mutex flag -		      LLL_SHARED); -    } -} - - -static inline void -__generic_mutex_unlock (int *mutex) -{ -  /* Adding 0x80000000 to the counter results in 0 if and only if -     there are not other interested threads - we can return (this is -     the fastpath).  */ -  if (atomic_add_zero (mutex, 0x80000000)) -    return; - -  /* There are other threads waiting for this mutex, wake one of them -     up.  */ -  lll_futex_wake (mutex, 1, -		  // XYZ check mutex flag -		  LLL_SHARED); -} - - -#define lll_mutex_lock(futex) __generic_mutex_lock (&(futex)) -#define lll_mutex_unlock(futex) __generic_mutex_unlock (&(futex)) diff --git a/libpthread/nptl/sysdeps/unix/sysv/linux/aarch64/lowlevellock.h b/libpthread/nptl/sysdeps/unix/sysv/linux/aarch64/lowlevellock.h deleted file mode 100644 index 6b0e51e99..000000000 --- a/libpthread/nptl/sysdeps/unix/sysv/linux/aarch64/lowlevellock.h +++ /dev/null @@ -1,323 +0,0 @@ -/* Copyright (C) 2005-2013 Free Software Foundation, Inc. - -   The GNU C Library is free software; you can redistribute it and/or -   modify it under the terms of the GNU Lesser General Public -   License as published by the Free Software Foundation; either -   version 2.1 of the License, or (at your option) any later version. - -   The GNU C Library is distributed in the hope that it will be useful, -   but WITHOUT ANY WARRANTY; without even the implied warranty of -   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.	 See the GNU -   Lesser General Public License for more details. - -   You should have received a copy of the GNU Lesser General Public -   License along with the GNU C Library.  If not, see -   <http://www.gnu.org/licenses/>.  */ - -#ifndef _LOWLEVELLOCK_H -#define _LOWLEVELLOCK_H	1 - -#include <time.h> -#include <sys/param.h> -#include <bits/pthreadtypes.h> -#include <atomic.h> -#include <sysdep.h> -#include <bits/kernel-features.h> - - -#define FUTEX_WAIT		0 -#define FUTEX_WAKE		1 -#define FUTEX_REQUEUE		3 -#define FUTEX_CMP_REQUEUE	4 -#define FUTEX_WAKE_OP		5 -#define FUTEX_OP_CLEAR_WAKE_IF_GT_ONE	((4 << 24) | 1) -#define FUTEX_LOCK_PI		6 -#define FUTEX_UNLOCK_PI		7 -#define FUTEX_TRYLOCK_PI	8 -#define FUTEX_WAIT_BITSET	9 -#define FUTEX_WAKE_BITSET	10 -#define FUTEX_WAIT_REQUEUE_PI   11 -#define FUTEX_CMP_REQUEUE_PI    12 -#define FUTEX_PRIVATE_FLAG	128 -#define FUTEX_CLOCK_REALTIME	256 - -#define FUTEX_BITSET_MATCH_ANY	0xffffffff - -/* Values for 'private' parameter of locking macros.  Yes, the -   definition seems to be backwards.  But it is not.  The bit will be -   reversed before passing to the system call.  */ -#define LLL_PRIVATE	0 -#define LLL_SHARED	FUTEX_PRIVATE_FLAG - - -#if !defined NOT_IN_libc || defined IS_IN_rtld -/* In libc.so or ld.so all futexes are private.  */ -# ifdef __ASSUME_PRIVATE_FUTEX -#  define __lll_private_flag(fl, private) \ -  ((fl) | FUTEX_PRIVATE_FLAG) -# else -#  define __lll_private_flag(fl, private) \ -  ((fl) | THREAD_GETMEM (THREAD_SELF, header.private_futex)) -# endif -#else -# ifdef __ASSUME_PRIVATE_FUTEX -#  define __lll_private_flag(fl, private) \ -  (((fl) | FUTEX_PRIVATE_FLAG) ^ (private)) -# else -#  define __lll_private_flag(fl, private) \ -  (__builtin_constant_p (private)					      \ -   ? ((private) == 0							      \ -      ? ((fl) | THREAD_GETMEM (THREAD_SELF, header.private_futex))	      \ -      : (fl))								      \ -   : ((fl) | (((private) ^ FUTEX_PRIVATE_FLAG)				      \ -	      & THREAD_GETMEM (THREAD_SELF, header.private_futex)))) -# endif -#endif - - -#define lll_futex_wait(futexp, val, private) \ -  lll_futex_timed_wait(futexp, val, NULL, private) - -#define lll_futex_timed_wait(futexp, val, timespec, private) \ -  ({									      \ -    long int __ret;							      \ -    INTERNAL_SYSCALL_DECL (__err);					      \ -    __ret = INTERNAL_SYSCALL (futex, __err, 4, (futexp),		      \ -			      __lll_private_flag (FUTEX_WAIT, private),	      \ -			      (val), (timespec));			      \ -    __ret;								      \ -  }) - -#define lll_futex_timed_wait_bitset(futexp, val, timespec, clockbit, private) \ -  ({									\ -    long int __ret;							\ -    INTERNAL_SYSCALL_DECL (__err);					\ -    int __op = FUTEX_WAIT_BITSET | clockbit;				\ -    __ret = INTERNAL_SYSCALL (futex, __err, 6, (futexp),		\ -			      __lll_private_flag (__op, private),	\ -			      (val), (timespec), NULL /* Unused.  */,	\ -			      FUTEX_BITSET_MATCH_ANY);			\ -    __ret;								\ -  }) - -#define lll_futex_wake(futexp, nr, private) \ -  ({									      \ -    long int __ret;							      \ -    INTERNAL_SYSCALL_DECL (__err);					      \ -    __ret = INTERNAL_SYSCALL (futex, __err, 4, (futexp),		      \ -			      __lll_private_flag (FUTEX_WAKE, private),	      \ -			      (nr), 0);					      \ -    __ret;								      \ -  }) - -#define lll_robust_dead(futexv, private) \ -  do									      \ -    {									      \ -      int *__futexp = &(futexv);					      \ -      atomic_or (__futexp, FUTEX_OWNER_DIED);				      \ -      lll_futex_wake (__futexp, 1, private);				      \ -    }									      \ -  while (0) - -/* Returns non-zero if error happened, zero if success.  */ -#define lll_futex_requeue(futexp, nr_wake, nr_move, mutex, val, private) \ -  ({									      \ -    long int __ret;							      \ -    INTERNAL_SYSCALL_DECL (__err);					      \ -    __ret = INTERNAL_SYSCALL (futex, __err, 6, (futexp),		      \ -			      __lll_private_flag (FUTEX_CMP_REQUEUE, private),\ -			      (nr_wake), (nr_move), (mutex), (val));	      \ -    INTERNAL_SYSCALL_ERROR_P (__ret, __err);				      \ -  }) - - -/* Returns non-zero if error happened, zero if success.  */ -#define lll_futex_wake_unlock(futexp, nr_wake, nr_wake2, futexp2, private) \ -  ({									      \ -    long int __ret;							      \ -    INTERNAL_SYSCALL_DECL (__err);					      \ -    __ret = INTERNAL_SYSCALL (futex, __err, 6, (futexp),		      \ -			      __lll_private_flag (FUTEX_WAKE_OP, private),    \ -			      (nr_wake), (nr_wake2), (futexp2),		      \ -			      FUTEX_OP_CLEAR_WAKE_IF_GT_ONE);		      \ -    INTERNAL_SYSCALL_ERROR_P (__ret, __err);				      \ -  }) - -/* Priority Inheritance support.  */ -#define lll_futex_wait_requeue_pi(futexp, val, mutex, private) \ -  lll_futex_timed_wait_requeue_pi (futexp, val, NULL, 0, mutex, private) - -#define lll_futex_timed_wait_requeue_pi(futexp, val, timespec, clockbit,      \ -					mutex, private)			      \ -  ({									      \ -    INTERNAL_SYSCALL_DECL (__err);					      \ -    int __op = FUTEX_WAIT_REQUEUE_PI | clockbit;			      \ -									      \ -    INTERNAL_SYSCALL (futex, __err, 5, (futexp),			      \ -		      __lll_private_flag (__op, private),		      \ -		      (val), (timespec), mutex); 			      \ -  }) - -#define lll_futex_cmp_requeue_pi(futexp, nr_wake, nr_move, mutex, val, priv)  \ -  ({									      \ -    INTERNAL_SYSCALL_DECL (__err);					      \ -    long int __ret;							      \ -									      \ -    __ret = INTERNAL_SYSCALL (futex, __err, 6, (futexp),		      \ -			      __lll_private_flag (FUTEX_CMP_REQUEUE_PI, priv),\ -			      (nr_wake), (nr_move), (mutex), (val));	      \ -    INTERNAL_SYSCALL_ERROR_P (__ret, __err);				      \ -  }) - - -#define lll_trylock(lock)	\ -  atomic_compare_and_exchange_val_acq(&(lock), 1, 0) - -#define lll_cond_trylock(lock)	\ -  atomic_compare_and_exchange_val_acq(&(lock), 2, 0) - -#define __lll_robust_trylock(futex, id) \ -  (atomic_compare_and_exchange_val_acq (futex, id, 0) != 0) -#define lll_robust_trylock(lock, id) \ -  __lll_robust_trylock (&(lock), id) - -extern void __lll_lock_wait_private (int *futex) attribute_hidden; -extern void __lll_lock_wait (int *futex, int private) attribute_hidden; -extern int __lll_robust_lock_wait (int *futex, int private) attribute_hidden; - -#define __lll_lock(futex, private)					      \ -  ((void) ({								      \ -    int *__futex = (futex);						      \ -    if (__builtin_expect (atomic_compare_and_exchange_val_acq (__futex,       \ -								1, 0), 0))    \ -      {									      \ -	if (__builtin_constant_p (private) && (private) == LLL_PRIVATE)	      \ -	  __lll_lock_wait_private (__futex);				      \ -	else								      \ -	  __lll_lock_wait (__futex, private);				      \ -      }									      \ -  })) -#define lll_lock(futex, private) __lll_lock (&(futex), private) - - -#define __lll_robust_lock(futex, id, private)				      \ -  ({									      \ -    int *__futex = (futex);						      \ -    int __val = 0;							      \ -									      \ -    if (__builtin_expect (atomic_compare_and_exchange_bool_acq (__futex, id,  \ -								0), 0))	      \ -      __val = __lll_robust_lock_wait (__futex, private);		      \ -    __val;								      \ -  }) -#define lll_robust_lock(futex, id, private) \ -  __lll_robust_lock (&(futex), id, private) - - -#define __lll_cond_lock(futex, private)					      \ -  ((void) ({								      \ -    int *__futex = (futex);						      \ -    if (__builtin_expect (atomic_exchange_acq (__futex, 2), 0))		      \ -      __lll_lock_wait (__futex, private);				      \ -  })) -#define lll_cond_lock(futex, private) __lll_cond_lock (&(futex), private) - - -#define lll_robust_cond_lock(futex, id, private) \ -  __lll_robust_lock (&(futex), (id) | FUTEX_WAITERS, private) - - -extern int __lll_timedlock_wait (int *futex, const struct timespec *, -				 int private) attribute_hidden; -extern int __lll_robust_timedlock_wait (int *futex, const struct timespec *, -					int private) attribute_hidden; - -#define __lll_timedlock(futex, abstime, private)			      \ -  ({									      \ -     int *__futex = (futex);						      \ -     int __val = 0;							      \ -									      \ -     if (__builtin_expect (atomic_exchange_acq (__futex, 1), 0))	      \ -       __val = __lll_timedlock_wait (__futex, abstime, private);	      \ -     __val;								      \ -  }) -#define lll_timedlock(futex, abstime, private) \ -  __lll_timedlock (&(futex), abstime, private) - - -#define __lll_robust_timedlock(futex, abstime, id, private)		      \ -  ({									      \ -    int *__futex = (futex);						      \ -    int __val = 0;							      \ -									      \ -    if (__builtin_expect (atomic_compare_and_exchange_bool_acq (__futex, id,  \ -								0), 0))	      \ -      __val = __lll_robust_timedlock_wait (__futex, abstime, private);	      \ -    __val;								      \ -  }) -#define lll_robust_timedlock(futex, abstime, id, private) \ -  __lll_robust_timedlock (&(futex), abstime, id, private) - - -#define __lll_unlock(futex, private) \ -  (void)							\ -    ({ int *__futex = (futex);					\ -       int __oldval = atomic_exchange_rel (__futex, 0);		\ -       if (__builtin_expect (__oldval > 1, 0))			\ -	 lll_futex_wake (__futex, 1, private);			\ -       lll_futex_wake (__futex, 1, private);			\ -    }) -#define lll_unlock(futex, private) __lll_unlock(&(futex), private) - - -#define __lll_robust_unlock(futex, private) \ -  (void)							\ -    ({ int *__futex = (futex);					\ -       int __oldval = atomic_exchange_rel (__futex, 0);		\ -       if (__builtin_expect (__oldval & FUTEX_WAITERS, 0))	\ -	 lll_futex_wake (__futex, 1, private);			\ -       lll_futex_wake (__futex, 1, private);			\ -    }) -#define lll_robust_unlock(futex, private) \ -  __lll_robust_unlock(&(futex), private) - - -#define lll_islocked(futex) \ -  (futex != 0) - - -/* Our internal lock implementation is identical to the binary-compatible -   mutex implementation. */ - -/* Initializers for lock.  */ -#define LLL_LOCK_INITIALIZER		(0) -#define LLL_LOCK_INITIALIZER_LOCKED	(1) - -/* The states of a lock are: -    0  -  untaken -    1  -  taken by one user -   >1  -  taken by more users */ - -/* The kernel notifies a process which uses CLONE_CHILD_CLEARTID via futex -   wakeup when the clone terminates.  The memory location contains the -   thread ID while the clone is running and is reset to zero -   afterwards.	*/ -#define lll_wait_tid(tid) \ -  do {					\ -    __typeof (tid) __tid;		\ -    while ((__tid = (tid)) != 0)	\ -      lll_futex_wait (&(tid), __tid, LLL_SHARED);\ -  } while (0) - -extern int __lll_timedwait_tid (int *, const struct timespec *) -     attribute_hidden; - -#define lll_timedwait_tid(tid, abstime) \ -  ({							\ -    int __res = 0;					\ -    if ((tid) != 0)					\ -      __res = __lll_timedwait_tid (&(tid), (abstime));	\ -    __res;						\ -  }) - -#endif	/* lowlevellock.h */ diff --git a/libpthread/nptl/sysdeps/unix/sysv/linux/alpha/lowlevellock.h b/libpthread/nptl/sysdeps/unix/sysv/linux/alpha/lowlevellock.h deleted file mode 100644 index b09340f22..000000000 --- a/libpthread/nptl/sysdeps/unix/sysv/linux/alpha/lowlevellock.h +++ /dev/null @@ -1,283 +0,0 @@ -/* Copyright (C) 2003, 2004, 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 -   modify it under the terms of the GNU Lesser General Public -   License as published by the Free Software Foundation; either -   version 2.1 of the License, or (at your option) any later version. - -   The GNU C Library is distributed in the hope that it will be useful, -   but WITHOUT ANY WARRANTY; without even the implied warranty of -   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.	 See the GNU -   Lesser General Public License for more details. - -   You should have received a copy of the GNU Lesser General Public -   License along with the GNU C Library; see the file COPYING.LIB.  If -   not, see <http://www.gnu.org/licenses/>.  */ - -#ifndef _LOWLEVELLOCK_H -#define _LOWLEVELLOCK_H	1 - -#include <time.h> -#include <sys/param.h> -#include <bits/pthreadtypes.h> -#include <atomic.h> -#include <sysdep.h> -#include <bits/kernel-features.h> - - -#define FUTEX_WAIT		0 -#define FUTEX_WAKE		1 -#define FUTEX_REQUEUE		3 -#define FUTEX_CMP_REQUEUE	4 -#define FUTEX_WAKE_OP		5 -#define FUTEX_OP_CLEAR_WAKE_IF_GT_ONE	((4 << 24) | 1) -#define FUTEX_LOCK_PI		6 -#define FUTEX_UNLOCK_PI		7 -#define FUTEX_TRYLOCK_PI	8 -#define FUTEX_WAIT_BITSET	9 -#define FUTEX_WAKE_BITSET	10 -#define FUTEX_PRIVATE_FLAG	128 -#define FUTEX_CLOCK_REALTIME	256 - -#define FUTEX_BITSET_MATCH_ANY	0xffffffff - -/* Values for 'private' parameter of locking macros.  Yes, the -   definition seems to be backwards.  But it is not.  The bit will be -   reversed before passing to the system call.  */ -#define LLL_PRIVATE	0 -#define LLL_SHARED	FUTEX_PRIVATE_FLAG - - -#if !defined NOT_IN_libc || defined IS_IN_rtld -/* In libc.so or ld.so all futexes are private.  */ -# ifdef __ASSUME_PRIVATE_FUTEX -#  define __lll_private_flag(fl, private) \ -  ((fl) | FUTEX_PRIVATE_FLAG) -# else -#  define __lll_private_flag(fl, private) \ -  ((fl) | THREAD_GETMEM (THREAD_SELF, header.private_futex)) -# endif -#else -# ifdef __ASSUME_PRIVATE_FUTEX -#  define __lll_private_flag(fl, private) \ -  (((fl) | FUTEX_PRIVATE_FLAG) ^ (private)) -# else -#  define __lll_private_flag(fl, private) \ -  (__builtin_constant_p (private)					      \ -   ? ((private) == 0							      \ -      ? ((fl) | THREAD_GETMEM (THREAD_SELF, header.private_futex))	      \ -      : (fl))								      \ -   : ((fl) | (((private) ^ FUTEX_PRIVATE_FLAG)				      \ -	      & THREAD_GETMEM (THREAD_SELF, header.private_futex)))) -# endif	       -#endif - - -#define lll_futex_wait(futexp, val, private) \ -  lll_futex_timed_wait (futexp, val, NULL, private) - -#define lll_futex_timed_wait(futexp, val, timespec, private) \ -  ({									      \ -    INTERNAL_SYSCALL_DECL (__err);					      \ -    long int __ret;							      \ -    __ret = INTERNAL_SYSCALL (futex, __err, 4, (futexp),		      \ -			      __lll_private_flag (FUTEX_WAIT, private),	      \ -			      (val), (timespec));			      \ -    INTERNAL_SYSCALL_ERROR_P (__ret, __err)? -__ret : __ret;		      \ -  }) - -#define lll_futex_wake(futexp, nr, private) \ -  ({									      \ -    INTERNAL_SYSCALL_DECL (__err);					      \ -    long int __ret;							      \ -    __ret = INTERNAL_SYSCALL (futex, __err, 4, (futexp),		      \ -			      __lll_private_flag (FUTEX_WAKE, private),	      \ -			      (nr), 0);					      \ -    INTERNAL_SYSCALL_ERROR_P (__ret, __err)? -__ret : __ret;		      \ -  }) - -#define lll_robust_dead(futexv, private) \ -  do									      \ -    {									      \ -      int *__futexp = &(futexv);					      \ -      atomic_or (__futexp, FUTEX_OWNER_DIED);				      \ -      lll_futex_wake (__futexp, 1, private);				      \ -    }									      \ -  while (0) - -/* Returns non-zero if error happened, zero if success.  */ -#define lll_futex_requeue(futexp, nr_wake, nr_move, mutex, val, private) \ -  ({									      \ -    INTERNAL_SYSCALL_DECL (__err);					      \ -    long int __ret;							      \ -    __ret = INTERNAL_SYSCALL (futex, __err, 6, (futexp),		      \ -			      __lll_private_flag (FUTEX_CMP_REQUEUE, private),\ -			      (nr_wake), (nr_move), (mutex), (val));	      \ -    INTERNAL_SYSCALL_ERROR_P (__ret, __err);				      \ -  }) - -/* Returns non-zero if error happened, zero if success.  */ -#define lll_futex_wake_unlock(futexp, nr_wake, nr_wake2, futexp2, private) \ -  ({									      \ -    INTERNAL_SYSCALL_DECL (__err);					      \ -    long int __ret;							      \ -    __ret = INTERNAL_SYSCALL (futex, __err, 6, (futexp),		      \ -			      __lll_private_flag (FUTEX_WAKE_OP, private),    \ -			      (nr_wake), (nr_wake2), (futexp2),		      \ -			      FUTEX_OP_CLEAR_WAKE_IF_GT_ONE);		      \ -    INTERNAL_SYSCALL_ERROR_P (__ret, __err);				      \ -  }) - - - - -static inline int __attribute__((always_inline)) -__lll_trylock(int *futex) -{ -  return atomic_compare_and_exchange_val_acq (futex, 1, 0) != 0; -} -#define lll_trylock(lock)	__lll_trylock (&(lock)) - - -static inline int __attribute__((always_inline)) -__lll_cond_trylock(int *futex) -{ -  return atomic_compare_and_exchange_val_acq (futex, 2, 0) != 0; -} -#define lll_cond_trylock(lock)	__lll_cond_trylock (&(lock)) - - -static inline int __attribute__((always_inline)) -__lll_robust_trylock(int *futex, int id) -{ -  return atomic_compare_and_exchange_val_acq (futex, id, 0) != 0; -} -#define lll_robust_trylock(lock, id) \ -  __lll_robust_trylock (&(lock), id) - -extern void __lll_lock_wait_private (int *futex) attribute_hidden; -extern void __lll_lock_wait (int *futex, int private) attribute_hidden; -extern int __lll_robust_lock_wait (int *futex, int private) attribute_hidden; - -static inline void __attribute__((always_inline)) -__lll_lock(int *futex, int private) -{ -  if (atomic_compare_and_exchange_bool_acq (futex, 1, 0) != 0) -    { -      if (__builtin_constant_p (private) && private == LLL_PRIVATE) -	__lll_lock_wait_private (futex); -      else -	__lll_lock_wait (futex, private); -    } -} -#define lll_lock(futex, private) __lll_lock (&(futex), private) - - -static inline int __attribute__ ((always_inline)) -__lll_robust_lock (int *futex, int id, int private) -{ -  int result = 0; -  if (atomic_compare_and_exchange_bool_acq (futex, id, 0) != 0) -    result = __lll_robust_lock_wait (futex, private); -  return result; -} -#define lll_robust_lock(futex, id, private) \ -  __lll_robust_lock (&(futex), id, private) - - -static inline void __attribute__ ((always_inline)) -__lll_cond_lock (int *futex, int private) -{ -  if (atomic_compare_and_exchange_bool_acq (futex, 2, 0) != 0) -    __lll_lock_wait (futex, private); -} -#define lll_cond_lock(futex, private) __lll_cond_lock (&(futex), private) - - -#define lll_robust_cond_lock(futex, id, private) \ -  __lll_robust_lock (&(futex), (id) | FUTEX_WAITERS, private) - - -extern int __lll_timedlock_wait (int *futex, const struct timespec *, -				 int private) attribute_hidden; -extern int __lll_robust_timedlock_wait (int *futex, const struct timespec *, -					int private) attribute_hidden; - -static inline int __attribute__ ((always_inline)) -__lll_timedlock (int *futex, const struct timespec *abstime, int private) -{ -  int result = 0; -  if (atomic_compare_and_exchange_bool_acq (futex, 1, 0) != 0) -    result = __lll_timedlock_wait (futex, abstime, private); -  return result; -} -#define lll_timedlock(futex, abstime, private) \ -  __lll_timedlock (&(futex), abstime, private) - - -static inline int __attribute__ ((always_inline)) -__lll_robust_timedlock (int *futex, const struct timespec *abstime, -			int id, int private) -{ -  int result = 0; -  if (atomic_compare_and_exchange_bool_acq (futex, id, 0) != 0) -    result = __lll_robust_timedlock_wait (futex, abstime, private); -  return result; -} -#define lll_robust_timedlock(futex, abstime, id, private) \ -  __lll_robust_timedlock (&(futex), abstime, id, private) - - -#define __lll_unlock(futex, private) \ -  (void)							\ -    ({ int *__futex = (futex);					\ -       int __oldval = atomic_exchange_rel (__futex, 0);		\ -       if (__builtin_expect (__oldval > 1, 0))			\ -	 lll_futex_wake (__futex, 1, private);			\ -    }) -#define lll_unlock(futex, private) __lll_unlock(&(futex), private) - - -#define __lll_robust_unlock(futex, private) \ -  (void)							\ -    ({ int *__futex = (futex);					\ -       int __oldval = atomic_exchange_rel (__futex, 0);		\ -       if (__builtin_expect (__oldval & FUTEX_WAITERS, 0))	\ -	 lll_futex_wake (__futex, 1, private);			\ -    }) -#define lll_robust_unlock(futex, private) \ -  __lll_robust_unlock(&(futex), private) - - -#define lll_islocked(futex) \ -  (futex != 0) - -/* Initializers for lock.  */ -#define LLL_LOCK_INITIALIZER		(0) -#define LLL_LOCK_INITIALIZER_LOCKED	(1) - - -/* The kernel notifies a process which uses CLONE_CLEARTID via futex -   wakeup when the clone terminates.  The memory location contains the -   thread ID while the clone is running and is reset to zero -   afterwards.	*/ -#define lll_wait_tid(tid) \ -  do {							\ -    __typeof (tid) __tid;				\ -    while ((__tid = (tid)) != 0)			\ -      lll_futex_wait (&(tid), __tid, LLL_SHARED);	\ -  } while (0) - -extern int __lll_timedwait_tid (int *, const struct timespec *) -     attribute_hidden; - -#define lll_timedwait_tid(tid, abstime) \ -  ({							\ -    int __res = 0;					\ -    if ((tid) != 0)					\ -      __res = __lll_timedwait_tid (&(tid), (abstime));	\ -    __res;						\ -  }) - -#endif	/* lowlevellock.h */ diff --git a/libpthread/nptl/sysdeps/unix/sysv/linux/arc/lowlevellock.h b/libpthread/nptl/sysdeps/unix/sysv/linux/arc/lowlevellock.h deleted file mode 100644 index 44a1ac01d..000000000 --- a/libpthread/nptl/sysdeps/unix/sysv/linux/arc/lowlevellock.h +++ /dev/null @@ -1,278 +0,0 @@ -/* Copyright (C) 2005, 2006, 2007, 2008, 2009 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 -   modify it under the terms of the GNU Lesser General Public -   License as published by the Free Software Foundation; either -   version 2.1 of the License, or (at your option) any later version. - -   The GNU C Library is distributed in the hope that it will be useful, -   but WITHOUT ANY WARRANTY; without even the implied warranty of -   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.	 See the GNU -   Lesser General Public License for more details. - -   You should have received a copy of the GNU Lesser General Public -   License along with the GNU C Library; see the file COPYING.LIB.  If -   not, see <http://www.gnu.org/licenses/>.  */ - -#ifndef _LOWLEVELLOCK_H -#define _LOWLEVELLOCK_H	1 - -#include <time.h> -#include <sys/param.h> -#include <bits/pthreadtypes.h> -#include <atomic.h> -#include <sysdep.h> -#include <bits/kernel-features.h> - -#define FUTEX_WAIT		0 -#define FUTEX_WAKE		1 -#define FUTEX_REQUEUE		3 -#define FUTEX_CMP_REQUEUE	4 -#define FUTEX_WAKE_OP		5 -#define FUTEX_OP_CLEAR_WAKE_IF_GT_ONE	((4 << 24) | 1) -#define FUTEX_LOCK_PI		6 -#define FUTEX_UNLOCK_PI		7 -#define FUTEX_TRYLOCK_PI	8 -#define FUTEX_WAIT_BITSET	9 -#define FUTEX_WAKE_BITSET	10 -#define FUTEX_PRIVATE_FLAG	128 -#define FUTEX_CLOCK_REALTIME	256 - -#define FUTEX_BITSET_MATCH_ANY	0xffffffff - -/* Values for 'private' parameter of locking macros.  Yes, the -   definition seems to be backwards.  But it is not.  The bit will be -   reversed before passing to the system call.  */ -#define LLL_PRIVATE	0 -#define LLL_SHARED	FUTEX_PRIVATE_FLAG - - -#if !defined NOT_IN_libc || defined IS_IN_rtld -/* In libc.so or ld.so all futexes are private.  */ -# ifdef __ASSUME_PRIVATE_FUTEX -#  define __lll_private_flag(fl, private) \ -  ((fl) | FUTEX_PRIVATE_FLAG) -# else -#  define __lll_private_flag(fl, private) \ -  ((fl) | THREAD_GETMEM (THREAD_SELF, header.private_futex)) -# endif -#else -# ifdef __ASSUME_PRIVATE_FUTEX -#  define __lll_private_flag(fl, private) \ -  (((fl) | FUTEX_PRIVATE_FLAG) ^ (private)) -# else -#  define __lll_private_flag(fl, private) \ -  (__builtin_constant_p (private)					      \ -   ? ((private) == 0							      \ -      ? ((fl) | THREAD_GETMEM (THREAD_SELF, header.private_futex))	      \ -      : (fl))								      \ -   : ((fl) | (((private) ^ FUTEX_PRIVATE_FLAG)				      \ -	      & THREAD_GETMEM (THREAD_SELF, header.private_futex)))) -# endif -#endif - - -#define lll_futex_wait(futexp, val, private) \ -  lll_futex_timed_wait(futexp, val, NULL, private) - -#define lll_futex_timed_wait(futexp, val, timespec, private) \ -  ({									      \ -    INTERNAL_SYSCALL_DECL (__err);					      \ -    long int __ret;							      \ -    __ret = INTERNAL_SYSCALL (futex, __err, 4, (futexp),		      \ -			      __lll_private_flag (FUTEX_WAIT, private),	      \ -			      (val), (timespec));			      \ -    __ret;								      \ -  }) - -#define lll_futex_wake(futexp, nr, private) \ -  ({									      \ -    INTERNAL_SYSCALL_DECL (__err);					      \ -    long int __ret;							      \ -    __ret = INTERNAL_SYSCALL (futex, __err, 4, (futexp),		      \ -			      __lll_private_flag (FUTEX_WAKE, private),	      \ -			      (nr), 0);					      \ -    __ret;								      \ -  }) - -#define lll_robust_dead(futexv, private) \ -  do									      \ -    {									      \ -      int *__futexp = &(futexv);					      \ -      atomic_or (__futexp, FUTEX_OWNER_DIED);				      \ -      lll_futex_wake (__futexp, 1, private);				      \ -    }									      \ -  while (0) - -/* Returns non-zero if error happened, zero if success.  */ -#define lll_futex_requeue(futexp, nr_wake, nr_move, mutex, val, private) \ -  ({									      \ -    INTERNAL_SYSCALL_DECL (__err);					      \ -    long int __ret;							      \ -    __ret = INTERNAL_SYSCALL (futex, __err, 6, (futexp),		      \ -			      __lll_private_flag (FUTEX_CMP_REQUEUE, private),\ -			      (nr_wake), (nr_move), (mutex), (val));	      \ -    INTERNAL_SYSCALL_ERROR_P (__ret, __err);				      \ -  }) - - -/* Returns non-zero if error happened, zero if success.  */ -#define lll_futex_wake_unlock(futexp, nr_wake, nr_wake2, futexp2, private) \ -  ({									      \ -    INTERNAL_SYSCALL_DECL (__err);					      \ -    long int __ret;							      \ -    __ret = INTERNAL_SYSCALL (futex, __err, 6, (futexp),		      \ -			      __lll_private_flag (FUTEX_WAKE_OP, private),    \ -			      (nr_wake), (nr_wake2), (futexp2),		      \ -			      FUTEX_OP_CLEAR_WAKE_IF_GT_ONE);		      \ -    INTERNAL_SYSCALL_ERROR_P (__ret, __err);				      \ -  }) - - -#define lll_trylock(lock)	\ -  atomic_compare_and_exchange_val_acq(&(lock), 1, 0) - -#define lll_cond_trylock(lock)	\ -  atomic_compare_and_exchange_val_acq(&(lock), 2, 0) - -#define __lll_robust_trylock(futex, id) \ -  (atomic_compare_and_exchange_val_acq (futex, id, 0) != 0) -#define lll_robust_trylock(lock, id) \ -  __lll_robust_trylock (&(lock), id) - -extern void __lll_lock_wait_private (int *futex) attribute_hidden; -extern void __lll_lock_wait (int *futex, int private) attribute_hidden; -extern int __lll_robust_lock_wait (int *futex, int private) attribute_hidden; - -#define __lll_lock(futex, private)					      \ -  ((void) ({								      \ -    int *__futex = (futex);						      \ -    if (unlikely(atomic_compare_and_exchange_val_acq (__futex, 1, 0)))        \ -      {									      \ -	if (__builtin_constant_p (private) && (private) == LLL_PRIVATE)	      \ -	  __lll_lock_wait_private (__futex);				      \ -	else								      \ -	  __lll_lock_wait (__futex, private);				      \ -      }									      \ -  })) -#define lll_lock(futex, private) __lll_lock (&(futex), private) - - -#define __lll_robust_lock(futex, id, private)				      \ -  ({									      \ -    int *__futex = (futex);						      \ -    int __val = 0;							      \ -									      \ -    if (unlikely(atomic_compare_and_exchange_bool_acq (__futex, id, 0)))      \ -      __val = __lll_robust_lock_wait (__futex, private);		      \ -    __val;								      \ -  }) -#define lll_robust_lock(futex, id, private) \ -  __lll_robust_lock (&(futex), id, private) - - -#define __lll_cond_lock(futex, private)					      \ -  ((void) ({								      \ -    int *__futex = (futex);						      \ -    if (unlikely(atomic_exchange_acq (__futex, 2)))			      \ -      __lll_lock_wait (__futex, private);				      \ -  })) -#define lll_cond_lock(futex, private) __lll_cond_lock (&(futex), private) - - -#define lll_robust_cond_lock(futex, id, private) \ -  __lll_robust_lock (&(futex), (id) | FUTEX_WAITERS, private) - - -extern int __lll_timedlock_wait (int *futex, const struct timespec *, -				 int private) attribute_hidden; -extern int __lll_robust_timedlock_wait (int *futex, const struct timespec *, -					int private) attribute_hidden; - -#define __lll_timedlock(futex, abstime, private)			      \ -  ({									      \ -     int *__futex = (futex);						      \ -     int __val = 0;							      \ -									      \ -     if (unlikely(atomic_exchange_acq (__futex, 1)))	                      \ -       __val = __lll_timedlock_wait (__futex, abstime, private);	      \ -     __val;								      \ -  }) -#define lll_timedlock(futex, abstime, private) \ -  __lll_timedlock (&(futex), abstime, private) - - -#define __lll_robust_timedlock(futex, abstime, id, private)		      \ -  ({									      \ -    int *__futex = (futex);						      \ -    int __val = 0;							      \ -									      \ -    if (unlikely(atomic_compare_and_exchange_bool_acq (__futex, id, 0)))      \ -      __val = __lll_robust_timedlock_wait (__futex, abstime, private);	      \ -    __val;								      \ -  }) -#define lll_robust_timedlock(futex, abstime, id, private) \ -  __lll_robust_timedlock (&(futex), abstime, id, private) - - -#define __lll_unlock(futex, private) \ -  (void)							\ -    ({ int *__futex = (futex);					\ -       int __oldval = atomic_exchange_rel (__futex, 0);		\ -       if (unlikely(__oldval > 1))			        \ -	 lll_futex_wake (__futex, 1, private);			\ -    }) -#define lll_unlock(futex, private) __lll_unlock(&(futex), private) - - -#define __lll_robust_unlock(futex, private) \ -  (void)							\ -    ({ int *__futex = (futex);					\ -       int __oldval = atomic_exchange_rel (__futex, 0);		\ -       if (unlikely(__oldval & FUTEX_WAITERS))	        	\ -	 lll_futex_wake (__futex, 1, private);			\ -    }) -#define lll_robust_unlock(futex, private) \ -  __lll_robust_unlock(&(futex), private) - - -#define lll_islocked(futex) \ -  (futex != 0) - - -/* Our internal lock implementation is identical to the binary-compatible -   mutex implementation. */ - -/* Initializers for lock.  */ -#define LLL_LOCK_INITIALIZER		(0) -#define LLL_LOCK_INITIALIZER_LOCKED	(1) - -/* The states of a lock are: -    0  -  untaken -    1  -  taken by one user -   >1  -  taken by more users */ - -/* The kernel notifies a process which uses CLONE_CLEARTID via futex -   wakeup when the clone terminates.  The memory location contains the -   thread ID while the clone is running and is reset to zero -   afterwards.	*/ -#define lll_wait_tid(tid) \ -  do {					\ -    __typeof (tid) __tid;		\ -    while ((__tid = (tid)) != 0)	\ -      lll_futex_wait (&(tid), __tid, LLL_SHARED);\ -  } while (0) - -extern int __lll_timedwait_tid (int *, const struct timespec *) -     attribute_hidden; - -#define lll_timedwait_tid(tid, abstime) \ -  ({							\ -    int __res = 0;					\ -    if ((tid) != 0)					\ -      __res = __lll_timedwait_tid (&(tid), (abstime));	\ -    __res;						\ -  }) - -#endif	/* lowlevellock.h */ diff --git a/libpthread/nptl/sysdeps/unix/sysv/linux/csky/lowlevellock.h b/libpthread/nptl/sysdeps/unix/sysv/linux/csky/lowlevellock.h deleted file mode 100644 index 0a5650318..000000000 --- a/libpthread/nptl/sysdeps/unix/sysv/linux/csky/lowlevellock.h +++ /dev/null @@ -1,281 +0,0 @@ -/* Copyright (C) 2005, 2006, 2007, 2008, 2009 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 -   modify it under the terms of the GNU Lesser General Public -   License as published by the Free Software Foundation; either -   version 2.1 of the License, or (at your option) any later version. - -   The GNU C Library is distributed in the hope that it will be useful, -   but WITHOUT ANY WARRANTY; without even the implied warranty of -   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.	 See the GNU -   Lesser General Public License for more details. - -   You should have received a copy of the GNU Lesser General Public -   License along with the GNU C Library; if not, write to the Free -   Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA -   02111-1307 USA.  */ - -#ifndef _LOWLEVELLOCK_H -#define _LOWLEVELLOCK_H	1 - -#include <time.h> -#include <sys/param.h> -#include <bits/pthreadtypes.h> -#include <atomic.h> -#include <sysdep.h> -#include <bits/kernel-features.h> - -#define FUTEX_WAIT		0 -#define FUTEX_WAKE		1 -#define FUTEX_REQUEUE		3 -#define FUTEX_CMP_REQUEUE	4 -#define FUTEX_WAKE_OP		5 -#define FUTEX_OP_CLEAR_WAKE_IF_GT_ONE	((4 << 24) | 1) -#define FUTEX_LOCK_PI		6 -#define FUTEX_UNLOCK_PI		7 -#define FUTEX_TRYLOCK_PI	8 -#define FUTEX_WAIT_BITSET	9 -#define FUTEX_WAKE_BITSET	10 -#define FUTEX_PRIVATE_FLAG	128 -#define FUTEX_CLOCK_REALTIME	256 - -#define FUTEX_BITSET_MATCH_ANY	0xffffffff - -/* Values for 'private' parameter of locking macros.  Yes, the -   definition seems to be backwards.  But it is not.  The bit will be -   reversed before passing to the system call.  */ -#define LLL_PRIVATE	0 -#define LLL_SHARED	FUTEX_PRIVATE_FLAG - - -#if !defined NOT_IN_libc || defined IS_IN_rtld -/* In libc.so or ld.so all futexes are private.  */ -# ifdef __ASSUME_PRIVATE_FUTEX -#  define __lll_private_flag(fl, private) \ -  ((fl) | FUTEX_PRIVATE_FLAG) -# else -#  define __lll_private_flag(fl, private) \ -  ((fl) | THREAD_GETMEM (THREAD_SELF, header.private_futex)) -# endif -#else -# ifdef __ASSUME_PRIVATE_FUTEX -#  define __lll_private_flag(fl, private) \ -  (((fl) | FUTEX_PRIVATE_FLAG) ^ (private)) -# else -#  define __lll_private_flag(fl, private) \ -  (__builtin_constant_p (private)					      \ -   ? ((private) == 0							      \ -      ? ((fl) | THREAD_GETMEM (THREAD_SELF, header.private_futex))	      \ -      : (fl))								      \ -   : ((fl) | (((private) ^ FUTEX_PRIVATE_FLAG)				      \ -	      & THREAD_GETMEM (THREAD_SELF, header.private_futex)))) -# endif -#endif - -#define lll_futex_wait(futexp, val, private) \ -  lll_futex_timed_wait(futexp, val, NULL, private) - -#define lll_futex_timed_wait(futexp, val, timespec, private) \ -  ({									      \ -    INTERNAL_SYSCALL_DECL (__err);					      \ -    long int __ret;							      \ -    __ret = INTERNAL_SYSCALL (futex, __err, 4, (futexp),		      \ -			      __lll_private_flag (FUTEX_WAIT, private),	      \ -			      (val), (timespec));			      \ -    __ret;								      \ -  }) - -#define lll_futex_wake(futexp, nr, private) \ -  ({									      \ -    INTERNAL_SYSCALL_DECL (__err);					      \ -    long int __ret;							      \ -    __ret = INTERNAL_SYSCALL (futex, __err, 4, (futexp),		      \ -			      __lll_private_flag (FUTEX_WAKE, private),	      \ -			      (nr), 0);					      \ -    __ret;								      \ -  }) - -#define lll_robust_dead(futexv, private) \ -  do									      \ -    {									      \ -      int *__futexp = &(futexv);					      \ -      atomic_or (__futexp, FUTEX_OWNER_DIED);				      \ -      lll_futex_wake (__futexp, 1, private);				      \ -    }									      \ -  while (0) - -/* Returns non-zero if error happened, zero if success.  */ -#define lll_futex_requeue(futexp, nr_wake, nr_move, mutex, val, private) \ -  ({									      \ -    INTERNAL_SYSCALL_DECL (__err);					      \ -    long int __ret;							      \ -    __ret = INTERNAL_SYSCALL (futex, __err, 6, (futexp),		      \ -			      __lll_private_flag (FUTEX_CMP_REQUEUE, private),\ -			      (nr_wake), (nr_move), (mutex), (val));	      \ -    INTERNAL_SYSCALL_ERROR_P (__ret, __err);				      \ -  }) - - -/* Returns non-zero if error happened, zero if success.  */ -#define lll_futex_wake_unlock(futexp, nr_wake, nr_wake2, futexp2, private) \ -  ({									      \ -    INTERNAL_SYSCALL_DECL (__err);					      \ -    long int __ret;							      \ -    __ret = INTERNAL_SYSCALL (futex, __err, 6, (futexp),		      \ -			      __lll_private_flag (FUTEX_WAKE_OP, private),    \ -			      (nr_wake), (nr_wake2), (futexp2),		      \ -			      FUTEX_OP_CLEAR_WAKE_IF_GT_ONE);		      \ -    INTERNAL_SYSCALL_ERROR_P (__ret, __err);				      \ -  }) - - -#define lll_trylock(lock)	\ -  atomic_compare_and_exchange_val_acq(&(lock), 1, 0) - -#define lll_cond_trylock(lock)	\ -  atomic_compare_and_exchange_val_acq(&(lock), 2, 0) - -#define __lll_robust_trylock(futex, id) \ -  (atomic_compare_and_exchange_val_acq (futex, id, 0) != 0) -#define lll_robust_trylock(lock, id) \ -  __lll_robust_trylock (&(lock), id) - -extern void __lll_lock_wait_private (int *futex) attribute_hidden; -extern void __lll_lock_wait (int *futex, int private) attribute_hidden; -extern int __lll_robust_lock_wait (int *futex, int private) attribute_hidden; - -#define __lll_lock(futex, private)					      \ -  ((void) ({								      \ -    int *__futex = (futex);						      \ -    if (__builtin_expect (atomic_compare_and_exchange_val_acq (__futex,       \ -								1, 0), 0))    \ -      {									      \ -	if (__builtin_constant_p (private) && (private) == LLL_PRIVATE)	      \ -	  __lll_lock_wait_private (__futex);				      \ -	else								      \ -	  __lll_lock_wait (__futex, private);				      \ -      }									      \ -  })) -#define lll_lock(futex, private) __lll_lock (&(futex), private) - - -#define __lll_robust_lock(futex, id, private)				      \ -  ({									      \ -    int *__futex = (futex);						      \ -    int __val = 0;							      \ -									      \ -    if (__builtin_expect (atomic_compare_and_exchange_bool_acq (__futex, id,  \ -								0), 0))	      \ -      __val = __lll_robust_lock_wait (__futex, private);		      \ -    __val;								      \ -  }) -#define lll_robust_lock(futex, id, private) \ -  __lll_robust_lock (&(futex), id, private) - - -#define __lll_cond_lock(futex, private)					      \ -  ((void) ({								      \ -    int *__futex = (futex);						      \ -    if (__builtin_expect (atomic_exchange_acq (__futex, 2), 0))		      \ -      __lll_lock_wait (__futex, private);				      \ -  })) -#define lll_cond_lock(futex, private) __lll_cond_lock (&(futex), private) - - -#define lll_robust_cond_lock(futex, id, private) \ -  __lll_robust_lock (&(futex), (id) | FUTEX_WAITERS, private) - - -extern int __lll_timedlock_wait (int *futex, const struct timespec *, -				 int private) attribute_hidden; -extern int __lll_robust_timedlock_wait (int *futex, const struct timespec *, -					int private) attribute_hidden; - -#define __lll_timedlock(futex, abstime, private)			      \ -  ({									      \ -     int *__futex = (futex);						      \ -     int __val = 0;							      \ -									      \ -     if (__builtin_expect (atomic_exchange_acq (__futex, 1), 0))	      \ -       __val = __lll_timedlock_wait (__futex, abstime, private);	      \ -     __val;								      \ -  }) -#define lll_timedlock(futex, abstime, private) \ -  __lll_timedlock (&(futex), abstime, private) - - -#define __lll_robust_timedlock(futex, abstime, id, private)		      \ -  ({									      \ -    int *__futex = (futex);						      \ -    int __val = 0;							      \ -									      \ -    if (__builtin_expect (atomic_compare_and_exchange_bool_acq (__futex, id,  \ -								0), 0))	      \ -      __val = __lll_robust_timedlock_wait (__futex, abstime, private);	      \ -    __val;								      \ -  }) -#define lll_robust_timedlock(futex, abstime, id, private) \ -  __lll_robust_timedlock (&(futex), abstime, id, private) - - -#define __lll_unlock(futex, private) \ -  (void)							\ -    ({ int *__futex = (futex);					\ -       int __oldval = atomic_exchange_rel (__futex, 0);		\ -       if (__builtin_expect (__oldval > 1, 0))			\ -	 lll_futex_wake (__futex, 1, private);			\ -    }) -#define lll_unlock(futex, private) __lll_unlock(&(futex), private) - - -#define __lll_robust_unlock(futex, private) \ -  (void)							\ -    ({ int *__futex = (futex);					\ -       int __oldval = atomic_exchange_rel (__futex, 0);		\ -       if (__builtin_expect (__oldval & FUTEX_WAITERS, 0))	\ -	 lll_futex_wake (__futex, 1, private);			\ -    }) -#define lll_robust_unlock(futex, private) \ -  __lll_robust_unlock(&(futex), private) - - -#define lll_islocked(futex) \ -  (futex != 0) - - -/* Our internal lock implementation is identical to the binary-compatible -   mutex implementation. */ - -/* Initializers for lock.  */ -#define LLL_LOCK_INITIALIZER		(0) -#define LLL_LOCK_INITIALIZER_LOCKED	(1) - -/* The states of a lock are: -    0  -  untaken -    1  -  taken by one user -   >1  -  taken by more users */ - -/* The kernel notifies a process which uses CLONE_CLEARTID via futex -   wakeup when the clone terminates.  The memory location contains the -   thread ID while the clone is running and is reset to zero -   afterwards.	*/ -#define lll_wait_tid(tid) \ -  do {					\ -    __typeof (tid) __tid;		\ -    while ((__tid = (tid)) != 0)	\ -      lll_futex_wait (&(tid), __tid, LLL_SHARED);\ -  } while (0) - -extern int __lll_timedwait_tid (int *, const struct timespec *) -     attribute_hidden; - -#define lll_timedwait_tid(tid, abstime) \ -  ({							\ -    int __res = 0;					\ -    if ((tid) != 0)					\ -      __res = __lll_timedwait_tid (&(tid), (abstime));	\ -    __res;						\ -  }) - -#endif	/* lowlevellock.h */ diff --git a/libpthread/nptl/sysdeps/unix/sysv/linux/arm/lowlevellock.h b/libpthread/nptl/sysdeps/unix/sysv/linux/lowlevellock.h index 116a8c272..b5b0afdf8 100644 --- a/libpthread/nptl/sysdeps/unix/sysv/linux/arm/lowlevellock.h +++ b/libpthread/nptl/sysdeps/unix/sysv/linux/lowlevellock.h @@ -1,5 +1,4 @@  /* Copyright (C) 2005, 2006, 2007, 2008, 2009 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     modify it under the terms of the GNU Lesser General Public diff --git a/libpthread/nptl/sysdeps/unix/sysv/linux/m68k/lowlevellock.h b/libpthread/nptl/sysdeps/unix/sysv/linux/m68k/lowlevellock.h deleted file mode 100644 index 0a5650318..000000000 --- a/libpthread/nptl/sysdeps/unix/sysv/linux/m68k/lowlevellock.h +++ /dev/null @@ -1,281 +0,0 @@ -/* Copyright (C) 2005, 2006, 2007, 2008, 2009 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 -   modify it under the terms of the GNU Lesser General Public -   License as published by the Free Software Foundation; either -   version 2.1 of the License, or (at your option) any later version. - -   The GNU C Library is distributed in the hope that it will be useful, -   but WITHOUT ANY WARRANTY; without even the implied warranty of -   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.	 See the GNU -   Lesser General Public License for more details. - -   You should have received a copy of the GNU Lesser General Public -   License along with the GNU C Library; if not, write to the Free -   Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA -   02111-1307 USA.  */ - -#ifndef _LOWLEVELLOCK_H -#define _LOWLEVELLOCK_H	1 - -#include <time.h> -#include <sys/param.h> -#include <bits/pthreadtypes.h> -#include <atomic.h> -#include <sysdep.h> -#include <bits/kernel-features.h> - -#define FUTEX_WAIT		0 -#define FUTEX_WAKE		1 -#define FUTEX_REQUEUE		3 -#define FUTEX_CMP_REQUEUE	4 -#define FUTEX_WAKE_OP		5 -#define FUTEX_OP_CLEAR_WAKE_IF_GT_ONE	((4 << 24) | 1) -#define FUTEX_LOCK_PI		6 -#define FUTEX_UNLOCK_PI		7 -#define FUTEX_TRYLOCK_PI	8 -#define FUTEX_WAIT_BITSET	9 -#define FUTEX_WAKE_BITSET	10 -#define FUTEX_PRIVATE_FLAG	128 -#define FUTEX_CLOCK_REALTIME	256 - -#define FUTEX_BITSET_MATCH_ANY	0xffffffff - -/* Values for 'private' parameter of locking macros.  Yes, the -   definition seems to be backwards.  But it is not.  The bit will be -   reversed before passing to the system call.  */ -#define LLL_PRIVATE	0 -#define LLL_SHARED	FUTEX_PRIVATE_FLAG - - -#if !defined NOT_IN_libc || defined IS_IN_rtld -/* In libc.so or ld.so all futexes are private.  */ -# ifdef __ASSUME_PRIVATE_FUTEX -#  define __lll_private_flag(fl, private) \ -  ((fl) | FUTEX_PRIVATE_FLAG) -# else -#  define __lll_private_flag(fl, private) \ -  ((fl) | THREAD_GETMEM (THREAD_SELF, header.private_futex)) -# endif -#else -# ifdef __ASSUME_PRIVATE_FUTEX -#  define __lll_private_flag(fl, private) \ -  (((fl) | FUTEX_PRIVATE_FLAG) ^ (private)) -# else -#  define __lll_private_flag(fl, private) \ -  (__builtin_constant_p (private)					      \ -   ? ((private) == 0							      \ -      ? ((fl) | THREAD_GETMEM (THREAD_SELF, header.private_futex))	      \ -      : (fl))								      \ -   : ((fl) | (((private) ^ FUTEX_PRIVATE_FLAG)				      \ -	      & THREAD_GETMEM (THREAD_SELF, header.private_futex)))) -# endif -#endif - -#define lll_futex_wait(futexp, val, private) \ -  lll_futex_timed_wait(futexp, val, NULL, private) - -#define lll_futex_timed_wait(futexp, val, timespec, private) \ -  ({									      \ -    INTERNAL_SYSCALL_DECL (__err);					      \ -    long int __ret;							      \ -    __ret = INTERNAL_SYSCALL (futex, __err, 4, (futexp),		      \ -			      __lll_private_flag (FUTEX_WAIT, private),	      \ -			      (val), (timespec));			      \ -    __ret;								      \ -  }) - -#define lll_futex_wake(futexp, nr, private) \ -  ({									      \ -    INTERNAL_SYSCALL_DECL (__err);					      \ -    long int __ret;							      \ -    __ret = INTERNAL_SYSCALL (futex, __err, 4, (futexp),		      \ -			      __lll_private_flag (FUTEX_WAKE, private),	      \ -			      (nr), 0);					      \ -    __ret;								      \ -  }) - -#define lll_robust_dead(futexv, private) \ -  do									      \ -    {									      \ -      int *__futexp = &(futexv);					      \ -      atomic_or (__futexp, FUTEX_OWNER_DIED);				      \ -      lll_futex_wake (__futexp, 1, private);				      \ -    }									      \ -  while (0) - -/* Returns non-zero if error happened, zero if success.  */ -#define lll_futex_requeue(futexp, nr_wake, nr_move, mutex, val, private) \ -  ({									      \ -    INTERNAL_SYSCALL_DECL (__err);					      \ -    long int __ret;							      \ -    __ret = INTERNAL_SYSCALL (futex, __err, 6, (futexp),		      \ -			      __lll_private_flag (FUTEX_CMP_REQUEUE, private),\ -			      (nr_wake), (nr_move), (mutex), (val));	      \ -    INTERNAL_SYSCALL_ERROR_P (__ret, __err);				      \ -  }) - - -/* Returns non-zero if error happened, zero if success.  */ -#define lll_futex_wake_unlock(futexp, nr_wake, nr_wake2, futexp2, private) \ -  ({									      \ -    INTERNAL_SYSCALL_DECL (__err);					      \ -    long int __ret;							      \ -    __ret = INTERNAL_SYSCALL (futex, __err, 6, (futexp),		      \ -			      __lll_private_flag (FUTEX_WAKE_OP, private),    \ -			      (nr_wake), (nr_wake2), (futexp2),		      \ -			      FUTEX_OP_CLEAR_WAKE_IF_GT_ONE);		      \ -    INTERNAL_SYSCALL_ERROR_P (__ret, __err);				      \ -  }) - - -#define lll_trylock(lock)	\ -  atomic_compare_and_exchange_val_acq(&(lock), 1, 0) - -#define lll_cond_trylock(lock)	\ -  atomic_compare_and_exchange_val_acq(&(lock), 2, 0) - -#define __lll_robust_trylock(futex, id) \ -  (atomic_compare_and_exchange_val_acq (futex, id, 0) != 0) -#define lll_robust_trylock(lock, id) \ -  __lll_robust_trylock (&(lock), id) - -extern void __lll_lock_wait_private (int *futex) attribute_hidden; -extern void __lll_lock_wait (int *futex, int private) attribute_hidden; -extern int __lll_robust_lock_wait (int *futex, int private) attribute_hidden; - -#define __lll_lock(futex, private)					      \ -  ((void) ({								      \ -    int *__futex = (futex);						      \ -    if (__builtin_expect (atomic_compare_and_exchange_val_acq (__futex,       \ -								1, 0), 0))    \ -      {									      \ -	if (__builtin_constant_p (private) && (private) == LLL_PRIVATE)	      \ -	  __lll_lock_wait_private (__futex);				      \ -	else								      \ -	  __lll_lock_wait (__futex, private);				      \ -      }									      \ -  })) -#define lll_lock(futex, private) __lll_lock (&(futex), private) - - -#define __lll_robust_lock(futex, id, private)				      \ -  ({									      \ -    int *__futex = (futex);						      \ -    int __val = 0;							      \ -									      \ -    if (__builtin_expect (atomic_compare_and_exchange_bool_acq (__futex, id,  \ -								0), 0))	      \ -      __val = __lll_robust_lock_wait (__futex, private);		      \ -    __val;								      \ -  }) -#define lll_robust_lock(futex, id, private) \ -  __lll_robust_lock (&(futex), id, private) - - -#define __lll_cond_lock(futex, private)					      \ -  ((void) ({								      \ -    int *__futex = (futex);						      \ -    if (__builtin_expect (atomic_exchange_acq (__futex, 2), 0))		      \ -      __lll_lock_wait (__futex, private);				      \ -  })) -#define lll_cond_lock(futex, private) __lll_cond_lock (&(futex), private) - - -#define lll_robust_cond_lock(futex, id, private) \ -  __lll_robust_lock (&(futex), (id) | FUTEX_WAITERS, private) - - -extern int __lll_timedlock_wait (int *futex, const struct timespec *, -				 int private) attribute_hidden; -extern int __lll_robust_timedlock_wait (int *futex, const struct timespec *, -					int private) attribute_hidden; - -#define __lll_timedlock(futex, abstime, private)			      \ -  ({									      \ -     int *__futex = (futex);						      \ -     int __val = 0;							      \ -									      \ -     if (__builtin_expect (atomic_exchange_acq (__futex, 1), 0))	      \ -       __val = __lll_timedlock_wait (__futex, abstime, private);	      \ -     __val;								      \ -  }) -#define lll_timedlock(futex, abstime, private) \ -  __lll_timedlock (&(futex), abstime, private) - - -#define __lll_robust_timedlock(futex, abstime, id, private)		      \ -  ({									      \ -    int *__futex = (futex);						      \ -    int __val = 0;							      \ -									      \ -    if (__builtin_expect (atomic_compare_and_exchange_bool_acq (__futex, id,  \ -								0), 0))	      \ -      __val = __lll_robust_timedlock_wait (__futex, abstime, private);	      \ -    __val;								      \ -  }) -#define lll_robust_timedlock(futex, abstime, id, private) \ -  __lll_robust_timedlock (&(futex), abstime, id, private) - - -#define __lll_unlock(futex, private) \ -  (void)							\ -    ({ int *__futex = (futex);					\ -       int __oldval = atomic_exchange_rel (__futex, 0);		\ -       if (__builtin_expect (__oldval > 1, 0))			\ -	 lll_futex_wake (__futex, 1, private);			\ -    }) -#define lll_unlock(futex, private) __lll_unlock(&(futex), private) - - -#define __lll_robust_unlock(futex, private) \ -  (void)							\ -    ({ int *__futex = (futex);					\ -       int __oldval = atomic_exchange_rel (__futex, 0);		\ -       if (__builtin_expect (__oldval & FUTEX_WAITERS, 0))	\ -	 lll_futex_wake (__futex, 1, private);			\ -    }) -#define lll_robust_unlock(futex, private) \ -  __lll_robust_unlock(&(futex), private) - - -#define lll_islocked(futex) \ -  (futex != 0) - - -/* Our internal lock implementation is identical to the binary-compatible -   mutex implementation. */ - -/* Initializers for lock.  */ -#define LLL_LOCK_INITIALIZER		(0) -#define LLL_LOCK_INITIALIZER_LOCKED	(1) - -/* The states of a lock are: -    0  -  untaken -    1  -  taken by one user -   >1  -  taken by more users */ - -/* The kernel notifies a process which uses CLONE_CLEARTID via futex -   wakeup when the clone terminates.  The memory location contains the -   thread ID while the clone is running and is reset to zero -   afterwards.	*/ -#define lll_wait_tid(tid) \ -  do {					\ -    __typeof (tid) __tid;		\ -    while ((__tid = (tid)) != 0)	\ -      lll_futex_wait (&(tid), __tid, LLL_SHARED);\ -  } while (0) - -extern int __lll_timedwait_tid (int *, const struct timespec *) -     attribute_hidden; - -#define lll_timedwait_tid(tid, abstime) \ -  ({							\ -    int __res = 0;					\ -    if ((tid) != 0)					\ -      __res = __lll_timedwait_tid (&(tid), (abstime));	\ -    __res;						\ -  }) - -#endif	/* lowlevellock.h */ diff --git a/libpthread/nptl/sysdeps/unix/sysv/linux/metag/lowlevellock.h b/libpthread/nptl/sysdeps/unix/sysv/linux/metag/lowlevellock.h deleted file mode 100644 index 44a1ac01d..000000000 --- a/libpthread/nptl/sysdeps/unix/sysv/linux/metag/lowlevellock.h +++ /dev/null @@ -1,278 +0,0 @@ -/* Copyright (C) 2005, 2006, 2007, 2008, 2009 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 -   modify it under the terms of the GNU Lesser General Public -   License as published by the Free Software Foundation; either -   version 2.1 of the License, or (at your option) any later version. - -   The GNU C Library is distributed in the hope that it will be useful, -   but WITHOUT ANY WARRANTY; without even the implied warranty of -   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.	 See the GNU -   Lesser General Public License for more details. - -   You should have received a copy of the GNU Lesser General Public -   License along with the GNU C Library; see the file COPYING.LIB.  If -   not, see <http://www.gnu.org/licenses/>.  */ - -#ifndef _LOWLEVELLOCK_H -#define _LOWLEVELLOCK_H	1 - -#include <time.h> -#include <sys/param.h> -#include <bits/pthreadtypes.h> -#include <atomic.h> -#include <sysdep.h> -#include <bits/kernel-features.h> - -#define FUTEX_WAIT		0 -#define FUTEX_WAKE		1 -#define FUTEX_REQUEUE		3 -#define FUTEX_CMP_REQUEUE	4 -#define FUTEX_WAKE_OP		5 -#define FUTEX_OP_CLEAR_WAKE_IF_GT_ONE	((4 << 24) | 1) -#define FUTEX_LOCK_PI		6 -#define FUTEX_UNLOCK_PI		7 -#define FUTEX_TRYLOCK_PI	8 -#define FUTEX_WAIT_BITSET	9 -#define FUTEX_WAKE_BITSET	10 -#define FUTEX_PRIVATE_FLAG	128 -#define FUTEX_CLOCK_REALTIME	256 - -#define FUTEX_BITSET_MATCH_ANY	0xffffffff - -/* Values for 'private' parameter of locking macros.  Yes, the -   definition seems to be backwards.  But it is not.  The bit will be -   reversed before passing to the system call.  */ -#define LLL_PRIVATE	0 -#define LLL_SHARED	FUTEX_PRIVATE_FLAG - - -#if !defined NOT_IN_libc || defined IS_IN_rtld -/* In libc.so or ld.so all futexes are private.  */ -# ifdef __ASSUME_PRIVATE_FUTEX -#  define __lll_private_flag(fl, private) \ -  ((fl) | FUTEX_PRIVATE_FLAG) -# else -#  define __lll_private_flag(fl, private) \ -  ((fl) | THREAD_GETMEM (THREAD_SELF, header.private_futex)) -# endif -#else -# ifdef __ASSUME_PRIVATE_FUTEX -#  define __lll_private_flag(fl, private) \ -  (((fl) | FUTEX_PRIVATE_FLAG) ^ (private)) -# else -#  define __lll_private_flag(fl, private) \ -  (__builtin_constant_p (private)					      \ -   ? ((private) == 0							      \ -      ? ((fl) | THREAD_GETMEM (THREAD_SELF, header.private_futex))	      \ -      : (fl))								      \ -   : ((fl) | (((private) ^ FUTEX_PRIVATE_FLAG)				      \ -	      & THREAD_GETMEM (THREAD_SELF, header.private_futex)))) -# endif -#endif - - -#define lll_futex_wait(futexp, val, private) \ -  lll_futex_timed_wait(futexp, val, NULL, private) - -#define lll_futex_timed_wait(futexp, val, timespec, private) \ -  ({									      \ -    INTERNAL_SYSCALL_DECL (__err);					      \ -    long int __ret;							      \ -    __ret = INTERNAL_SYSCALL (futex, __err, 4, (futexp),		      \ -			      __lll_private_flag (FUTEX_WAIT, private),	      \ -			      (val), (timespec));			      \ -    __ret;								      \ -  }) - -#define lll_futex_wake(futexp, nr, private) \ -  ({									      \ -    INTERNAL_SYSCALL_DECL (__err);					      \ -    long int __ret;							      \ -    __ret = INTERNAL_SYSCALL (futex, __err, 4, (futexp),		      \ -			      __lll_private_flag (FUTEX_WAKE, private),	      \ -			      (nr), 0);					      \ -    __ret;								      \ -  }) - -#define lll_robust_dead(futexv, private) \ -  do									      \ -    {									      \ -      int *__futexp = &(futexv);					      \ -      atomic_or (__futexp, FUTEX_OWNER_DIED);				      \ -      lll_futex_wake (__futexp, 1, private);				      \ -    }									      \ -  while (0) - -/* Returns non-zero if error happened, zero if success.  */ -#define lll_futex_requeue(futexp, nr_wake, nr_move, mutex, val, private) \ -  ({									      \ -    INTERNAL_SYSCALL_DECL (__err);					      \ -    long int __ret;							      \ -    __ret = INTERNAL_SYSCALL (futex, __err, 6, (futexp),		      \ -			      __lll_private_flag (FUTEX_CMP_REQUEUE, private),\ -			      (nr_wake), (nr_move), (mutex), (val));	      \ -    INTERNAL_SYSCALL_ERROR_P (__ret, __err);				      \ -  }) - - -/* Returns non-zero if error happened, zero if success.  */ -#define lll_futex_wake_unlock(futexp, nr_wake, nr_wake2, futexp2, private) \ -  ({									      \ -    INTERNAL_SYSCALL_DECL (__err);					      \ -    long int __ret;							      \ -    __ret = INTERNAL_SYSCALL (futex, __err, 6, (futexp),		      \ -			      __lll_private_flag (FUTEX_WAKE_OP, private),    \ -			      (nr_wake), (nr_wake2), (futexp2),		      \ -			      FUTEX_OP_CLEAR_WAKE_IF_GT_ONE);		      \ -    INTERNAL_SYSCALL_ERROR_P (__ret, __err);				      \ -  }) - - -#define lll_trylock(lock)	\ -  atomic_compare_and_exchange_val_acq(&(lock), 1, 0) - -#define lll_cond_trylock(lock)	\ -  atomic_compare_and_exchange_val_acq(&(lock), 2, 0) - -#define __lll_robust_trylock(futex, id) \ -  (atomic_compare_and_exchange_val_acq (futex, id, 0) != 0) -#define lll_robust_trylock(lock, id) \ -  __lll_robust_trylock (&(lock), id) - -extern void __lll_lock_wait_private (int *futex) attribute_hidden; -extern void __lll_lock_wait (int *futex, int private) attribute_hidden; -extern int __lll_robust_lock_wait (int *futex, int private) attribute_hidden; - -#define __lll_lock(futex, private)					      \ -  ((void) ({								      \ -    int *__futex = (futex);						      \ -    if (unlikely(atomic_compare_and_exchange_val_acq (__futex, 1, 0)))        \ -      {									      \ -	if (__builtin_constant_p (private) && (private) == LLL_PRIVATE)	      \ -	  __lll_lock_wait_private (__futex);				      \ -	else								      \ -	  __lll_lock_wait (__futex, private);				      \ -      }									      \ -  })) -#define lll_lock(futex, private) __lll_lock (&(futex), private) - - -#define __lll_robust_lock(futex, id, private)				      \ -  ({									      \ -    int *__futex = (futex);						      \ -    int __val = 0;							      \ -									      \ -    if (unlikely(atomic_compare_and_exchange_bool_acq (__futex, id, 0)))      \ -      __val = __lll_robust_lock_wait (__futex, private);		      \ -    __val;								      \ -  }) -#define lll_robust_lock(futex, id, private) \ -  __lll_robust_lock (&(futex), id, private) - - -#define __lll_cond_lock(futex, private)					      \ -  ((void) ({								      \ -    int *__futex = (futex);						      \ -    if (unlikely(atomic_exchange_acq (__futex, 2)))			      \ -      __lll_lock_wait (__futex, private);				      \ -  })) -#define lll_cond_lock(futex, private) __lll_cond_lock (&(futex), private) - - -#define lll_robust_cond_lock(futex, id, private) \ -  __lll_robust_lock (&(futex), (id) | FUTEX_WAITERS, private) - - -extern int __lll_timedlock_wait (int *futex, const struct timespec *, -				 int private) attribute_hidden; -extern int __lll_robust_timedlock_wait (int *futex, const struct timespec *, -					int private) attribute_hidden; - -#define __lll_timedlock(futex, abstime, private)			      \ -  ({									      \ -     int *__futex = (futex);						      \ -     int __val = 0;							      \ -									      \ -     if (unlikely(atomic_exchange_acq (__futex, 1)))	                      \ -       __val = __lll_timedlock_wait (__futex, abstime, private);	      \ -     __val;								      \ -  }) -#define lll_timedlock(futex, abstime, private) \ -  __lll_timedlock (&(futex), abstime, private) - - -#define __lll_robust_timedlock(futex, abstime, id, private)		      \ -  ({									      \ -    int *__futex = (futex);						      \ -    int __val = 0;							      \ -									      \ -    if (unlikely(atomic_compare_and_exchange_bool_acq (__futex, id, 0)))      \ -      __val = __lll_robust_timedlock_wait (__futex, abstime, private);	      \ -    __val;								      \ -  }) -#define lll_robust_timedlock(futex, abstime, id, private) \ -  __lll_robust_timedlock (&(futex), abstime, id, private) - - -#define __lll_unlock(futex, private) \ -  (void)							\ -    ({ int *__futex = (futex);					\ -       int __oldval = atomic_exchange_rel (__futex, 0);		\ -       if (unlikely(__oldval > 1))			        \ -	 lll_futex_wake (__futex, 1, private);			\ -    }) -#define lll_unlock(futex, private) __lll_unlock(&(futex), private) - - -#define __lll_robust_unlock(futex, private) \ -  (void)							\ -    ({ int *__futex = (futex);					\ -       int __oldval = atomic_exchange_rel (__futex, 0);		\ -       if (unlikely(__oldval & FUTEX_WAITERS))	        	\ -	 lll_futex_wake (__futex, 1, private);			\ -    }) -#define lll_robust_unlock(futex, private) \ -  __lll_robust_unlock(&(futex), private) - - -#define lll_islocked(futex) \ -  (futex != 0) - - -/* Our internal lock implementation is identical to the binary-compatible -   mutex implementation. */ - -/* Initializers for lock.  */ -#define LLL_LOCK_INITIALIZER		(0) -#define LLL_LOCK_INITIALIZER_LOCKED	(1) - -/* The states of a lock are: -    0  -  untaken -    1  -  taken by one user -   >1  -  taken by more users */ - -/* The kernel notifies a process which uses CLONE_CLEARTID via futex -   wakeup when the clone terminates.  The memory location contains the -   thread ID while the clone is running and is reset to zero -   afterwards.	*/ -#define lll_wait_tid(tid) \ -  do {					\ -    __typeof (tid) __tid;		\ -    while ((__tid = (tid)) != 0)	\ -      lll_futex_wait (&(tid), __tid, LLL_SHARED);\ -  } while (0) - -extern int __lll_timedwait_tid (int *, const struct timespec *) -     attribute_hidden; - -#define lll_timedwait_tid(tid, abstime) \ -  ({							\ -    int __res = 0;					\ -    if ((tid) != 0)					\ -      __res = __lll_timedwait_tid (&(tid), (abstime));	\ -    __res;						\ -  }) - -#endif	/* lowlevellock.h */ diff --git a/libpthread/nptl/sysdeps/unix/sysv/linux/microblaze/lowlevellock.h b/libpthread/nptl/sysdeps/unix/sysv/linux/microblaze/lowlevellock.h deleted file mode 100644 index 5b06e6fd1..000000000 --- a/libpthread/nptl/sysdeps/unix/sysv/linux/microblaze/lowlevellock.h +++ /dev/null @@ -1,278 +0,0 @@ -/* Copyright (C) 2005, 2006, 2007, 2008, 2009 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 -   modify it under the terms of the GNU Lesser General Public -   License as published by the Free Software Foundation; either -   version 2.1 of the License, or (at your option) any later version. - -   The GNU C Library is distributed in the hope that it will be useful, -   but WITHOUT ANY WARRANTY; without even the implied warranty of -   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.	 See the GNU -   Lesser General Public License for more details. - -   You should have received a copy of the GNU Lesser General Public -   License along with the GNU C Library; see the file COPYING.LIB.  If -   not, see <http://www.gnu.org/licenses/>.  */ - -#ifndef _LOWLEVELLOCK_H -#define _LOWLEVELLOCK_H	1 - -#include <time.h> -#include <sys/param.h> -#include <bits/pthreadtypes.h> -#include <atomic.h> -#include <sysdep.h> -#include <bits/kernel-features.h> - -#define FUTEX_WAIT		0 -#define FUTEX_WAKE		1 -#define FUTEX_REQUEUE		3 -#define FUTEX_CMP_REQUEUE	4 -#define FUTEX_WAKE_OP		5 -#define FUTEX_OP_CLEAR_WAKE_IF_GT_ONE	((4 << 24) | 1) -#define FUTEX_LOCK_PI		6 -#define FUTEX_UNLOCK_PI		7 -#define FUTEX_TRYLOCK_PI	8 -#define FUTEX_WAIT_BITSET	9 -#define FUTEX_WAKE_BITSET	10 -#define FUTEX_PRIVATE_FLAG	128 -#define FUTEX_CLOCK_REALTIME	256 - -#define FUTEX_BITSET_MATCH_ANY	0xffffffff - -/* Values for 'private' parameter of locking macros.  Yes, the -   definition seems to be backwards.  But it is not.  The bit will be -   reversed before passing to the system call.  */ -#define LLL_PRIVATE	0 -#define LLL_SHARED	FUTEX_PRIVATE_FLAG - - -#if !defined NOT_IN_libc || defined IS_IN_rtld -/* In libc.so or ld.so all futexes are private.  */ -# ifdef __ASSUME_PRIVATE_FUTEX -#  define __lll_private_flag(fl, private) \ -  ((fl) | FUTEX_PRIVATE_FLAG) -# else -#  define __lll_private_flag(fl, private) \ -  ((fl) | THREAD_GETMEM (THREAD_SELF, header.private_futex)) -# endif -#else -# ifdef __ASSUME_PRIVATE_FUTEX -#  define __lll_private_flag(fl, private) \ -  (((fl) | FUTEX_PRIVATE_FLAG) ^ (private)) -# else -#  define __lll_private_flag(fl, private) \ -  (__builtin_constant_p (private)					      \ -   ? ((private) == 0							      \ -      ? ((fl) | THREAD_GETMEM (THREAD_SELF, header.private_futex))	      \ -      : (fl))								      \ -   : ((fl) | (((private) ^ FUTEX_PRIVATE_FLAG)				      \ -	      & THREAD_GETMEM (THREAD_SELF, header.private_futex)))) -# endif -#endif - - -#define lll_futex_wait(futexp, val, private) \ -  lll_futex_timed_wait(futexp, val, NULL, private) - -#define lll_futex_timed_wait(futexp, val, timespec, private) \ -  ({									      \ -    long int __sysret;							      \ -    INTERNAL_SYSCALL_DECL (__err);					      \ -    __sysret = INTERNAL_SYSCALL (futex, __err, 4, (futexp),		      \ -			      __lll_private_flag (FUTEX_WAIT, private),	      \ -			      (val), (timespec));			      \ -    __sysret;								      \ -  }) - -#define lll_futex_wake(futexp, nr, private) \ -  ({									      \ -    long int __sysret;							      \ -    INTERNAL_SYSCALL_DECL (__err);					      \ -    __sysret = INTERNAL_SYSCALL (futex, __err, 4, (futexp),		      \ -			      __lll_private_flag (FUTEX_WAKE, private),	      \ -			      (nr), 0);					      \ -    __sysret;								      \ -  }) - -#define lll_robust_dead(futexv, private) \ -  do									      \ -    {									      \ -      int *__futexp = &(futexv);					      \ -      atomic_or (__futexp, FUTEX_OWNER_DIED);				      \ -      lll_futex_wake (__futexp, 1, private);				      \ -    }									      \ -  while (0) - -/* Returns non-zero if error happened, zero if success.  */ -#define lll_futex_requeue(futexp, nr_wake, nr_move, mutex, val, private) \ -  ({									      \ -    long int __sysret;							      \ -    INTERNAL_SYSCALL_DECL (__err);					      \ -    __sysret = INTERNAL_SYSCALL (futex, __err, 6, (futexp),		      \ -			      __lll_private_flag (FUTEX_CMP_REQUEUE, private),\ -			      (nr_wake), (nr_move), (mutex), (val));	      \ -    INTERNAL_SYSCALL_ERROR_P (__sysret, __err);				      \ -  }) - - -/* Returns non-zero if error happened, zero if success.  */ -#define lll_futex_wake_unlock(futexp, nr_wake, nr_wake2, futexp2, private) \ -  ({									      \ -    long int __sysret;							      \ -    INTERNAL_SYSCALL_DECL (__err);					      \ -    __sysret = INTERNAL_SYSCALL (futex, __err, 6, (futexp),		      \ -			      __lll_private_flag (FUTEX_WAKE_OP, private),    \ -			      (nr_wake), (nr_wake2), (futexp2),		      \ -			      FUTEX_OP_CLEAR_WAKE_IF_GT_ONE);		      \ -    INTERNAL_SYSCALL_ERROR_P (__sysret, __err);				      \ -  }) - - -#define lll_trylock(lock)	\ -  atomic_compare_and_exchange_val_acq(&(lock), 1, 0) - -#define lll_cond_trylock(lock)	\ -  atomic_compare_and_exchange_val_acq(&(lock), 2, 0) - -#define __lll_robust_trylock(futex, id) \ -  (atomic_compare_and_exchange_val_acq (futex, id, 0) != 0) -#define lll_robust_trylock(lock, id) \ -  __lll_robust_trylock (&(lock), id) - -extern void __lll_lock_wait_private (int *futex) attribute_hidden; -extern void __lll_lock_wait (int *futex, int private) attribute_hidden; -extern int __lll_robust_lock_wait (int *futex, int private) attribute_hidden; - -#define __lll_lock(futex, private)					      \ -  ((void) ({								      \ -    int *__futex = (futex);						      \ -    if (unlikely(atomic_compare_and_exchange_val_acq (__futex, 1, 0)))        \ -      {									      \ -	if (__builtin_constant_p (private) && (private) == LLL_PRIVATE)	      \ -	  __lll_lock_wait_private (__futex);				      \ -	else								      \ -	  __lll_lock_wait (__futex, private);				      \ -      }									      \ -  })) -#define lll_lock(futex, private) __lll_lock (&(futex), private) - - -#define __lll_robust_lock(futex, id, private)				      \ -  ({									      \ -    int *__futex = (futex);						      \ -    int __val = 0;							      \ -									      \ -    if (unlikely(atomic_compare_and_exchange_bool_acq (__futex, id, 0)))      \ -      __val = __lll_robust_lock_wait (__futex, private);		      \ -    __val;								      \ -  }) -#define lll_robust_lock(futex, id, private) \ -  __lll_robust_lock (&(futex), id, private) - - -#define __lll_cond_lock(futex, private)					      \ -  ((void) ({								      \ -    int *__futex = (futex);						      \ -    if (unlikely(atomic_exchange_acq (__futex, 2)))			      \ -      __lll_lock_wait (__futex, private);				      \ -  })) -#define lll_cond_lock(futex, private) __lll_cond_lock (&(futex), private) - - -#define lll_robust_cond_lock(futex, id, private) \ -  __lll_robust_lock (&(futex), (id) | FUTEX_WAITERS, private) - - -extern int __lll_timedlock_wait (int *futex, const struct timespec *, -				 int private) attribute_hidden; -extern int __lll_robust_timedlock_wait (int *futex, const struct timespec *, -					int private) attribute_hidden; - -#define __lll_timedlock(futex, abstime, private)			      \ -  ({									      \ -     int *__futex = (futex);						      \ -     int __val = 0;							      \ -									      \ -     if (unlikely(atomic_exchange_acq (__futex, 1)))	                      \ -       __val = __lll_timedlock_wait (__futex, abstime, private);	      \ -     __val;								      \ -  }) -#define lll_timedlock(futex, abstime, private) \ -  __lll_timedlock (&(futex), abstime, private) - - -#define __lll_robust_timedlock(futex, abstime, id, private)		      \ -  ({									      \ -    int *__futex = (futex);						      \ -    int __val = 0;							      \ -									      \ -    if (unlikely(atomic_compare_and_exchange_bool_acq (__futex, id, 0)))      \ -      __val = __lll_robust_timedlock_wait (__futex, abstime, private);	      \ -    __val;								      \ -  }) -#define lll_robust_timedlock(futex, abstime, id, private) \ -  __lll_robust_timedlock (&(futex), abstime, id, private) - - -#define __lll_unlock(futex, private) \ -  (void)							\ -    ({ int *__futex = (futex);					\ -       int __oldval = atomic_exchange_rel (__futex, 0);		\ -       if (unlikely(__oldval > 1))			        \ -	 lll_futex_wake (__futex, 1, private);			\ -    }) -#define lll_unlock(futex, private) __lll_unlock(&(futex), private) - - -#define __lll_robust_unlock(futex, private) \ -  (void)							\ -    ({ int *__futex = (futex);					\ -       int __oldval = atomic_exchange_rel (__futex, 0);		\ -       if (unlikely(__oldval & FUTEX_WAITERS))	        	\ -	 lll_futex_wake (__futex, 1, private);			\ -    }) -#define lll_robust_unlock(futex, private) \ -  __lll_robust_unlock(&(futex), private) - - -#define lll_islocked(futex) \ -  (futex != 0) - - -/* Our internal lock implementation is identical to the binary-compatible -   mutex implementation. */ - -/* Initializers for lock.  */ -#define LLL_LOCK_INITIALIZER		(0) -#define LLL_LOCK_INITIALIZER_LOCKED	(1) - -/* The states of a lock are: -    0  -  untaken -    1  -  taken by one user -   >1  -  taken by more users */ - -/* The kernel notifies a process which uses CLONE_CLEARTID via futex -   wakeup when the clone terminates.  The memory location contains the -   thread ID while the clone is running and is reset to zero -   afterwards.	*/ -#define lll_wait_tid(tid) \ -  do {					\ -    __typeof (tid) __tid;		\ -    while ((__tid = (tid)) != 0)	\ -      lll_futex_wait (&(tid), __tid, LLL_SHARED);\ -  } while (0) - -extern int __lll_timedwait_tid (int *, const struct timespec *) -     attribute_hidden; - -#define lll_timedwait_tid(tid, abstime) \ -  ({							\ -    int __res = 0;					\ -    if ((tid) != 0)					\ -      __res = __lll_timedwait_tid (&(tid), (abstime));	\ -    __res;						\ -  }) - -#endif	/* lowlevellock.h */ diff --git a/libpthread/nptl/sysdeps/unix/sysv/linux/nds32/lowlevellock.h b/libpthread/nptl/sysdeps/unix/sysv/linux/nds32/lowlevellock.h deleted file mode 100644 index 32b004486..000000000 --- a/libpthread/nptl/sysdeps/unix/sysv/linux/nds32/lowlevellock.h +++ /dev/null @@ -1,323 +0,0 @@ -/* Copyright (C) 2005-2013 Free Software Foundation, Inc. - -   The GNU C Library is free software; you can redistribute it and/or -   modify it under the terms of the GNU Lesser General Public -   License as published by the Free Software Foundation; either -   version 2.1 of the License, or (at your option) any later version. - -   The GNU C Library is distributed in the hope that it will be useful, -   but WITHOUT ANY WARRANTY; without even the implied warranty of -   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.	 See the GNU -   Lesser General Public License for more details. - -   You should have received a copy of the GNU Lesser General Public -   License along with the GNU C Library.  If not, see -   <http://www.gnu.org/licenses/>.  */ - -#ifndef _LOWLEVELLOCK_H -#define _LOWLEVELLOCK_H	1 - -#include <time.h> -#include <sys/param.h> -#include <bits/pthreadtypes.h> -#include <atomic.h> -#include <sysdep.h> -#include <bits/kernel-features.h> - - -#define FUTEX_WAIT		0 -#define FUTEX_WAKE		1 -#define FUTEX_REQUEUE		3 -#define FUTEX_CMP_REQUEUE	4 -#define FUTEX_WAKE_OP		5 -#define FUTEX_OP_CLEAR_WAKE_IF_GT_ONE	((4 << 24) | 1) -#define FUTEX_LOCK_PI		6 -#define FUTEX_UNLOCK_PI		7 -#define FUTEX_TRYLOCK_PI	8 -#define FUTEX_WAIT_BITSET	9 -#define FUTEX_WAKE_BITSET	10 -#define FUTEX_WAIT_REQUEUE_PI   11 -#define FUTEX_CMP_REQUEUE_PI    12 -#define FUTEX_PRIVATE_FLAG	128 -#define FUTEX_CLOCK_REALTIME	256 - -#define FUTEX_BITSET_MATCH_ANY	0xffffffff - -/* Values for 'private' parameter of locking macros.  Yes, the -   definition seems to be backwards.  But it is not.  The bit will be -   reversed before passing to the system call.  */ -#define LLL_PRIVATE	0 -#define LLL_SHARED	FUTEX_PRIVATE_FLAG - - -#if !defined NOT_IN_libc || defined IS_IN_rtld -/* In libc.so or ld.so all futexes are private.  */ -# ifdef __ASSUME_PRIVATE_FUTEX -#  define __lll_private_flag(fl, private) \ -  ((fl) | FUTEX_PRIVATE_FLAG) -# else -#  define __lll_private_flag(fl, private) \ -  ((fl) | THREAD_GETMEM (THREAD_SELF, header.private_futex)) -# endif -#else -# ifdef __ASSUME_PRIVATE_FUTEX -#  define __lll_private_flag(fl, private) \ -  (((fl) | FUTEX_PRIVATE_FLAG) ^ (private)) -# else -#  define __lll_private_flag(fl, private) \ -  (__builtin_constant_p (private)					      \ -   ? ((private) == 0							      \ -      ? ((fl) | THREAD_GETMEM (THREAD_SELF, header.private_futex))	      \ -      : (fl))								      \ -   : ((fl) | (((private) ^ FUTEX_PRIVATE_FLAG)				      \ -	      & THREAD_GETMEM (THREAD_SELF, header.private_futex)))) -# endif -#endif - - -#define lll_futex_wait(futexp, val, private) \ -  lll_futex_timed_wait(futexp, val, NULL, private) - -#define lll_futex_timed_wait(futexp, val, timespec, private) \ -  ({									      \ -    INTERNAL_SYSCALL_DECL (__err);					      \ -    long int __ret;							      \ -    __ret = INTERNAL_SYSCALL (futex, __err, 4, (futexp),		      \ -			      __lll_private_flag (FUTEX_WAIT, private),	      \ -			      (val), (timespec));			      \ -    __ret;								      \ -  }) - -#define lll_futex_timed_wait_bitset(futexp, val, timespec, clockbit, private) \ -  ({									\ -    INTERNAL_SYSCALL_DECL (__err);					\ -    long int __ret;							\ -    int __op = FUTEX_WAIT_BITSET | clockbit;				\ -    __ret = INTERNAL_SYSCALL (futex, __err, 6, (futexp),		\ -			      __lll_private_flag (__op, private),	\ -			      (val), (timespec), NULL /* Unused.  */,	\ -			      FUTEX_BITSET_MATCH_ANY);			\ -    __ret;								\ -  }) - -#define lll_futex_wake(futexp, nr, private) \ -  ({									      \ -    INTERNAL_SYSCALL_DECL (__err);					      \ -    long int __ret;							      \ -    __ret = INTERNAL_SYSCALL (futex, __err, 4, (futexp),		      \ -			      __lll_private_flag (FUTEX_WAKE, private),	      \ -			      (nr), 0);					      \ -    __ret;								      \ -  }) - -#define lll_robust_dead(futexv, private) \ -  do									      \ -    {									      \ -      int *__futexp = &(futexv);					      \ -      atomic_or (__futexp, FUTEX_OWNER_DIED);				      \ -      lll_futex_wake (__futexp, 1, private);				      \ -    }									      \ -  while (0) - -/* Returns non-zero if error happened, zero if success.  */ -#define lll_futex_requeue(futexp, nr_wake, nr_move, mutex, val, private) \ -  ({									      \ -    INTERNAL_SYSCALL_DECL (__err);					      \ -    long int __ret;							      \ -    __ret = INTERNAL_SYSCALL (futex, __err, 6, (futexp),		      \ -			      __lll_private_flag (FUTEX_CMP_REQUEUE, private),\ -			      (nr_wake), (nr_move), (mutex), (val));	      \ -    INTERNAL_SYSCALL_ERROR_P (__ret, __err);				      \ -  }) - - -/* Returns non-zero if error happened, zero if success.  */ -#define lll_futex_wake_unlock(futexp, nr_wake, nr_wake2, futexp2, private) \ -  ({									      \ -    INTERNAL_SYSCALL_DECL (__err);					      \ -    long int __ret;							      \ -    __ret = INTERNAL_SYSCALL (futex, __err, 6, (futexp),		      \ -			      __lll_private_flag (FUTEX_WAKE_OP, private),    \ -			      (nr_wake), (nr_wake2), (futexp2),		      \ -			      FUTEX_OP_CLEAR_WAKE_IF_GT_ONE);		      \ -    INTERNAL_SYSCALL_ERROR_P (__ret, __err);				      \ -  }) - -/* Priority Inheritance support.  */ -#define lll_futex_wait_requeue_pi(futexp, val, mutex, private) \ -  lll_futex_timed_wait_requeue_pi (futexp, val, NULL, 0, mutex, private) - -#define lll_futex_timed_wait_requeue_pi(futexp, val, timespec, clockbit,      \ -					mutex, private)			      \ -  ({									      \ -    INTERNAL_SYSCALL_DECL (__err);					      \ -    int __op = FUTEX_WAIT_REQUEUE_PI | clockbit;			      \ -									      \ -    INTERNAL_SYSCALL (futex, __err, 5, (futexp),			      \ -		      __lll_private_flag (__op, private),		      \ -		      (val), (timespec), mutex); 			      \ -  }) - -#define lll_futex_cmp_requeue_pi(futexp, nr_wake, nr_move, mutex, val, priv)  \ -  ({									      \ -    INTERNAL_SYSCALL_DECL (__err);					      \ -    long int __ret;							      \ -									      \ -    __ret = INTERNAL_SYSCALL (futex, __err, 6, (futexp),		      \ -			      __lll_private_flag (FUTEX_CMP_REQUEUE_PI, priv),\ -			      (nr_wake), (nr_move), (mutex), (val));	      \ -    INTERNAL_SYSCALL_ERROR_P (__ret, __err);				      \ -  }) - - -#define lll_trylock(lock)	\ -  atomic_compare_and_exchange_val_acq(&(lock), 1, 0) - -#define lll_cond_trylock(lock)	\ -  atomic_compare_and_exchange_val_acq(&(lock), 2, 0) - -#define __lll_robust_trylock(futex, id) \ -  (atomic_compare_and_exchange_val_acq (futex, id, 0) != 0) -#define lll_robust_trylock(lock, id) \ -  __lll_robust_trylock (&(lock), id) - -extern void __lll_lock_wait_private (int *futex) attribute_hidden; -extern void __lll_lock_wait (int *futex, int private) attribute_hidden; -extern int __lll_robust_lock_wait (int *futex, int private) attribute_hidden; - -#define __lll_lock(futex, private)					      \ -  ((void) ({								      \ -    int *__futex = (futex);						      \ -    if (__builtin_expect (atomic_compare_and_exchange_val_acq (__futex,       \ -								1, 0), 0))    \ -      {									      \ -	if (__builtin_constant_p (private) && (private) == LLL_PRIVATE)	      \ -	  __lll_lock_wait_private (__futex);				      \ -	else								      \ -	  __lll_lock_wait (__futex, private);				      \ -      }									      \ -  })) -#define lll_lock(futex, private) __lll_lock (&(futex), private) - - -#define __lll_robust_lock(futex, id, private)				      \ -  ({									      \ -    int *__futex = (futex);						      \ -    int __val = 0;							      \ -									      \ -    if (__builtin_expect (atomic_compare_and_exchange_bool_acq (__futex, id,  \ -								0), 0))	      \ -      __val = __lll_robust_lock_wait (__futex, private);		      \ -    __val;								      \ -  }) -#define lll_robust_lock(futex, id, private) \ -  __lll_robust_lock (&(futex), id, private) - - -#define __lll_cond_lock(futex, private)					      \ -  ((void) ({								      \ -    int *__futex = (futex);						      \ -    if (__builtin_expect (atomic_exchange_acq (__futex, 2), 0))		      \ -      __lll_lock_wait (__futex, private);				      \ -  })) -#define lll_cond_lock(futex, private) __lll_cond_lock (&(futex), private) - - -#define lll_robust_cond_lock(futex, id, private) \ -  __lll_robust_lock (&(futex), (id) | FUTEX_WAITERS, private) - - -extern int __lll_timedlock_wait (int *futex, const struct timespec *, -				 int private) attribute_hidden; -extern int __lll_robust_timedlock_wait (int *futex, const struct timespec *, -					int private) attribute_hidden; - -#define __lll_timedlock(futex, abstime, private)			      \ -  ({									      \ -     int *__futex = (futex);						      \ -     int __val = 0;							      \ -									      \ -     if (__builtin_expect (atomic_exchange_acq (__futex, 1), 0))	      \ -       __val = __lll_timedlock_wait (__futex, abstime, private);	      \ -     __val;								      \ -  }) -#define lll_timedlock(futex, abstime, private) \ -  __lll_timedlock (&(futex), abstime, private) - - -#define __lll_robust_timedlock(futex, abstime, id, private)		      \ -  ({									      \ -    int *__futex = (futex);						      \ -    int __val = 0;							      \ -									      \ -    if (__builtin_expect (atomic_compare_and_exchange_bool_acq (__futex, id,  \ -								0), 0))	      \ -      __val = __lll_robust_timedlock_wait (__futex, abstime, private);	      \ -    __val;								      \ -  }) -#define lll_robust_timedlock(futex, abstime, id, private) \ -  __lll_robust_timedlock (&(futex), abstime, id, private) - - -#define __lll_unlock(futex, private) \ -  (void)							\ -    ({ int *__futex = (futex);					\ -       int __oldval = atomic_exchange_rel (__futex, 0);		\ -       if (__builtin_expect (__oldval > 1, 0))			\ -	 lll_futex_wake (__futex, 1, private);			\ -       lll_futex_wake (__futex, 1, private);			\ -    }) -#define lll_unlock(futex, private) __lll_unlock(&(futex), private) - - -#define __lll_robust_unlock(futex, private) \ -  (void)							\ -    ({ int *__futex = (futex);					\ -       int __oldval = atomic_exchange_rel (__futex, 0);		\ -       if (__builtin_expect (__oldval & FUTEX_WAITERS, 0))	\ -	 lll_futex_wake (__futex, 1, private);			\ -       lll_futex_wake (__futex, 1, private);			\ -    }) -#define lll_robust_unlock(futex, private) \ -  __lll_robust_unlock(&(futex), private) - - -#define lll_islocked(futex) \ -  (futex != 0) - - -/* Our internal lock implementation is identical to the binary-compatible -   mutex implementation. */ - -/* Initializers for lock.  */ -#define LLL_LOCK_INITIALIZER		(0) -#define LLL_LOCK_INITIALIZER_LOCKED	(1) - -/* The states of a lock are: -    0  -  untaken -    1  -  taken by one user -   >1  -  taken by more users */ - -/* The kernel notifies a process which uses CLONE_CHILD_CLEARTID via futex -   wakeup when the clone terminates.  The memory location contains the -   thread ID while the clone is running and is reset to zero -   afterwards.	*/ -#define lll_wait_tid(tid) \ -  do {					\ -    __typeof (tid) __tid;		\ -    while ((__tid = (tid)) != 0)	\ -      lll_futex_wait (&(tid), __tid, LLL_SHARED);\ -  } while (0) - -extern int __lll_timedwait_tid (int *, const struct timespec *) -     attribute_hidden; - -#define lll_timedwait_tid(tid, abstime) \ -  ({							\ -    int __res = 0;					\ -    if ((tid) != 0)					\ -      __res = __lll_timedwait_tid (&(tid), (abstime));	\ -    __res;						\ -  }) - -#endif	/* lowlevellock.h */ diff --git a/libpthread/nptl/sysdeps/unix/sysv/linux/nios2/lowlevellock.h b/libpthread/nptl/sysdeps/unix/sysv/linux/nios2/lowlevellock.h deleted file mode 100644 index 116a8c272..000000000 --- a/libpthread/nptl/sysdeps/unix/sysv/linux/nios2/lowlevellock.h +++ /dev/null @@ -1,281 +0,0 @@ -/* Copyright (C) 2005, 2006, 2007, 2008, 2009 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 -   modify it under the terms of the GNU Lesser General Public -   License as published by the Free Software Foundation; either -   version 2.1 of the License, or (at your option) any later version. - -   The GNU C Library is distributed in the hope that it will be useful, -   but WITHOUT ANY WARRANTY; without even the implied warranty of -   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.	 See the GNU -   Lesser General Public License for more details. - -   You should have received a copy of the GNU Lesser General Public -   License along with the GNU C Library; if not, see -   <http://www.gnu.org/licenses/>.  */ - -#ifndef _LOWLEVELLOCK_H -#define _LOWLEVELLOCK_H	1 - -#include <time.h> -#include <sys/param.h> -#include <bits/pthreadtypes.h> -#include <atomic.h> -#include <sysdep.h> -#include <bits/kernel-features.h> - -#define FUTEX_WAIT		0 -#define FUTEX_WAKE		1 -#define FUTEX_REQUEUE		3 -#define FUTEX_CMP_REQUEUE	4 -#define FUTEX_WAKE_OP		5 -#define FUTEX_OP_CLEAR_WAKE_IF_GT_ONE	((4 << 24) | 1) -#define FUTEX_LOCK_PI		6 -#define FUTEX_UNLOCK_PI		7 -#define FUTEX_TRYLOCK_PI	8 -#define FUTEX_WAIT_BITSET	9 -#define FUTEX_WAKE_BITSET	10 -#define FUTEX_PRIVATE_FLAG	128 -#define FUTEX_CLOCK_REALTIME	256 - -#define FUTEX_BITSET_MATCH_ANY	0xffffffff - -/* Values for 'private' parameter of locking macros.  Yes, the -   definition seems to be backwards.  But it is not.  The bit will be -   reversed before passing to the system call.  */ -#define LLL_PRIVATE	0 -#define LLL_SHARED	FUTEX_PRIVATE_FLAG - - -#if !defined NOT_IN_libc || defined IS_IN_rtld -/* In libc.so or ld.so all futexes are private.  */ -# ifdef __ASSUME_PRIVATE_FUTEX -#  define __lll_private_flag(fl, private) \ -  ((fl) | FUTEX_PRIVATE_FLAG) -# else -#  define __lll_private_flag(fl, private) \ -  ((fl) | THREAD_GETMEM (THREAD_SELF, header.private_futex)) -# endif -#else -# ifdef __ASSUME_PRIVATE_FUTEX -#  define __lll_private_flag(fl, private) \ -  (((fl) | FUTEX_PRIVATE_FLAG) ^ (private)) -# else -#  define __lll_private_flag(fl, private) \ -  (__builtin_constant_p (private)					      \ -   ? ((private) == 0							      \ -      ? ((fl) | THREAD_GETMEM (THREAD_SELF, header.private_futex))	      \ -      : (fl))								      \ -   : ((fl) | (((private) ^ FUTEX_PRIVATE_FLAG)				      \ -	      & THREAD_GETMEM (THREAD_SELF, header.private_futex)))) -# endif	       -#endif - - -#define lll_futex_wait(futexp, val, private) \ -  lll_futex_timed_wait(futexp, val, NULL, private) - -#define lll_futex_timed_wait(futexp, val, timespec, private) \ -  ({									      \ -    INTERNAL_SYSCALL_DECL (__err);					      \ -    long int __ret;							      \ -    __ret = INTERNAL_SYSCALL (futex, __err, 4, (futexp),		      \ -			      __lll_private_flag (FUTEX_WAIT, private),	      \ -			      (val), (timespec));			      \ -    __ret;								      \ -  }) - -#define lll_futex_wake(futexp, nr, private) \ -  ({									      \ -    INTERNAL_SYSCALL_DECL (__err);					      \ -    long int __ret;							      \ -    __ret = INTERNAL_SYSCALL (futex, __err, 4, (futexp),		      \ -			      __lll_private_flag (FUTEX_WAKE, private),	      \ -			      (nr), 0);					      \ -    __ret;								      \ -  }) - -#define lll_robust_dead(futexv, private) \ -  do									      \ -    {									      \ -      int *__futexp = &(futexv);					      \ -      atomic_or (__futexp, FUTEX_OWNER_DIED);				      \ -      lll_futex_wake (__futexp, 1, private);				      \ -    }									      \ -  while (0) - -/* Returns non-zero if error happened, zero if success.  */ -#define lll_futex_requeue(futexp, nr_wake, nr_move, mutex, val, private) \ -  ({									      \ -    INTERNAL_SYSCALL_DECL (__err);					      \ -    long int __ret;							      \ -    __ret = INTERNAL_SYSCALL (futex, __err, 6, (futexp),		      \ -			      __lll_private_flag (FUTEX_CMP_REQUEUE, private),\ -			      (nr_wake), (nr_move), (mutex), (val));	      \ -    INTERNAL_SYSCALL_ERROR_P (__ret, __err);				      \ -  }) - - -/* Returns non-zero if error happened, zero if success.  */ -#define lll_futex_wake_unlock(futexp, nr_wake, nr_wake2, futexp2, private) \ -  ({									      \ -    INTERNAL_SYSCALL_DECL (__err);					      \ -    long int __ret;							      \ -    __ret = INTERNAL_SYSCALL (futex, __err, 6, (futexp),		      \ -			      __lll_private_flag (FUTEX_WAKE_OP, private),    \ -			      (nr_wake), (nr_wake2), (futexp2),		      \ -			      FUTEX_OP_CLEAR_WAKE_IF_GT_ONE);		      \ -    INTERNAL_SYSCALL_ERROR_P (__ret, __err);				      \ -  }) - - -#define lll_trylock(lock)	\ -  atomic_compare_and_exchange_val_acq(&(lock), 1, 0) - -#define lll_cond_trylock(lock)	\ -  atomic_compare_and_exchange_val_acq(&(lock), 2, 0) - -#define __lll_robust_trylock(futex, id) \ -  (atomic_compare_and_exchange_val_acq (futex, id, 0) != 0) -#define lll_robust_trylock(lock, id) \ -  __lll_robust_trylock (&(lock), id) - -extern void __lll_lock_wait_private (int *futex) attribute_hidden; -extern void __lll_lock_wait (int *futex, int private) attribute_hidden; -extern int __lll_robust_lock_wait (int *futex, int private) attribute_hidden; - -#define __lll_lock(futex, private)					      \ -  ((void) ({								      \ -    int *__futex = (futex);						      \ -    if (__builtin_expect (atomic_compare_and_exchange_val_acq (__futex,       \ -								1, 0), 0))    \ -      {									      \ -	if (__builtin_constant_p (private) && (private) == LLL_PRIVATE)	      \ -	  __lll_lock_wait_private (__futex);				      \ -	else								      \ -	  __lll_lock_wait (__futex, private);				      \ -      }									      \ -  })) -#define lll_lock(futex, private) __lll_lock (&(futex), private) - - -#define __lll_robust_lock(futex, id, private)				      \ -  ({									      \ -    int *__futex = (futex);						      \ -    int __val = 0;							      \ -									      \ -    if (__builtin_expect (atomic_compare_and_exchange_bool_acq (__futex, id,  \ -								0), 0))	      \ -      __val = __lll_robust_lock_wait (__futex, private);		      \ -    __val;								      \ -  }) -#define lll_robust_lock(futex, id, private) \ -  __lll_robust_lock (&(futex), id, private) - - -#define __lll_cond_lock(futex, private)					      \ -  ((void) ({								      \ -    int *__futex = (futex);						      \ -    if (__builtin_expect (atomic_exchange_acq (__futex, 2), 0))		      \ -      __lll_lock_wait (__futex, private);				      \ -  })) -#define lll_cond_lock(futex, private) __lll_cond_lock (&(futex), private) - - -#define lll_robust_cond_lock(futex, id, private) \ -  __lll_robust_lock (&(futex), (id) | FUTEX_WAITERS, private) - - -extern int __lll_timedlock_wait (int *futex, const struct timespec *, -				 int private) attribute_hidden; -extern int __lll_robust_timedlock_wait (int *futex, const struct timespec *, -					int private) attribute_hidden; - -#define __lll_timedlock(futex, abstime, private)			      \ -  ({									      \ -     int *__futex = (futex);						      \ -     int __val = 0;							      \ -									      \ -     if (__builtin_expect (atomic_exchange_acq (__futex, 1), 0))	      \ -       __val = __lll_timedlock_wait (__futex, abstime, private);	      \ -     __val;								      \ -  }) -#define lll_timedlock(futex, abstime, private) \ -  __lll_timedlock (&(futex), abstime, private) - - -#define __lll_robust_timedlock(futex, abstime, id, private)		      \ -  ({									      \ -    int *__futex = (futex);						      \ -    int __val = 0;							      \ -									      \ -    if (__builtin_expect (atomic_compare_and_exchange_bool_acq (__futex, id,  \ -								0), 0))	      \ -      __val = __lll_robust_timedlock_wait (__futex, abstime, private);	      \ -    __val;								      \ -  }) -#define lll_robust_timedlock(futex, abstime, id, private) \ -  __lll_robust_timedlock (&(futex), abstime, id, private) - - -#define __lll_unlock(futex, private) \ -  (void)							\ -    ({ int *__futex = (futex);					\ -       int __oldval = atomic_exchange_rel (__futex, 0);		\ -       if (__builtin_expect (__oldval > 1, 0))			\ -	 lll_futex_wake (__futex, 1, private);			\ -    }) -#define lll_unlock(futex, private) __lll_unlock(&(futex), private) - - -#define __lll_robust_unlock(futex, private) \ -  (void)							\ -    ({ int *__futex = (futex);					\ -       int __oldval = atomic_exchange_rel (__futex, 0);		\ -       if (__builtin_expect (__oldval & FUTEX_WAITERS, 0))	\ -	 lll_futex_wake (__futex, 1, private);			\ -    }) -#define lll_robust_unlock(futex, private) \ -  __lll_robust_unlock(&(futex), private) - - -#define lll_islocked(futex) \ -  (futex != 0) - - -/* Our internal lock implementation is identical to the binary-compatible -   mutex implementation. */ - -/* Initializers for lock.  */ -#define LLL_LOCK_INITIALIZER		(0) -#define LLL_LOCK_INITIALIZER_LOCKED	(1) - -/* The states of a lock are: -    0  -  untaken -    1  -  taken by one user -   >1  -  taken by more users */ - -/* The kernel notifies a process which uses CLONE_CLEARTID via futex -   wakeup when the clone terminates.  The memory location contains the -   thread ID while the clone is running and is reset to zero -   afterwards.	*/ -#define lll_wait_tid(tid) \ -  do {					\ -    __typeof (tid) __tid;		\ -    while ((__tid = (tid)) != 0)	\ -      lll_futex_wait (&(tid), __tid, LLL_SHARED);\ -  } while (0) - -extern int __lll_timedwait_tid (int *, const struct timespec *) -     attribute_hidden; - -#define lll_timedwait_tid(tid, abstime) \ -  ({							\ -    int __res = 0;					\ -    if ((tid) != 0)					\ -      __res = __lll_timedwait_tid (&(tid), (abstime));	\ -    __res;						\ -  }) - -#endif	/* lowlevellock.h */ diff --git a/libpthread/nptl/sysdeps/unix/sysv/linux/or1k/lowlevellock.h b/libpthread/nptl/sysdeps/unix/sysv/linux/or1k/lowlevellock.h deleted file mode 100644 index 32b004486..000000000 --- a/libpthread/nptl/sysdeps/unix/sysv/linux/or1k/lowlevellock.h +++ /dev/null @@ -1,323 +0,0 @@ -/* Copyright (C) 2005-2013 Free Software Foundation, Inc. - -   The GNU C Library is free software; you can redistribute it and/or -   modify it under the terms of the GNU Lesser General Public -   License as published by the Free Software Foundation; either -   version 2.1 of the License, or (at your option) any later version. - -   The GNU C Library is distributed in the hope that it will be useful, -   but WITHOUT ANY WARRANTY; without even the implied warranty of -   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.	 See the GNU -   Lesser General Public License for more details. - -   You should have received a copy of the GNU Lesser General Public -   License along with the GNU C Library.  If not, see -   <http://www.gnu.org/licenses/>.  */ - -#ifndef _LOWLEVELLOCK_H -#define _LOWLEVELLOCK_H	1 - -#include <time.h> -#include <sys/param.h> -#include <bits/pthreadtypes.h> -#include <atomic.h> -#include <sysdep.h> -#include <bits/kernel-features.h> - - -#define FUTEX_WAIT		0 -#define FUTEX_WAKE		1 -#define FUTEX_REQUEUE		3 -#define FUTEX_CMP_REQUEUE	4 -#define FUTEX_WAKE_OP		5 -#define FUTEX_OP_CLEAR_WAKE_IF_GT_ONE	((4 << 24) | 1) -#define FUTEX_LOCK_PI		6 -#define FUTEX_UNLOCK_PI		7 -#define FUTEX_TRYLOCK_PI	8 -#define FUTEX_WAIT_BITSET	9 -#define FUTEX_WAKE_BITSET	10 -#define FUTEX_WAIT_REQUEUE_PI   11 -#define FUTEX_CMP_REQUEUE_PI    12 -#define FUTEX_PRIVATE_FLAG	128 -#define FUTEX_CLOCK_REALTIME	256 - -#define FUTEX_BITSET_MATCH_ANY	0xffffffff - -/* Values for 'private' parameter of locking macros.  Yes, the -   definition seems to be backwards.  But it is not.  The bit will be -   reversed before passing to the system call.  */ -#define LLL_PRIVATE	0 -#define LLL_SHARED	FUTEX_PRIVATE_FLAG - - -#if !defined NOT_IN_libc || defined IS_IN_rtld -/* In libc.so or ld.so all futexes are private.  */ -# ifdef __ASSUME_PRIVATE_FUTEX -#  define __lll_private_flag(fl, private) \ -  ((fl) | FUTEX_PRIVATE_FLAG) -# else -#  define __lll_private_flag(fl, private) \ -  ((fl) | THREAD_GETMEM (THREAD_SELF, header.private_futex)) -# endif -#else -# ifdef __ASSUME_PRIVATE_FUTEX -#  define __lll_private_flag(fl, private) \ -  (((fl) | FUTEX_PRIVATE_FLAG) ^ (private)) -# else -#  define __lll_private_flag(fl, private) \ -  (__builtin_constant_p (private)					      \ -   ? ((private) == 0							      \ -      ? ((fl) | THREAD_GETMEM (THREAD_SELF, header.private_futex))	      \ -      : (fl))								      \ -   : ((fl) | (((private) ^ FUTEX_PRIVATE_FLAG)				      \ -	      & THREAD_GETMEM (THREAD_SELF, header.private_futex)))) -# endif -#endif - - -#define lll_futex_wait(futexp, val, private) \ -  lll_futex_timed_wait(futexp, val, NULL, private) - -#define lll_futex_timed_wait(futexp, val, timespec, private) \ -  ({									      \ -    INTERNAL_SYSCALL_DECL (__err);					      \ -    long int __ret;							      \ -    __ret = INTERNAL_SYSCALL (futex, __err, 4, (futexp),		      \ -			      __lll_private_flag (FUTEX_WAIT, private),	      \ -			      (val), (timespec));			      \ -    __ret;								      \ -  }) - -#define lll_futex_timed_wait_bitset(futexp, val, timespec, clockbit, private) \ -  ({									\ -    INTERNAL_SYSCALL_DECL (__err);					\ -    long int __ret;							\ -    int __op = FUTEX_WAIT_BITSET | clockbit;				\ -    __ret = INTERNAL_SYSCALL (futex, __err, 6, (futexp),		\ -			      __lll_private_flag (__op, private),	\ -			      (val), (timespec), NULL /* Unused.  */,	\ -			      FUTEX_BITSET_MATCH_ANY);			\ -    __ret;								\ -  }) - -#define lll_futex_wake(futexp, nr, private) \ -  ({									      \ -    INTERNAL_SYSCALL_DECL (__err);					      \ -    long int __ret;							      \ -    __ret = INTERNAL_SYSCALL (futex, __err, 4, (futexp),		      \ -			      __lll_private_flag (FUTEX_WAKE, private),	      \ -			      (nr), 0);					      \ -    __ret;								      \ -  }) - -#define lll_robust_dead(futexv, private) \ -  do									      \ -    {									      \ -      int *__futexp = &(futexv);					      \ -      atomic_or (__futexp, FUTEX_OWNER_DIED);				      \ -      lll_futex_wake (__futexp, 1, private);				      \ -    }									      \ -  while (0) - -/* Returns non-zero if error happened, zero if success.  */ -#define lll_futex_requeue(futexp, nr_wake, nr_move, mutex, val, private) \ -  ({									      \ -    INTERNAL_SYSCALL_DECL (__err);					      \ -    long int __ret;							      \ -    __ret = INTERNAL_SYSCALL (futex, __err, 6, (futexp),		      \ -			      __lll_private_flag (FUTEX_CMP_REQUEUE, private),\ -			      (nr_wake), (nr_move), (mutex), (val));	      \ -    INTERNAL_SYSCALL_ERROR_P (__ret, __err);				      \ -  }) - - -/* Returns non-zero if error happened, zero if success.  */ -#define lll_futex_wake_unlock(futexp, nr_wake, nr_wake2, futexp2, private) \ -  ({									      \ -    INTERNAL_SYSCALL_DECL (__err);					      \ -    long int __ret;							      \ -    __ret = INTERNAL_SYSCALL (futex, __err, 6, (futexp),		      \ -			      __lll_private_flag (FUTEX_WAKE_OP, private),    \ -			      (nr_wake), (nr_wake2), (futexp2),		      \ -			      FUTEX_OP_CLEAR_WAKE_IF_GT_ONE);		      \ -    INTERNAL_SYSCALL_ERROR_P (__ret, __err);				      \ -  }) - -/* Priority Inheritance support.  */ -#define lll_futex_wait_requeue_pi(futexp, val, mutex, private) \ -  lll_futex_timed_wait_requeue_pi (futexp, val, NULL, 0, mutex, private) - -#define lll_futex_timed_wait_requeue_pi(futexp, val, timespec, clockbit,      \ -					mutex, private)			      \ -  ({									      \ -    INTERNAL_SYSCALL_DECL (__err);					      \ -    int __op = FUTEX_WAIT_REQUEUE_PI | clockbit;			      \ -									      \ -    INTERNAL_SYSCALL (futex, __err, 5, (futexp),			      \ -		      __lll_private_flag (__op, private),		      \ -		      (val), (timespec), mutex); 			      \ -  }) - -#define lll_futex_cmp_requeue_pi(futexp, nr_wake, nr_move, mutex, val, priv)  \ -  ({									      \ -    INTERNAL_SYSCALL_DECL (__err);					      \ -    long int __ret;							      \ -									      \ -    __ret = INTERNAL_SYSCALL (futex, __err, 6, (futexp),		      \ -			      __lll_private_flag (FUTEX_CMP_REQUEUE_PI, priv),\ -			      (nr_wake), (nr_move), (mutex), (val));	      \ -    INTERNAL_SYSCALL_ERROR_P (__ret, __err);				      \ -  }) - - -#define lll_trylock(lock)	\ -  atomic_compare_and_exchange_val_acq(&(lock), 1, 0) - -#define lll_cond_trylock(lock)	\ -  atomic_compare_and_exchange_val_acq(&(lock), 2, 0) - -#define __lll_robust_trylock(futex, id) \ -  (atomic_compare_and_exchange_val_acq (futex, id, 0) != 0) -#define lll_robust_trylock(lock, id) \ -  __lll_robust_trylock (&(lock), id) - -extern void __lll_lock_wait_private (int *futex) attribute_hidden; -extern void __lll_lock_wait (int *futex, int private) attribute_hidden; -extern int __lll_robust_lock_wait (int *futex, int private) attribute_hidden; - -#define __lll_lock(futex, private)					      \ -  ((void) ({								      \ -    int *__futex = (futex);						      \ -    if (__builtin_expect (atomic_compare_and_exchange_val_acq (__futex,       \ -								1, 0), 0))    \ -      {									      \ -	if (__builtin_constant_p (private) && (private) == LLL_PRIVATE)	      \ -	  __lll_lock_wait_private (__futex);				      \ -	else								      \ -	  __lll_lock_wait (__futex, private);				      \ -      }									      \ -  })) -#define lll_lock(futex, private) __lll_lock (&(futex), private) - - -#define __lll_robust_lock(futex, id, private)				      \ -  ({									      \ -    int *__futex = (futex);						      \ -    int __val = 0;							      \ -									      \ -    if (__builtin_expect (atomic_compare_and_exchange_bool_acq (__futex, id,  \ -								0), 0))	      \ -      __val = __lll_robust_lock_wait (__futex, private);		      \ -    __val;								      \ -  }) -#define lll_robust_lock(futex, id, private) \ -  __lll_robust_lock (&(futex), id, private) - - -#define __lll_cond_lock(futex, private)					      \ -  ((void) ({								      \ -    int *__futex = (futex);						      \ -    if (__builtin_expect (atomic_exchange_acq (__futex, 2), 0))		      \ -      __lll_lock_wait (__futex, private);				      \ -  })) -#define lll_cond_lock(futex, private) __lll_cond_lock (&(futex), private) - - -#define lll_robust_cond_lock(futex, id, private) \ -  __lll_robust_lock (&(futex), (id) | FUTEX_WAITERS, private) - - -extern int __lll_timedlock_wait (int *futex, const struct timespec *, -				 int private) attribute_hidden; -extern int __lll_robust_timedlock_wait (int *futex, const struct timespec *, -					int private) attribute_hidden; - -#define __lll_timedlock(futex, abstime, private)			      \ -  ({									      \ -     int *__futex = (futex);						      \ -     int __val = 0;							      \ -									      \ -     if (__builtin_expect (atomic_exchange_acq (__futex, 1), 0))	      \ -       __val = __lll_timedlock_wait (__futex, abstime, private);	      \ -     __val;								      \ -  }) -#define lll_timedlock(futex, abstime, private) \ -  __lll_timedlock (&(futex), abstime, private) - - -#define __lll_robust_timedlock(futex, abstime, id, private)		      \ -  ({									      \ -    int *__futex = (futex);						      \ -    int __val = 0;							      \ -									      \ -    if (__builtin_expect (atomic_compare_and_exchange_bool_acq (__futex, id,  \ -								0), 0))	      \ -      __val = __lll_robust_timedlock_wait (__futex, abstime, private);	      \ -    __val;								      \ -  }) -#define lll_robust_timedlock(futex, abstime, id, private) \ -  __lll_robust_timedlock (&(futex), abstime, id, private) - - -#define __lll_unlock(futex, private) \ -  (void)							\ -    ({ int *__futex = (futex);					\ -       int __oldval = atomic_exchange_rel (__futex, 0);		\ -       if (__builtin_expect (__oldval > 1, 0))			\ -	 lll_futex_wake (__futex, 1, private);			\ -       lll_futex_wake (__futex, 1, private);			\ -    }) -#define lll_unlock(futex, private) __lll_unlock(&(futex), private) - - -#define __lll_robust_unlock(futex, private) \ -  (void)							\ -    ({ int *__futex = (futex);					\ -       int __oldval = atomic_exchange_rel (__futex, 0);		\ -       if (__builtin_expect (__oldval & FUTEX_WAITERS, 0))	\ -	 lll_futex_wake (__futex, 1, private);			\ -       lll_futex_wake (__futex, 1, private);			\ -    }) -#define lll_robust_unlock(futex, private) \ -  __lll_robust_unlock(&(futex), private) - - -#define lll_islocked(futex) \ -  (futex != 0) - - -/* Our internal lock implementation is identical to the binary-compatible -   mutex implementation. */ - -/* Initializers for lock.  */ -#define LLL_LOCK_INITIALIZER		(0) -#define LLL_LOCK_INITIALIZER_LOCKED	(1) - -/* The states of a lock are: -    0  -  untaken -    1  -  taken by one user -   >1  -  taken by more users */ - -/* The kernel notifies a process which uses CLONE_CHILD_CLEARTID via futex -   wakeup when the clone terminates.  The memory location contains the -   thread ID while the clone is running and is reset to zero -   afterwards.	*/ -#define lll_wait_tid(tid) \ -  do {					\ -    __typeof (tid) __tid;		\ -    while ((__tid = (tid)) != 0)	\ -      lll_futex_wait (&(tid), __tid, LLL_SHARED);\ -  } while (0) - -extern int __lll_timedwait_tid (int *, const struct timespec *) -     attribute_hidden; - -#define lll_timedwait_tid(tid, abstime) \ -  ({							\ -    int __res = 0;					\ -    if ((tid) != 0)					\ -      __res = __lll_timedwait_tid (&(tid), (abstime));	\ -    __res;						\ -  }) - -#endif	/* lowlevellock.h */ diff --git a/libpthread/nptl/sysdeps/unix/sysv/linux/powerpc/lowlevellock.h b/libpthread/nptl/sysdeps/unix/sysv/linux/powerpc/lowlevellock.h deleted file mode 100644 index a04916815..000000000 --- a/libpthread/nptl/sysdeps/unix/sysv/linux/powerpc/lowlevellock.h +++ /dev/null @@ -1,314 +0,0 @@ -/* Copyright (C) 2003, 2004, 2006-2008, 2009 Free Software Foundation, Inc. -   This file is part of the GNU C Library. -   Contributed by Paul Mackerras <paulus@au.ibm.com>, 2003. - -   The GNU C Library is free software; you can redistribute it and/or -   modify it under the terms of the GNU Lesser General Public -   License as published by the Free Software Foundation; either -   version 2.1 of the License, or (at your option) any later version. - -   The GNU C Library is distributed in the hope that it will be useful, -   but WITHOUT ANY WARRANTY; without even the implied warranty of -   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.	 See the GNU -   Lesser General Public License for more details. - -   You should have received a copy of the GNU Lesser General Public -   License along with the GNU C Library; if not, see -   <http://www.gnu.org/licenses/>.  */ - -#ifndef _LOWLEVELLOCK_H -#define _LOWLEVELLOCK_H	1 - -#include <time.h> -#include <sys/param.h> -#include <bits/pthreadtypes.h> -#include <atomic.h> -#include <bits/kernel-features.h> -#include <sysdep.h> - -#ifndef __NR_futex -# define __NR_futex		221 -#endif -#define FUTEX_WAIT		0 -#define FUTEX_WAKE		1 -#define FUTEX_REQUEUE		3 -#define FUTEX_CMP_REQUEUE	4 -#define FUTEX_WAKE_OP		5 -#define FUTEX_OP_CLEAR_WAKE_IF_GT_ONE	((4 << 24) | 1) -#define FUTEX_LOCK_PI		6 -#define FUTEX_UNLOCK_PI		7 -#define FUTEX_TRYLOCK_PI	8 -#define FUTEX_WAIT_BITSET	9 -#define FUTEX_WAKE_BITSET	10 -#define FUTEX_PRIVATE_FLAG	128 -#define FUTEX_CLOCK_REALTIME	256 - -#define FUTEX_BITSET_MATCH_ANY	0xffffffff - -/* Values for 'private' parameter of locking macros.  Yes, the -   definition seems to be backwards.  But it is not.  The bit will be -   reversed before passing to the system call.  */ -#define LLL_PRIVATE	0 -#define LLL_SHARED	FUTEX_PRIVATE_FLAG - -#if !defined NOT_IN_libc || defined IS_IN_rtld -/* In libc.so or ld.so all futexes are private.  */ -# ifdef __ASSUME_PRIVATE_FUTEX -#  define __lll_private_flag(fl, private) \ -  ((fl) | FUTEX_PRIVATE_FLAG) -# else -#  define __lll_private_flag(fl, private) \ -  ((fl) | THREAD_GETMEM (THREAD_SELF, header.private_futex)) -# endif -#else -# ifdef __ASSUME_PRIVATE_FUTEX -#  define __lll_private_flag(fl, private) \ -  (((fl) | FUTEX_PRIVATE_FLAG) ^ (private)) -# else -#  define __lll_private_flag(fl, private) \ -  (__builtin_constant_p (private)					      \ -   ? ((private) == 0							      \ -      ? ((fl) | THREAD_GETMEM (THREAD_SELF, header.private_futex))	      \ -      : (fl))								      \ -   : ((fl) | (((private) ^ FUTEX_PRIVATE_FLAG)				      \ -	      & THREAD_GETMEM (THREAD_SELF, header.private_futex)))) -# endif -#endif - -#define lll_futex_wait(futexp, val, private) \ -  lll_futex_timed_wait (futexp, val, NULL, private) - -#define lll_futex_timed_wait(futexp, val, timespec, private) \ -  ({									      \ -    INTERNAL_SYSCALL_DECL (__err);					      \ -    long int __ret;							      \ -									      \ -    __ret = INTERNAL_SYSCALL (futex, __err, 4, (futexp),		      \ -			      __lll_private_flag (FUTEX_WAIT, private),	      \ -			      (val), (timespec));			      \ -    INTERNAL_SYSCALL_ERROR_P (__ret, __err) ? -__ret : __ret;		      \ -  }) - -#define lll_futex_wake(futexp, nr, private) \ -  ({									      \ -    INTERNAL_SYSCALL_DECL (__err);					      \ -    long int __ret;							      \ -									      \ -    __ret = INTERNAL_SYSCALL (futex, __err, 4, (futexp),		      \ -			      __lll_private_flag (FUTEX_WAKE, private),	      \ -			      (nr), 0);					      \ -    INTERNAL_SYSCALL_ERROR_P (__ret, __err) ? -__ret : __ret;		      \ -  }) - -#define lll_robust_dead(futexv, private) \ -  do									      \ -    {									      \ -      INTERNAL_SYSCALL_DECL (__err);					      \ -      int *__futexp = &(futexv);					      \ -									      \ -      atomic_or (__futexp, FUTEX_OWNER_DIED);				      \ -      INTERNAL_SYSCALL (futex, __err, 4, __futexp,			      \ -			__lll_private_flag (FUTEX_WAKE, private), 1, 0);      \ -    }									      \ -  while (0) - -/* Returns non-zero if error happened, zero if success.  */ -#define lll_futex_requeue(futexp, nr_wake, nr_move, mutex, val, private) \ -  ({									      \ -    INTERNAL_SYSCALL_DECL (__err);					      \ -    long int __ret;							      \ -									      \ -    __ret = INTERNAL_SYSCALL (futex, __err, 6, (futexp),		      \ -			      __lll_private_flag (FUTEX_CMP_REQUEUE, private),\ -			      (nr_wake), (nr_move), (mutex), (val));	      \ -    INTERNAL_SYSCALL_ERROR_P (__ret, __err);				      \ -  }) - -/* Returns non-zero if error happened, zero if success.  */ -#define lll_futex_wake_unlock(futexp, nr_wake, nr_wake2, futexp2, private) \ -  ({									      \ -    INTERNAL_SYSCALL_DECL (__err);					      \ -    long int __ret;							      \ -									      \ -    __ret = INTERNAL_SYSCALL (futex, __err, 6, (futexp),		      \ -			      __lll_private_flag (FUTEX_WAKE_OP, private),    \ -			      (nr_wake), (nr_wake2), (futexp2),		      \ -			      FUTEX_OP_CLEAR_WAKE_IF_GT_ONE);		      \ -    INTERNAL_SYSCALL_ERROR_P (__ret, __err);				      \ -  }) - - -#ifdef UP -# define __lll_acq_instr	"" -# define __lll_rel_instr	"" -#else -# define __lll_acq_instr	"isync" -# ifdef _ARCH_PWR4 -/* - * Newer powerpc64 processors support the new "light weight" sync (lwsync) - * So if the build is using -mcpu=[power4,power5,power5+,970] we can - * safely use lwsync. - */ -#  define __lll_rel_instr	"lwsync" -# else -/* - * Older powerpc32 processors don't support the new "light weight" - * sync (lwsync).  So the only safe option is to use normal sync - * for all powerpc32 applications. - */ -#  define __lll_rel_instr	"sync" -# endif -#endif - -/* Set *futex to ID if it is 0, atomically.  Returns the old value */ -#define __lll_robust_trylock(futex, id) \ -  ({ int __val;								      \ -     __asm__ __volatile__ ("1:	lwarx	%0,0,%2" MUTEX_HINT_ACQ "\n"	      \ -		       "	cmpwi	0,%0,0\n"			      \ -		       "	bne	2f\n"				      \ -		       "	stwcx.	%3,0,%2\n"			      \ -		       "	bne-	1b\n"				      \ -		       "2:	" __lll_acq_instr			      \ -		       : "=&r" (__val), "=m" (*futex)			      \ -		       : "r" (futex), "r" (id), "m" (*futex)		      \ -		       : "cr0", "memory");				      \ -     __val;								      \ -  }) - -#define lll_robust_trylock(lock, id) __lll_robust_trylock (&(lock), id) - -/* Set *futex to 1 if it is 0, atomically.  Returns the old value */ -#define __lll_trylock(futex) __lll_robust_trylock (futex, 1) - -#define lll_trylock(lock)	__lll_trylock (&(lock)) - -/* Set *futex to 2 if it is 0, atomically.  Returns the old value */ -#define __lll_cond_trylock(futex) __lll_robust_trylock (futex, 2) - -#define lll_cond_trylock(lock)	__lll_cond_trylock (&(lock)) - - -extern void __lll_lock_wait_private (int *futex) attribute_hidden; -extern void __lll_lock_wait (int *futex, int private) attribute_hidden; -extern int __lll_robust_lock_wait (int *futex, int private) attribute_hidden; - -#define lll_lock(lock, private) \ -  (void) ({								      \ -    int *__futex = &(lock);						      \ -    if (__builtin_expect (atomic_compare_and_exchange_val_acq (__futex, 1, 0),\ -			  0) != 0)					      \ -      {									      \ -	if (__builtin_constant_p (private) && (private) == LLL_PRIVATE)	      \ -	  __lll_lock_wait_private (__futex);				      \ -	else								      \ -	  __lll_lock_wait (__futex, private);				      \ -      }									      \ -  }) - -#define lll_robust_lock(lock, id, private) \ -  ({									      \ -    int *__futex = &(lock);						      \ -    int __val = 0;							      \ -    if (__builtin_expect (atomic_compare_and_exchange_bool_acq (__futex, id,  \ -								0), 0))	      \ -      __val = __lll_robust_lock_wait (__futex, private);		      \ -    __val;								      \ -  }) - -#define lll_cond_lock(lock, private) \ -  (void) ({								      \ -    int *__futex = &(lock);						      \ -    if (__builtin_expect (atomic_compare_and_exchange_val_acq (__futex, 2, 0),\ -			  0) != 0)					      \ -      __lll_lock_wait (__futex, private);				      \ -  }) - -#define lll_robust_cond_lock(lock, id, private) \ -  ({									      \ -    int *__futex = &(lock);						      \ -    int __val = 0;							      \ -    int __id = id | FUTEX_WAITERS;					      \ -    if (__builtin_expect (atomic_compare_and_exchange_bool_acq (__futex, __id,\ -								0), 0))	      \ -      __val = __lll_robust_lock_wait (__futex, private);		      \ -    __val;								      \ -  }) - - -extern int __lll_timedlock_wait -  (int *futex, const struct timespec *, int private) attribute_hidden; -extern int __lll_robust_timedlock_wait -  (int *futex, const struct timespec *, int private) attribute_hidden; - -#define lll_timedlock(lock, abstime, private) \ -  ({									      \ -    int *__futex = &(lock);						      \ -    int __val = 0;							      \ -    if (__builtin_expect (atomic_compare_and_exchange_val_acq (__futex, 1, 0),\ -			  0) != 0)					      \ -      __val = __lll_timedlock_wait (__futex, abstime, private);		      \ -    __val;								      \ -  }) - -#define lll_robust_timedlock(lock, abstime, id, private) \ -  ({									      \ -    int *__futex = &(lock);						      \ -    int __val = 0;							      \ -    if (__builtin_expect (atomic_compare_and_exchange_bool_acq (__futex, id,  \ -								0), 0))	      \ -      __val = __lll_robust_timedlock_wait (__futex, abstime, private);	      \ -    __val;								      \ -  }) - -#define lll_unlock(lock, private) \ -  ((void) ({								      \ -    int *__futex = &(lock);						      \ -    int __val = atomic_exchange_rel (__futex, 0);			      \ -    if (__builtin_expect (__val > 1, 0))				      \ -      lll_futex_wake (__futex, 1, private);				      \ -  })) - -#define lll_robust_unlock(lock, private) \ -  ((void) ({								      \ -    int *__futex = &(lock);						      \ -    int __val = atomic_exchange_rel (__futex, 0);			      \ -    if (__builtin_expect (__val & FUTEX_WAITERS, 0))			      \ -      lll_futex_wake (__futex, 1, private);				      \ -  })) - -#define lll_islocked(futex) \ -  (futex != 0) - - -/* Initializers for lock.  */ -#define LLL_LOCK_INITIALIZER		(0) -#define LLL_LOCK_INITIALIZER_LOCKED	(1) - -/* The states of a lock are: -    0  -  untaken -    1  -  taken by one user -   >1  -  taken by more users */ - -/* The kernel notifies a process which uses CLONE_CLEARTID via futex -   wakeup when the clone terminates.  The memory location contains the -   thread ID while the clone is running and is reset to zero -   afterwards.	*/ -#define lll_wait_tid(tid) \ -  do {									      \ -    __typeof (tid) __tid;						      \ -    while ((__tid = (tid)) != 0)					      \ -      lll_futex_wait (&(tid), __tid, LLL_SHARED);			      \ -  } while (0) - -extern int __lll_timedwait_tid (int *, const struct timespec *) -     attribute_hidden; - -#define lll_timedwait_tid(tid, abstime) \ -  ({									      \ -    int __res = 0;							      \ -    if ((tid) != 0)							      \ -      __res = __lll_timedwait_tid (&(tid), (abstime));			      \ -    __res;								      \ -  }) - -#endif	/* lowlevellock.h */ diff --git a/libpthread/nptl/sysdeps/unix/sysv/linux/sh/lowlevellock.h b/libpthread/nptl/sysdeps/unix/sysv/linux/sh/lowlevellock.h deleted file mode 100644 index abe6e9c37..000000000 --- a/libpthread/nptl/sysdeps/unix/sysv/linux/sh/lowlevellock.h +++ /dev/null @@ -1,293 +0,0 @@ -/* Copyright (C) 2005-2013 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 -   modify it under the terms of the GNU Lesser General Public -   License as published by the Free Software Foundation; either -   version 2.1 of the License, or (at your option) any later version. - -   The GNU C Library is distributed in the hope that it will be useful, -   but WITHOUT ANY WARRANTY; without even the implied warranty of -   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.	 See the GNU -   Lesser General Public License for more details. - -   You should have received a copy of the GNU Lesser General Public -   License along with the GNU C Library.  If not, see -   <http://www.gnu.org/licenses/>.  */ - -#ifndef _LOWLEVELLOCK_H -#define _LOWLEVELLOCK_H	1 - -#include <time.h> -#include <sys/param.h> -#include <bits/pthreadtypes.h> -#include <atomic.h> -#include <sysdep.h> -#include <bits/kernel-features.h> - -#define FUTEX_WAIT		0 -#define FUTEX_WAKE		1 -#define FUTEX_REQUEUE		3 -#define FUTEX_CMP_REQUEUE	4 -#define FUTEX_WAKE_OP		5 -#define FUTEX_OP_CLEAR_WAKE_IF_GT_ONE	((4 << 24) | 1) -#define FUTEX_LOCK_PI		6 -#define FUTEX_UNLOCK_PI		7 -#define FUTEX_TRYLOCK_PI	8 -#define FUTEX_WAIT_BITSET	9 -#define FUTEX_WAKE_BITSET	10 -#define FUTEX_PRIVATE_FLAG	128 -#define FUTEX_CLOCK_REALTIME	256 - -#define FUTEX_BITSET_MATCH_ANY	0xffffffff - -/* Values for 'private' parameter of locking macros.  Yes, the -   definition seems to be backwards.  But it is not.  The bit will be -   reversed before passing to the system call.  */ -#define LLL_PRIVATE	0 -#define LLL_SHARED	FUTEX_PRIVATE_FLAG - - -#if !defined NOT_IN_libc || defined IS_IN_rtld -/* In libc.so or ld.so all futexes are private.  */ -# ifdef __ASSUME_PRIVATE_FUTEX -#  define __lll_private_flag(fl, private) \ -  ((fl) | FUTEX_PRIVATE_FLAG) -# else -#  define __lll_private_flag(fl, private) \ -  ((fl) | THREAD_GETMEM (THREAD_SELF, header.private_futex)) -# endif -#else -# ifdef __ASSUME_PRIVATE_FUTEX -#  define __lll_private_flag(fl, private) \ -  (((fl) | FUTEX_PRIVATE_FLAG) ^ (private)) -# else -#  define __lll_private_flag(fl, private) \ -  (__builtin_constant_p (private)					      \ -   ? ((private) == 0							      \ -      ? ((fl) | THREAD_GETMEM (THREAD_SELF, header.private_futex))	      \ -      : (fl))								      \ -   : ((fl) | (((private) ^ FUTEX_PRIVATE_FLAG)				      \ -	      & THREAD_GETMEM (THREAD_SELF, header.private_futex)))) -# endif -#endif - - -#define lll_futex_wait(futexp, val, private) \ -  lll_futex_timed_wait(futexp, val, NULL, private) - -#define lll_futex_timed_wait(futexp, val, timespec, private) \ -  ({									      \ -    INTERNAL_SYSCALL_DECL (__err);					      \ -    long int __ret;							      \ -    __ret = INTERNAL_SYSCALL (futex, __err, 4, (futexp),		      \ -			      __lll_private_flag (FUTEX_WAIT, private),	      \ -			      (val), (timespec));			      \ -    __ret;								      \ -  }) - -#define lll_futex_timed_wait_bitset(futexp, val, timespec, clockbit, private) \ -  ({									\ -    INTERNAL_SYSCALL_DECL (__err);					\ -    long int __ret;							\ -    int __op = FUTEX_WAIT_BITSET | clockbit;				\ -    __ret = INTERNAL_SYSCALL (futex, __err, 6, (futexp),		\ -			      __lll_private_flag (__op, private),	\ -			      (val), (timespec), NULL /* Unused.  */,	\ -			      FUTEX_BITSET_MATCH_ANY);			\ -    __ret;								\ -  }) - -#define lll_futex_wake(futexp, nr, private) \ -  ({									      \ -    INTERNAL_SYSCALL_DECL (__err);					      \ -    long int __ret;							      \ -    __ret = INTERNAL_SYSCALL (futex, __err, 4, (futexp),		      \ -			      __lll_private_flag (FUTEX_WAKE, private),	      \ -			      (nr), 0);					      \ -    __ret;								      \ -  }) - -#define lll_robust_dead(futexv, private) \ -  do									      \ -    {									      \ -      int *__futexp = &(futexv);					      \ -      atomic_or (__futexp, FUTEX_OWNER_DIED);				      \ -      lll_futex_wake (__futexp, 1, private);				      \ -    }									      \ -  while (0) - -/* Returns non-zero if error happened, zero if success.  */ -#define lll_futex_requeue(futexp, nr_wake, nr_move, mutex, val, private) \ -  ({									      \ -    INTERNAL_SYSCALL_DECL (__err);					      \ -    long int __ret;							      \ -    __ret = INTERNAL_SYSCALL (futex, __err, 6, (futexp),		      \ -			      __lll_private_flag (FUTEX_CMP_REQUEUE, private),\ -			      (nr_wake), (nr_move), (mutex), (val));	      \ -    INTERNAL_SYSCALL_ERROR_P (__ret, __err);				      \ -  }) - - -/* Returns non-zero if error happened, zero if success.  */ -#define lll_futex_wake_unlock(futexp, nr_wake, nr_wake2, futexp2, private) \ -  ({									      \ -    INTERNAL_SYSCALL_DECL (__err);					      \ -    long int __ret;							      \ -    __ret = INTERNAL_SYSCALL (futex, __err, 6, (futexp),		      \ -			      __lll_private_flag (FUTEX_WAKE_OP, private),    \ -			      (nr_wake), (nr_wake2), (futexp2),		      \ -			      FUTEX_OP_CLEAR_WAKE_IF_GT_ONE);		      \ -    INTERNAL_SYSCALL_ERROR_P (__ret, __err);				      \ -  }) - - -#define lll_trylock(lock)	\ -  atomic_compare_and_exchange_val_acq(&(lock), 1, 0) - -#define lll_cond_trylock(lock)	\ -  atomic_compare_and_exchange_val_acq(&(lock), 2, 0) - -#define __lll_robust_trylock(futex, id) \ -  (atomic_compare_and_exchange_val_acq (futex, id, 0) != 0) -#define lll_robust_trylock(lock, id) \ -  __lll_robust_trylock (&(lock), id) - -extern void __lll_lock_wait_private (int *futex) attribute_hidden; -extern void __lll_lock_wait (int *futex, int private) attribute_hidden; -extern int __lll_robust_lock_wait (int *futex, int private) attribute_hidden; - -#define __lll_lock(futex, private)					      \ -  ((void) ({								      \ -    int *__futex = (futex);						      \ -    if (__builtin_expect (atomic_compare_and_exchange_val_acq (__futex,       \ -								1, 0), 0))    \ -      {									      \ -	if (__builtin_constant_p (private) && (private) == LLL_PRIVATE)	      \ -	  __lll_lock_wait_private (__futex);				      \ -	else								      \ -	  __lll_lock_wait (__futex, private);				      \ -      }									      \ -  })) -#define lll_lock(futex, private) __lll_lock (&(futex), private) - - -#define __lll_robust_lock(futex, id, private)				      \ -  ({									      \ -    int *__futex = (futex);						      \ -    int __val = 0;							      \ -									      \ -    if (__builtin_expect (atomic_compare_and_exchange_bool_acq (__futex, id,  \ -								0), 0))	      \ -      __val = __lll_robust_lock_wait (__futex, private);		      \ -    __val;								      \ -  }) -#define lll_robust_lock(futex, id, private) \ -  __lll_robust_lock (&(futex), id, private) - - -#define __lll_cond_lock(futex, private)					      \ -  ((void) ({								      \ -    int *__futex = (futex);						      \ -    if (__builtin_expect (atomic_exchange_acq (__futex, 2), 0))		      \ -      __lll_lock_wait (__futex, private);				      \ -  })) -#define lll_cond_lock(futex, private) __lll_cond_lock (&(futex), private) - - -#define lll_robust_cond_lock(futex, id, private) \ -  __lll_robust_lock (&(futex), (id) | FUTEX_WAITERS, private) - - -extern int __lll_timedlock_wait (int *futex, const struct timespec *, -				 int private) attribute_hidden; -extern int __lll_robust_timedlock_wait (int *futex, const struct timespec *, -					int private) attribute_hidden; - -#define __lll_timedlock(futex, abstime, private)			      \ -  ({									      \ -     int *__futex = (futex);						      \ -     int __val = 0;							      \ -									      \ -     if (__builtin_expect (atomic_exchange_acq (__futex, 1), 0))	      \ -       __val = __lll_timedlock_wait (__futex, abstime, private);	      \ -     __val;								      \ -  }) -#define lll_timedlock(futex, abstime, private) \ -  __lll_timedlock (&(futex), abstime, private) - - -#define __lll_robust_timedlock(futex, abstime, id, private)		      \ -  ({									      \ -    int *__futex = (futex);						      \ -    int __val = 0;							      \ -									      \ -    if (__builtin_expect (atomic_compare_and_exchange_bool_acq (__futex, id,  \ -								0), 0))	      \ -      __val = __lll_robust_timedlock_wait (__futex, abstime, private);	      \ -    __val;								      \ -  }) -#define lll_robust_timedlock(futex, abstime, id, private) \ -  __lll_robust_timedlock (&(futex), abstime, id, private) - - -#define __lll_unlock(futex, private) \ -  (void)							\ -    ({ int *__futex = (futex);					\ -       int __oldval = atomic_exchange_rel (__futex, 0);		\ -       if (__builtin_expect (__oldval > 1, 0))			\ -	 lll_futex_wake (__futex, 1, private);			\ -    }) -#define lll_unlock(futex, private) __lll_unlock(&(futex), private) - - -#define __lll_robust_unlock(futex, private) \ -  (void)							\ -    ({ int *__futex = (futex);					\ -       int __oldval = atomic_exchange_rel (__futex, 0);		\ -       if (__builtin_expect (__oldval & FUTEX_WAITERS, 0))	\ -	 lll_futex_wake (__futex, 1, private);			\ -    }) -#define lll_robust_unlock(futex, private) \ -  __lll_robust_unlock(&(futex), private) - - -#define lll_islocked(futex) \ -  (futex != 0) - - -/* Our internal lock implementation is identical to the binary-compatible -   mutex implementation. */ - -/* Initializers for lock.  */ -#define LLL_LOCK_INITIALIZER		(0) -#define LLL_LOCK_INITIALIZER_LOCKED	(1) - -/* The states of a lock are: -    0  -  untaken -    1  -  taken by one user -   >1  -  taken by more users */ - -/* The kernel notifies a process which uses CLONE_CHILD_CLEARTID via futex -   wakeup when the clone terminates.  The memory location contains the -   thread ID while the clone is running and is reset to zero -   afterwards.	*/ -#define lll_wait_tid(tid) \ -  do {					\ -    __typeof (tid) __tid;		\ -    while ((__tid = (tid)) != 0)	\ -      lll_futex_wait (&(tid), __tid, LLL_SHARED);\ -  } while (0) - -extern int __lll_timedwait_tid (int *, const struct timespec *) -     attribute_hidden; - -#define lll_timedwait_tid(tid, abstime) \ -  ({							\ -    int __res = 0;					\ -    if ((tid) != 0)					\ -      __res = __lll_timedwait_tid (&(tid), (abstime));	\ -    __res;						\ -  }) - -#endif	/* lowlevellock.h */ diff --git a/libpthread/nptl/sysdeps/unix/sysv/linux/sparc/lowlevellock.h b/libpthread/nptl/sysdeps/unix/sysv/linux/sparc/lowlevellock.h deleted file mode 100644 index a4475f53d..000000000 --- a/libpthread/nptl/sysdeps/unix/sysv/linux/sparc/lowlevellock.h +++ /dev/null @@ -1,296 +0,0 @@ -/* Copyright (C) 2003, 2004, 2006, 2007, 2008, 2009 -   Free Software Foundation, Inc. -   This file is part of the GNU C Library. -   Contributed by Jakub Jelinek <jakub@redhat.com>, 2003. - -   The GNU C Library is free software; you can redistribute it and/or -   modify it under the terms of the GNU Lesser General Public -   License as published by the Free Software Foundation; either -   version 2.1 of the License, or (at your option) any later version. - -   The GNU C Library is distributed in the hope that it will be useful, -   but WITHOUT ANY WARRANTY; without even the implied warranty of -   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.	 See the GNU -   Lesser General Public License for more details. - -   You should have received a copy of the GNU Lesser General Public -   License along with the GNU C Library; see the file COPYING.LIB.  If -   not, see <http://www.gnu.org/licenses/>.  */ - -#ifndef _LOWLEVELLOCK_H -#define _LOWLEVELLOCK_H	1 - -#include <time.h> -#include <sys/param.h> -#include <bits/pthreadtypes.h> -#include <atomic.h> -#include <sysdep.h> -#include <bits/kernel-features.h> - - -#define FUTEX_WAIT		0 -#define FUTEX_WAKE		1 -#define FUTEX_REQUEUE		3 -#define FUTEX_CMP_REQUEUE	4 -#define FUTEX_WAKE_OP		5 -#define FUTEX_OP_CLEAR_WAKE_IF_GT_ONE	((4 << 24) | 1) -#define FUTEX_LOCK_PI		6 -#define FUTEX_UNLOCK_PI		7 -#define FUTEX_TRYLOCK_PI	8 -#define FUTEX_WAIT_BITSET	9 -#define FUTEX_WAKE_BITSET	10 -#define FUTEX_PRIVATE_FLAG	128 -#define FUTEX_CLOCK_REALTIME	256 - -#define FUTEX_BITSET_MATCH_ANY	0xffffffff - - -/* Values for 'private' parameter of locking macros.  Yes, the -   definition seems to be backwards.  But it is not.  The bit will be -   reversed before passing to the system call.  */ -#define LLL_PRIVATE	0 -#define LLL_SHARED	FUTEX_PRIVATE_FLAG - - -#if !defined NOT_IN_libc || defined IS_IN_rtld -/* In libc.so or ld.so all futexes are private.  */ -# ifdef __ASSUME_PRIVATE_FUTEX -#  define __lll_private_flag(fl, private) \ -  ((fl) | FUTEX_PRIVATE_FLAG) -# else -#  define __lll_private_flag(fl, private) \ -  ((fl) | THREAD_GETMEM (THREAD_SELF, header.private_futex)) -# endif -#else -# ifdef __ASSUME_PRIVATE_FUTEX -#  define __lll_private_flag(fl, private) \ -  (((fl) | FUTEX_PRIVATE_FLAG) ^ (private)) -# else -#  define __lll_private_flag(fl, private) \ -  (__builtin_constant_p (private)					      \ -   ? ((private) == 0							      \ -      ? ((fl) | THREAD_GETMEM (THREAD_SELF, header.private_futex))	      \ -      : (fl))								      \ -   : ((fl) | (((private) ^ FUTEX_PRIVATE_FLAG)				      \ -	      & THREAD_GETMEM (THREAD_SELF, header.private_futex)))) -# endif -#endif - - -#define lll_futex_wait(futexp, val, private) \ -  lll_futex_timed_wait (futexp, val, NULL, private) - -#define lll_futex_timed_wait(futexp, val, timespec, private) \ -  ({									      \ -    INTERNAL_SYSCALL_DECL (__err);					      \ -    long int __ret;							      \ -									      \ -    __ret = INTERNAL_SYSCALL (futex, __err, 4, (futexp),		      \ -			      __lll_private_flag (FUTEX_WAIT, private),	      \ -			      (val), (timespec));			      \ -    __ret;								      \ -  }) - -#define lll_futex_wake(futexp, nr, private) \ -  ({									      \ -    INTERNAL_SYSCALL_DECL (__err);					      \ -    long int __ret;							      \ -									      \ -    __ret = INTERNAL_SYSCALL (futex, __err, 4, (futexp),		      \ -			      __lll_private_flag (FUTEX_WAKE, private),	      \ -			      (nr), 0);					      \ -    __ret;								      \ -  }) - -/* Returns non-zero if error happened, zero if success.  */ -#define lll_futex_requeue(futexp, nr_wake, nr_move, mutex, val, private) \ -  ({									      \ -    INTERNAL_SYSCALL_DECL (__err);					      \ -    long int __ret;							      \ -									      \ -    __ret = INTERNAL_SYSCALL (futex, __err, 6, (futexp),		      \ -			      __lll_private_flag (FUTEX_CMP_REQUEUE, private),\ -			      (nr_wake), (nr_move), (mutex), (val));	      \ -    INTERNAL_SYSCALL_ERROR_P (__ret, __err);				      \ -  }) - -#define lll_robust_dead(futexv, private) \ -  do									      \ -    {									      \ -      int *__futexp = &(futexv);					      \ -      atomic_or (__futexp, FUTEX_OWNER_DIED);				      \ -      lll_futex_wake (__futexp, 1, private);				      \ -    }									      \ -  while (0) - -/* Returns non-zero if error happened, zero if success.  */ -#ifdef __sparc32_atomic_do_lock -/* Avoid FUTEX_WAKE_OP if supporting pre-v9 CPUs.  */ -# define lll_futex_wake_unlock(futexp, nr_wake, nr_wake2, futexp2, private) 1 -#else -# define lll_futex_wake_unlock(futexp, nr_wake, nr_wake2, futexp2, private) \ -  ({									      \ -    INTERNAL_SYSCALL_DECL (__err);					      \ -    long int __ret;							      \ -									      \ -    __ret = INTERNAL_SYSCALL (futex, __err, 6, (futexp),		      \ -			      __lll_private_flag (FUTEX_WAKE_OP, private),    \ -			      (nr_wake), (nr_wake2), (futexp2),		      \ -			      FUTEX_OP_CLEAR_WAKE_IF_GT_ONE);		      \ -    INTERNAL_SYSCALL_ERROR_P (__ret, __err);				      \ -  }) -#endif - -static inline int -__attribute__ ((always_inline)) -__lll_trylock (int *futex) -{ -  return atomic_compare_and_exchange_val_24_acq (futex, 1, 0) != 0; -} -#define lll_trylock(futex) __lll_trylock (&(futex)) - -static inline int -__attribute__ ((always_inline)) -__lll_cond_trylock (int *futex) -{ -  return atomic_compare_and_exchange_val_24_acq (futex, 2, 0) != 0; -} -#define lll_cond_trylock(futex) __lll_cond_trylock (&(futex)) - -static inline int -__attribute__ ((always_inline)) -__lll_robust_trylock (int *futex, int id) -{ -  return atomic_compare_and_exchange_val_acq (futex, id, 0) != 0; -} -#define lll_robust_trylock(futex, id) \ -  __lll_robust_trylock (&(futex), id) - - -extern void __lll_lock_wait_private (int *futex) attribute_hidden; -extern void __lll_lock_wait (int *futex, int private) attribute_hidden; -extern int __lll_robust_lock_wait (int *futex, int private) attribute_hidden; - -static inline void -__attribute__ ((always_inline)) -__lll_lock (int *futex, int private) -{ -  int val = atomic_compare_and_exchange_val_24_acq (futex, 1, 0); - -  if (__builtin_expect (val != 0, 0)) -    { -      if (__builtin_constant_p (private) && private == LLL_PRIVATE) -	__lll_lock_wait_private (futex); -      else -	__lll_lock_wait (futex, private); -    } -} -#define lll_lock(futex, private) __lll_lock (&(futex), private) - -static inline int -__attribute__ ((always_inline)) -__lll_robust_lock (int *futex, int id, int private) -{ -  int result = 0; -  if (atomic_compare_and_exchange_bool_acq (futex, id, 0) != 0) -    result = __lll_robust_lock_wait (futex, private); -  return result; -} -#define lll_robust_lock(futex, id, private) \ -  __lll_robust_lock (&(futex), id, private) - -static inline void -__attribute__ ((always_inline)) -__lll_cond_lock (int *futex, int private) -{ -  int val = atomic_compare_and_exchange_val_24_acq (futex, 2, 0); - -  if (__builtin_expect (val != 0, 0)) -    __lll_lock_wait (futex, private); -} -#define lll_cond_lock(futex, private) __lll_cond_lock (&(futex), private) - -#define lll_robust_cond_lock(futex, id, private) \ -  __lll_robust_lock (&(futex), (id) | FUTEX_WAITERS, private) - - -extern int __lll_timedlock_wait (int *futex, const struct timespec *, -				 int private) attribute_hidden; -extern int __lll_robust_timedlock_wait (int *futex, const struct timespec *, -					int private) attribute_hidden; - -static inline int -__attribute__ ((always_inline)) -__lll_timedlock (int *futex, const struct timespec *abstime, int private) -{ -  int val = atomic_compare_and_exchange_val_24_acq (futex, 1, 0); -  int result = 0; - -  if (__builtin_expect (val != 0, 0)) -    result = __lll_timedlock_wait (futex, abstime, private); -  return result; -} -#define lll_timedlock(futex, abstime, private) \ -  __lll_timedlock (&(futex), abstime, private) - -static inline int -__attribute__ ((always_inline)) -__lll_robust_timedlock (int *futex, const struct timespec *abstime, -			int id, int private) -{ -  int result = 0; -  if (atomic_compare_and_exchange_bool_acq (futex, id, 0) != 0) -    result = __lll_robust_timedlock_wait (futex, abstime, private); -  return result; -} -#define lll_robust_timedlock(futex, abstime, id, private) \ -  __lll_robust_timedlock (&(futex), abstime, id, private) - -#define lll_unlock(lock, private) \ -  ((void) ({								      \ -    int *__futex = &(lock);						      \ -    int __val = atomic_exchange_24_rel (__futex, 0);			      \ -    if (__builtin_expect (__val > 1, 0))				      \ -      lll_futex_wake (__futex, 1, private);				      \ -  })) - -#define lll_robust_unlock(lock, private) \ -  ((void) ({								      \ -    int *__futex = &(lock);						      \ -    int __val = atomic_exchange_rel (__futex, 0);			      \ -    if (__builtin_expect (__val & FUTEX_WAITERS, 0))			      \ -      lll_futex_wake (__futex, 1, private);				      \ -  })) - -#define lll_islocked(futex) \ -  (futex != 0) - -/* Initializers for lock.  */ -#define LLL_LOCK_INITIALIZER		(0) -#define LLL_LOCK_INITIALIZER_LOCKED	(1) - -/* The kernel notifies a process with uses CLONE_CLEARTID via futex -   wakeup when the clone terminates.  The memory location contains the -   thread ID while the clone is running and is reset to zero -   afterwards.	*/ -#define lll_wait_tid(tid) \ -  do							\ -    {							\ -      __typeof (tid) __tid;				\ -      while ((__tid = (tid)) != 0)			\ -	lll_futex_wait (&(tid), __tid, LLL_SHARED);	\ -    }							\ -  while (0) - -extern int __lll_timedwait_tid (int *, const struct timespec *) -     attribute_hidden; - -#define lll_timedwait_tid(tid, abstime) \ -  ({							\ -    int __res = 0;					\ -    if ((tid) != 0)					\ -      __res = __lll_timedwait_tid (&(tid), (abstime));	\ -    __res;						\ -  }) - -#endif	/* lowlevellock.h */ diff --git a/libpthread/nptl/sysdeps/unix/sysv/linux/xtensa/lowlevellock.h b/libpthread/nptl/sysdeps/unix/sysv/linux/xtensa/lowlevellock.h deleted file mode 100644 index abe6e9c37..000000000 --- a/libpthread/nptl/sysdeps/unix/sysv/linux/xtensa/lowlevellock.h +++ /dev/null @@ -1,293 +0,0 @@ -/* Copyright (C) 2005-2013 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 -   modify it under the terms of the GNU Lesser General Public -   License as published by the Free Software Foundation; either -   version 2.1 of the License, or (at your option) any later version. - -   The GNU C Library is distributed in the hope that it will be useful, -   but WITHOUT ANY WARRANTY; without even the implied warranty of -   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.	 See the GNU -   Lesser General Public License for more details. - -   You should have received a copy of the GNU Lesser General Public -   License along with the GNU C Library.  If not, see -   <http://www.gnu.org/licenses/>.  */ - -#ifndef _LOWLEVELLOCK_H -#define _LOWLEVELLOCK_H	1 - -#include <time.h> -#include <sys/param.h> -#include <bits/pthreadtypes.h> -#include <atomic.h> -#include <sysdep.h> -#include <bits/kernel-features.h> - -#define FUTEX_WAIT		0 -#define FUTEX_WAKE		1 -#define FUTEX_REQUEUE		3 -#define FUTEX_CMP_REQUEUE	4 -#define FUTEX_WAKE_OP		5 -#define FUTEX_OP_CLEAR_WAKE_IF_GT_ONE	((4 << 24) | 1) -#define FUTEX_LOCK_PI		6 -#define FUTEX_UNLOCK_PI		7 -#define FUTEX_TRYLOCK_PI	8 -#define FUTEX_WAIT_BITSET	9 -#define FUTEX_WAKE_BITSET	10 -#define FUTEX_PRIVATE_FLAG	128 -#define FUTEX_CLOCK_REALTIME	256 - -#define FUTEX_BITSET_MATCH_ANY	0xffffffff - -/* Values for 'private' parameter of locking macros.  Yes, the -   definition seems to be backwards.  But it is not.  The bit will be -   reversed before passing to the system call.  */ -#define LLL_PRIVATE	0 -#define LLL_SHARED	FUTEX_PRIVATE_FLAG - - -#if !defined NOT_IN_libc || defined IS_IN_rtld -/* In libc.so or ld.so all futexes are private.  */ -# ifdef __ASSUME_PRIVATE_FUTEX -#  define __lll_private_flag(fl, private) \ -  ((fl) | FUTEX_PRIVATE_FLAG) -# else -#  define __lll_private_flag(fl, private) \ -  ((fl) | THREAD_GETMEM (THREAD_SELF, header.private_futex)) -# endif -#else -# ifdef __ASSUME_PRIVATE_FUTEX -#  define __lll_private_flag(fl, private) \ -  (((fl) | FUTEX_PRIVATE_FLAG) ^ (private)) -# else -#  define __lll_private_flag(fl, private) \ -  (__builtin_constant_p (private)					      \ -   ? ((private) == 0							      \ -      ? ((fl) | THREAD_GETMEM (THREAD_SELF, header.private_futex))	      \ -      : (fl))								      \ -   : ((fl) | (((private) ^ FUTEX_PRIVATE_FLAG)				      \ -	      & THREAD_GETMEM (THREAD_SELF, header.private_futex)))) -# endif -#endif - - -#define lll_futex_wait(futexp, val, private) \ -  lll_futex_timed_wait(futexp, val, NULL, private) - -#define lll_futex_timed_wait(futexp, val, timespec, private) \ -  ({									      \ -    INTERNAL_SYSCALL_DECL (__err);					      \ -    long int __ret;							      \ -    __ret = INTERNAL_SYSCALL (futex, __err, 4, (futexp),		      \ -			      __lll_private_flag (FUTEX_WAIT, private),	      \ -			      (val), (timespec));			      \ -    __ret;								      \ -  }) - -#define lll_futex_timed_wait_bitset(futexp, val, timespec, clockbit, private) \ -  ({									\ -    INTERNAL_SYSCALL_DECL (__err);					\ -    long int __ret;							\ -    int __op = FUTEX_WAIT_BITSET | clockbit;				\ -    __ret = INTERNAL_SYSCALL (futex, __err, 6, (futexp),		\ -			      __lll_private_flag (__op, private),	\ -			      (val), (timespec), NULL /* Unused.  */,	\ -			      FUTEX_BITSET_MATCH_ANY);			\ -    __ret;								\ -  }) - -#define lll_futex_wake(futexp, nr, private) \ -  ({									      \ -    INTERNAL_SYSCALL_DECL (__err);					      \ -    long int __ret;							      \ -    __ret = INTERNAL_SYSCALL (futex, __err, 4, (futexp),		      \ -			      __lll_private_flag (FUTEX_WAKE, private),	      \ -			      (nr), 0);					      \ -    __ret;								      \ -  }) - -#define lll_robust_dead(futexv, private) \ -  do									      \ -    {									      \ -      int *__futexp = &(futexv);					      \ -      atomic_or (__futexp, FUTEX_OWNER_DIED);				      \ -      lll_futex_wake (__futexp, 1, private);				      \ -    }									      \ -  while (0) - -/* Returns non-zero if error happened, zero if success.  */ -#define lll_futex_requeue(futexp, nr_wake, nr_move, mutex, val, private) \ -  ({									      \ -    INTERNAL_SYSCALL_DECL (__err);					      \ -    long int __ret;							      \ -    __ret = INTERNAL_SYSCALL (futex, __err, 6, (futexp),		      \ -			      __lll_private_flag (FUTEX_CMP_REQUEUE, private),\ -			      (nr_wake), (nr_move), (mutex), (val));	      \ -    INTERNAL_SYSCALL_ERROR_P (__ret, __err);				      \ -  }) - - -/* Returns non-zero if error happened, zero if success.  */ -#define lll_futex_wake_unlock(futexp, nr_wake, nr_wake2, futexp2, private) \ -  ({									      \ -    INTERNAL_SYSCALL_DECL (__err);					      \ -    long int __ret;							      \ -    __ret = INTERNAL_SYSCALL (futex, __err, 6, (futexp),		      \ -			      __lll_private_flag (FUTEX_WAKE_OP, private),    \ -			      (nr_wake), (nr_wake2), (futexp2),		      \ -			      FUTEX_OP_CLEAR_WAKE_IF_GT_ONE);		      \ -    INTERNAL_SYSCALL_ERROR_P (__ret, __err);				      \ -  }) - - -#define lll_trylock(lock)	\ -  atomic_compare_and_exchange_val_acq(&(lock), 1, 0) - -#define lll_cond_trylock(lock)	\ -  atomic_compare_and_exchange_val_acq(&(lock), 2, 0) - -#define __lll_robust_trylock(futex, id) \ -  (atomic_compare_and_exchange_val_acq (futex, id, 0) != 0) -#define lll_robust_trylock(lock, id) \ -  __lll_robust_trylock (&(lock), id) - -extern void __lll_lock_wait_private (int *futex) attribute_hidden; -extern void __lll_lock_wait (int *futex, int private) attribute_hidden; -extern int __lll_robust_lock_wait (int *futex, int private) attribute_hidden; - -#define __lll_lock(futex, private)					      \ -  ((void) ({								      \ -    int *__futex = (futex);						      \ -    if (__builtin_expect (atomic_compare_and_exchange_val_acq (__futex,       \ -								1, 0), 0))    \ -      {									      \ -	if (__builtin_constant_p (private) && (private) == LLL_PRIVATE)	      \ -	  __lll_lock_wait_private (__futex);				      \ -	else								      \ -	  __lll_lock_wait (__futex, private);				      \ -      }									      \ -  })) -#define lll_lock(futex, private) __lll_lock (&(futex), private) - - -#define __lll_robust_lock(futex, id, private)				      \ -  ({									      \ -    int *__futex = (futex);						      \ -    int __val = 0;							      \ -									      \ -    if (__builtin_expect (atomic_compare_and_exchange_bool_acq (__futex, id,  \ -								0), 0))	      \ -      __val = __lll_robust_lock_wait (__futex, private);		      \ -    __val;								      \ -  }) -#define lll_robust_lock(futex, id, private) \ -  __lll_robust_lock (&(futex), id, private) - - -#define __lll_cond_lock(futex, private)					      \ -  ((void) ({								      \ -    int *__futex = (futex);						      \ -    if (__builtin_expect (atomic_exchange_acq (__futex, 2), 0))		      \ -      __lll_lock_wait (__futex, private);				      \ -  })) -#define lll_cond_lock(futex, private) __lll_cond_lock (&(futex), private) - - -#define lll_robust_cond_lock(futex, id, private) \ -  __lll_robust_lock (&(futex), (id) | FUTEX_WAITERS, private) - - -extern int __lll_timedlock_wait (int *futex, const struct timespec *, -				 int private) attribute_hidden; -extern int __lll_robust_timedlock_wait (int *futex, const struct timespec *, -					int private) attribute_hidden; - -#define __lll_timedlock(futex, abstime, private)			      \ -  ({									      \ -     int *__futex = (futex);						      \ -     int __val = 0;							      \ -									      \ -     if (__builtin_expect (atomic_exchange_acq (__futex, 1), 0))	      \ -       __val = __lll_timedlock_wait (__futex, abstime, private);	      \ -     __val;								      \ -  }) -#define lll_timedlock(futex, abstime, private) \ -  __lll_timedlock (&(futex), abstime, private) - - -#define __lll_robust_timedlock(futex, abstime, id, private)		      \ -  ({									      \ -    int *__futex = (futex);						      \ -    int __val = 0;							      \ -									      \ -    if (__builtin_expect (atomic_compare_and_exchange_bool_acq (__futex, id,  \ -								0), 0))	      \ -      __val = __lll_robust_timedlock_wait (__futex, abstime, private);	      \ -    __val;								      \ -  }) -#define lll_robust_timedlock(futex, abstime, id, private) \ -  __lll_robust_timedlock (&(futex), abstime, id, private) - - -#define __lll_unlock(futex, private) \ -  (void)							\ -    ({ int *__futex = (futex);					\ -       int __oldval = atomic_exchange_rel (__futex, 0);		\ -       if (__builtin_expect (__oldval > 1, 0))			\ -	 lll_futex_wake (__futex, 1, private);			\ -    }) -#define lll_unlock(futex, private) __lll_unlock(&(futex), private) - - -#define __lll_robust_unlock(futex, private) \ -  (void)							\ -    ({ int *__futex = (futex);					\ -       int __oldval = atomic_exchange_rel (__futex, 0);		\ -       if (__builtin_expect (__oldval & FUTEX_WAITERS, 0))	\ -	 lll_futex_wake (__futex, 1, private);			\ -    }) -#define lll_robust_unlock(futex, private) \ -  __lll_robust_unlock(&(futex), private) - - -#define lll_islocked(futex) \ -  (futex != 0) - - -/* Our internal lock implementation is identical to the binary-compatible -   mutex implementation. */ - -/* Initializers for lock.  */ -#define LLL_LOCK_INITIALIZER		(0) -#define LLL_LOCK_INITIALIZER_LOCKED	(1) - -/* The states of a lock are: -    0  -  untaken -    1  -  taken by one user -   >1  -  taken by more users */ - -/* The kernel notifies a process which uses CLONE_CHILD_CLEARTID via futex -   wakeup when the clone terminates.  The memory location contains the -   thread ID while the clone is running and is reset to zero -   afterwards.	*/ -#define lll_wait_tid(tid) \ -  do {					\ -    __typeof (tid) __tid;		\ -    while ((__tid = (tid)) != 0)	\ -      lll_futex_wait (&(tid), __tid, LLL_SHARED);\ -  } while (0) - -extern int __lll_timedwait_tid (int *, const struct timespec *) -     attribute_hidden; - -#define lll_timedwait_tid(tid, abstime) \ -  ({							\ -    int __res = 0;					\ -    if ((tid) != 0)					\ -      __res = __lll_timedwait_tid (&(tid), (abstime));	\ -    __res;						\ -  }) - -#endif	/* lowlevellock.h */ | 
