diff options
author | Stefan Liebler <stli@linux.vnet.ibm.com> | 2017-02-06 13:44:23 +0100 |
---|---|---|
committer | Stefan Liebler <stli@linux.vnet.ibm.com> | 2017-02-06 13:46:01 +0100 |
commit | df3a4e104fb63f96f05b29931dd83e272c2b7936 (patch) | |
tree | 522482c35a920df919a91102c0b4a54bd897d97a | |
parent | f2d7f23a300f57e36cd849ce80a93ccbcebd9968 (diff) | |
download | glibc-df3a4e104fb63f96f05b29931dd83e272c2b7936.zip glibc-df3a4e104fb63f96f05b29931dd83e272c2b7936.tar.gz glibc-df3a4e104fb63f96f05b29931dd83e272c2b7936.tar.bz2 |
Add __glibc_unlikely hint in lll_trylock, lll_cond_trylock.
The macros lll_trylock, lll_cond_trylock are extended by an __glibc_unlikely
hint. Now the trylock macros are based on the same assumption about a
free/busy lock as lll_lock.
With the hint gcc emits code in e.g. pthread_mutex_trylock which does
not use jumps if the lock is free. Without the hint it had to jump away
if the lock is free.
Tested on s390x, ppc.
ChangeLog:
* sysdeps/nptl/lowlevellock.h (lll_trylock, lll_cond_trylock):
Add __glibc_unlikely hint.
-rw-r--r-- | ChangeLog | 5 | ||||
-rw-r--r-- | sysdeps/nptl/lowlevellock.h | 4 |
2 files changed, 7 insertions, 2 deletions
@@ -1,3 +1,8 @@ +2017-02-06 Stefan Liebler <stli@linux.vnet.ibm.com> + + * sysdeps/nptl/lowlevellock.h (lll_trylock, lll_cond_trylock): + Add __glibc_unlikely hint. + 2017-02-06 Adhemerval Zanella <adhemerval.zanella@linaro.org> [BZ #16640] diff --git a/sysdeps/nptl/lowlevellock.h b/sysdeps/nptl/lowlevellock.h index 42d9658..54e3c28 100644 --- a/sysdeps/nptl/lowlevellock.h +++ b/sysdeps/nptl/lowlevellock.h @@ -64,13 +64,13 @@ 0. Otherwise leave lock unchanged and return non-zero to indicate that the lock was not acquired. */ #define lll_trylock(lock) \ - atomic_compare_and_exchange_bool_acq (&(lock), 1, 0) + __glibc_unlikely (atomic_compare_and_exchange_bool_acq (&(lock), 1, 0)) /* If LOCK is 0 (not acquired), set to 2 (acquired, possibly with waiters) and return 0. Otherwise leave lock unchanged and return non-zero to indicate that the lock was not acquired. */ #define lll_cond_trylock(lock) \ - atomic_compare_and_exchange_bool_acq (&(lock), 2, 0) + __glibc_unlikely (atomic_compare_and_exchange_bool_acq (&(lock), 2, 0)) extern void __lll_lock_wait_private (int *futex) attribute_hidden; extern void __lll_lock_wait (int *futex, int private) attribute_hidden; |