aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--linuxthreads/spinlock.h41
1 files changed, 26 insertions, 15 deletions
diff --git a/linuxthreads/spinlock.h b/linuxthreads/spinlock.h
index a6f682cb69..29f030406c 100644
--- a/linuxthreads/spinlock.h
+++ b/linuxthreads/spinlock.h
@@ -12,20 +12,6 @@
/* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the */
/* GNU Library General Public License for more details. */
-/* Internal locks */
-
-extern void __pthread_lock(struct _pthread_fastlock * lock);
-extern int __pthread_trylock(struct _pthread_fastlock * lock);
-extern void __pthread_unlock(struct _pthread_fastlock * lock);
-
-static inline void __pthread_init_lock(struct _pthread_fastlock * lock)
-{
- lock->__status = 0;
- lock->__spinlock = 0;
-}
-
-#define LOCK_INITIALIZER {0, 0}
-
#if defined(TEST_FOR_COMPARE_AND_SWAP)
extern int __pthread_has_cas;
@@ -35,7 +21,7 @@ extern int __pthread_compare_and_swap(long * ptr, long oldval, long newval,
static inline int compare_and_swap(long * ptr, long oldval, long newval,
int * spinlock)
{
- if (__pthread_has_cas)
+ if (__builtin_expect (__pthread_has_cas, 1))
return __compare_and_swap(ptr, oldval, newval);
else
return __pthread_compare_and_swap(ptr, oldval, newval, spinlock);
@@ -61,3 +47,28 @@ static inline int compare_and_swap(long * ptr, long oldval, long newval,
}
#endif
+
+/* Internal locks */
+
+extern void internal_function __pthread_lock(struct _pthread_fastlock * lock,
+ pthread_descr self);
+extern void internal_function __pthread_unlock(struct _pthread_fastlock *lock);
+
+static inline void __pthread_init_lock(struct _pthread_fastlock * lock)
+{
+ lock->__status = 0;
+ lock->__spinlock = 0;
+}
+
+static inline int __pthread_trylock (struct _pthread_fastlock * lock)
+{
+ long oldstatus;
+
+ do {
+ oldstatus = lock->__status;
+ if (oldstatus != 0) return EBUSY;
+ } while(! compare_and_swap(&lock->__status, 0, 1, &lock->__spinlock));
+ return 0;
+}
+
+#define LOCK_INITIALIZER {0, 0}