summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--ChangeLog5
-rw-r--r--spin.c16
2 files changed, 11 insertions, 10 deletions
diff --git a/ChangeLog b/ChangeLog
index ab8ab92..07b04a4 100644
--- a/ChangeLog
+++ b/ChangeLog
@@ -1,3 +1,8 @@
+2001-10-08 Ross Johnson <rpj@setup1.ise.canberra.edu.au>
+
+ * spin.c (pthread_spin_trylock): Was not returning
+ EBUSY for multi CPU machines.
+
2001-08-24 Ross Johnson <rpj@setup1.ise.canberra.edu.au>
* condvar.c (pthread_cond_destroy): Remove cv element
diff --git a/spin.c b/spin.c
index 458bb7a..d2d795f 100644
--- a/spin.c
+++ b/spin.c
@@ -284,17 +284,13 @@ pthread_spin_trylock(pthread_spinlock_t *lock)
}
}
- if ((_LONG) PTW32_SPIN_UNLOCKED ==
- InterlockedCompareExchange((_LPLONG) &(s->interlock),
- (_LONG) PTW32_SPIN_LOCKED,
- (_LONG) PTW32_SPIN_UNLOCKED ) )
- {
- return 0;
- }
-
- if (s->interlock == PTW32_SPIN_USE_MUTEX)
+ switch ((long) InterlockedCompareExchange((_LPLONG) &(s->interlock),
+ (_LONG) PTW32_SPIN_LOCKED,
+ (_LONG) PTW32_SPIN_UNLOCKED ))
{
- return pthread_mutex_trylock(&(s->u.mutex));
+ case PTW32_SPIN_UNLOCKED: return 0;
+ case PTW32_SPIN_LOCKED: return EBUSY;
+ case PTW32_SPIN_USE_MUTEX: return pthread_mutex_trylock(&(s->u.mutex));
}
return EINVAL;