diff options
Diffstat (limited to 'sysdeps/unix/sysv/linux/powerpc/elision-trylock.c')
-rw-r--r-- | sysdeps/unix/sysv/linux/powerpc/elision-trylock.c | 18 |
1 files changed, 9 insertions, 9 deletions
diff --git a/sysdeps/unix/sysv/linux/powerpc/elision-trylock.c b/sysdeps/unix/sysv/linux/powerpc/elision-trylock.c index 7b6d1b9b98..0807a6a432 100644 --- a/sysdeps/unix/sysv/linux/powerpc/elision-trylock.c +++ b/sysdeps/unix/sysv/linux/powerpc/elision-trylock.c @@ -1,5 +1,5 @@ /* elision-trylock.c: Lock eliding trylock for pthreads. - Copyright (C) 2015 Free Software Foundation, Inc. + Copyright (C) 2015-2016 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 @@ -31,22 +31,25 @@ int __lll_trylock_elision (int *futex, short *adapt_count) { /* Implement POSIX semantics by forbiding nesting elided trylocks. */ - __builtin_tabort (_ABORT_NESTED_TRYLOCK); + __libc_tabort (_ABORT_NESTED_TRYLOCK); /* Only try a transaction if it's worth it. */ if (*adapt_count > 0) { - (*adapt_count)--; goto use_lock; } - if (__builtin_tbegin (0)) + if (__libc_tbegin (0)) { if (*futex == 0) return 0; - /* Lock was busy. Fall back to normal locking. */ - __builtin_tabort (_ABORT_LOCK_BUSY); + /* Lock was busy. This is never a nested transaction. + End it, and set the adapt count. */ + __libc_tend (0); + + if (aconf.skip_lock_busy > 0) + *adapt_count = aconf.skip_lock_busy; } else { @@ -58,9 +61,6 @@ __lll_trylock_elision (int *futex, short *adapt_count) if (aconf.skip_trylock_internal_abort > 0) *adapt_count = aconf.skip_trylock_internal_abort; } - - if (aconf.skip_lock_busy > 0) - *adapt_count = aconf.skip_lock_busy; } use_lock: |