aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorStefan Liebler <stli@linux.vnet.ibm.com>2017-02-06 13:44:23 +0100
committerStefan Liebler <stli@linux.vnet.ibm.com>2017-02-06 13:46:01 +0100
commitdf3a4e104fb63f96f05b29931dd83e272c2b7936 (patch)
tree522482c35a920df919a91102c0b4a54bd897d97a
parentf2d7f23a300f57e36cd849ce80a93ccbcebd9968 (diff)
downloadglibc-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--ChangeLog5
-rw-r--r--sysdeps/nptl/lowlevellock.h4
2 files changed, 7 insertions, 2 deletions
diff --git a/ChangeLog b/ChangeLog
index dd0a0b5..e4885cf 100644
--- a/ChangeLog
+++ b/ChangeLog
@@ -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;