diff options
author | Adhemerval Zanella <azanella@linux.vnet.ibm.com> | 2014-07-10 16:42:51 -0500 |
---|---|---|
committer | Adhemerval Zanella <azanella@linux.vnet.ibm.com> | 2014-07-10 16:46:33 -0500 |
commit | bc1da1765e901a9a9f532f91d09f5237655e01fd (patch) | |
tree | 46c0b670d468807531183032471d0203fde9b193 | |
parent | 6a42be57e8755c956a89d1cae02e99172eba082a (diff) | |
download | glibc-bc1da1765e901a9a9f532f91d09f5237655e01fd.tar glibc-bc1da1765e901a9a9f532f91d09f5237655e01fd.tar.gz glibc-bc1da1765e901a9a9f532f91d09f5237655e01fd.tar.bz2 glibc-bc1da1765e901a9a9f532f91d09f5237655e01fd.zip |
PowerPC: Fix build due missing lll_robust_trylock
Commit 887865f remove the lll_robust_trylock definition on all
architectures, however for powerpc both __lll_trylock and
__lll_cond_trylock were based on lll_robust_trylock definition.
This patch restore it with a different name.
-rw-r--r-- | ChangeLog | 7 | ||||
-rw-r--r-- | sysdeps/unix/sysv/linux/powerpc/lowlevellock.h | 19 |
2 files changed, 24 insertions, 2 deletions
@@ -1,3 +1,10 @@ +2014-07-10 Adhemerval Zanella <azanella@linux.vnet.ibm.com> + + * sysdeps/unix/sysv/linux/powerpc/lowlevellock.h (__lll_base_trylock): + New define. + (__lll_trylock): Use __lll_base_trylock. + (__lll_cond_trylock): Likewise. + 2014-07-10 Roland McGrath <roland@hack.frob.com> * nptl/pthread_create.c (start_thread): Use atomic_or and diff --git a/sysdeps/unix/sysv/linux/powerpc/lowlevellock.h b/sysdeps/unix/sysv/linux/powerpc/lowlevellock.h index d7e1e38cc6..a651d23c50 100644 --- a/sysdeps/unix/sysv/linux/powerpc/lowlevellock.h +++ b/sysdeps/unix/sysv/linux/powerpc/lowlevellock.h @@ -190,13 +190,28 @@ # endif #endif +/* Set *futex to ID if it is 0, atomically. Returns the old value */ +#define __lll_base_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; \ + }) + /* 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(futex) __lll_base_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(futex) __lll_base_trylock (futex, 2) #define lll_cond_trylock(lock) __lll_cond_trylock (&(lock)) |