summaryrefslogtreecommitdiff
path: root/lib/pthread-spin.c
diff options
context:
space:
mode:
authorBruno Haible <bruno@clisp.org>2020-07-01 22:49:05 +0200
committerBruno Haible <bruno@clisp.org>2020-07-01 22:49:05 +0200
commitd7c5760a122d09dc532bc0976becc0d4caddc61e (patch)
treea62f9f0332587a761c3887fba6463d53708d4399 /lib/pthread-spin.c
parent6bf513db3802388e3fc8c40a506e23c85a8abf21 (diff)
downloadgnulib-d7c5760a122d09dc532bc0976becc0d4caddc61e.tar.gz
pthread-spin: Optimize fallback for GCC versions >= 4.7.
* lib/pthread-spin.c (pthread_spin_init, pthread_spin_lock, pthread_spin_trylock, pthread_spin_unlock): Use a lock word instead of a lock byte.
Diffstat (limited to 'lib/pthread-spin.c')
-rw-r--r--lib/pthread-spin.c18
1 files changed, 9 insertions, 9 deletions
diff --git a/lib/pthread-spin.c b/lib/pthread-spin.c
index 73eb9f31f6..1f73f130be 100644
--- a/lib/pthread-spin.c
+++ b/lib/pthread-spin.c
@@ -69,8 +69,8 @@ pthread_spin_destroy (pthread_spinlock_t *lock)
require to link with -latomic. */
# if __GNUC__ > 4 || (__GNUC__ == 4 && __GNUC_MINOR__ >= 7)
-/* Use GCC built-ins (available in GCC >= 4.7) that operate on the first byte
- of the lock.
+/* Use GCC built-ins (available in GCC >= 4.7) that operate on the first 32-bit
+ word of the lock.
Documentation:
<https://gcc.gnu.org/onlinedocs/gcc-4.7.0/gcc/_005f_005fatomic-Builtins.html> */
@@ -81,7 +81,7 @@ int
pthread_spin_init (pthread_spinlock_t *lock,
int shared_across_processes _GL_UNUSED)
{
- __atomic_store_n ((char *) lock, 0, __ATOMIC_SEQ_CST);
+ __atomic_store_n ((unsigned int *) lock, 0, __ATOMIC_SEQ_CST);
return 0;
}
@@ -89,9 +89,9 @@ int
pthread_spin_lock (pthread_spinlock_t *lock)
{
/* Wait until *lock becomes 0, then replace it with 1. */
- asyncsafe_spinlock_t zero;
+ unsigned int zero;
while (!(zero = 0,
- __atomic_compare_exchange_n ((char *) lock, &zero, 1, false,
+ __atomic_compare_exchange_n ((unsigned int *) lock, &zero, 1, false,
__ATOMIC_SEQ_CST, __ATOMIC_SEQ_CST)))
;
return 0;
@@ -100,9 +100,9 @@ pthread_spin_lock (pthread_spinlock_t *lock)
int
pthread_spin_trylock (pthread_spinlock_t *lock)
{
- asyncsafe_spinlock_t zero;
+ unsigned int zero;
if (!(zero = 0,
- __atomic_compare_exchange_n ((char *) lock, &zero, 1, false,
+ __atomic_compare_exchange_n ((unsigned int *) lock, &zero, 1, false,
__ATOMIC_SEQ_CST, __ATOMIC_SEQ_CST)))
return EBUSY;
return 0;
@@ -112,8 +112,8 @@ int
pthread_spin_unlock (pthread_spinlock_t *lock)
{
/* If *lock is 1, then replace it with 0. */
- asyncsafe_spinlock_t one = 1;
- if (!__atomic_compare_exchange_n ((char *) lock, &one, 0, false,
+ unsigned int one = 1;
+ if (!__atomic_compare_exchange_n ((unsigned int *) lock, &one, 0, false,
__ATOMIC_SEQ_CST, __ATOMIC_SEQ_CST))
abort ();
return 0;