@@ -20,6 +20,20 @@
#include "pthreadP.h"
#include <shlib-compat.h>
+#if ATOMIC_EXCHANGE_USES_CAS
+/* Try to acquire the lock with a CAS instruction as this architecture
+ has no exchange instruction. The acquisition succeeds if the lock is not
+ acquired. */
+# define pthread_spin_lock_grab_lock(mem, val, c) \
+ atomic_compare_exchange_weak_acquire (lock, &val, 1))
+#else
+/* Try to acquire the lock with an exchange instruction as this architecture
+ has such an instruction and we assume it is faster than a CAS.
+ The acquisition succeeds if the lock is not in an acquired state. */
+# define pthread_spin_lock_grab_lock(mem, val, c) \
+ (atomic_exchange_acquire (lock, 1) == 0)
+#endif
+
int
__pthread_spin_lock (pthread_spinlock_t *lock)
{
@@ -36,19 +50,8 @@ __pthread_spin_lock (pthread_spinlock_t *lock)
We use acquire MO to synchronize-with the release MO store in
pthread_spin_unlock, and thus ensure that prior critical sections
happen-before this critical section. */
-#if ! ATOMIC_EXCHANGE_USES_CAS
- /* Try to acquire the lock with an exchange instruction as this architecture
- has such an instruction and we assume it is faster than a CAS.
- The acquisition succeeds if the lock is not in an acquired state. */
- if (__glibc_likely (atomic_exchange_acquire (lock, 1) == 0))
+ if (__glibc_likely (pthread_spin_lock_grab_lock (lock, &val, 1)))
return 0;
-#else
- /* Try to acquire the lock with a CAS instruction as this architecture
- has no exchange instruction. The acquisition succeeds if the lock is not
- acquired. */
- if (__glibc_likely (atomic_compare_exchange_weak_acquire (lock, &val, 1)))
- return 0;
-#endif
do
{
@@ -75,7 +78,7 @@ __pthread_spin_lock (pthread_spinlock_t *lock)
/* We need acquire memory order here for the same reason as mentioned
for the first try to lock the spinlock. */
}
- while (!atomic_compare_exchange_weak_acquire (lock, &val, 1));
+ while (!pthread_spin_lock_grab_lock (lock, &val, 1));
return 0;
}