From 50d2dd36c9a30460b32a4c9a3b4b2c456a255467 Mon Sep 17 00:00:00 2001 From: rpj Date: Fri, 12 Oct 2001 08:24:52 +0000 Subject: * spin.c (pthread_spin_unlock): Was not returning EPERM if the spinlock was not locked, for multi CPU machines. --- ChangeLog | 6 ++++++ spin.c | 15 ++++++++------- 2 files changed, 14 insertions(+), 7 deletions(-) diff --git a/ChangeLog b/ChangeLog index 07b04a4..7c5ee62 100644 --- a/ChangeLog +++ b/ChangeLog @@ -1,3 +1,9 @@ +2001-10-12 Ross Johnson + + * spin.c (pthread_spin_unlock): Was not returning + EPERM if the spinlock was not locked, for multi CPU + machines. + 2001-10-08 Ross Johnson * spin.c (pthread_spin_trylock): Was not returning diff --git a/spin.c b/spin.c index d2d795f..6688219 100644 --- a/spin.c +++ b/spin.c @@ -253,17 +253,18 @@ pthread_spin_unlock(pthread_spinlock_t *lock) { register pthread_spinlock_t s = *lock; - if (s->interlock == PTW32_SPIN_USE_MUTEX) + if (s == PTHREAD_SPINLOCK_INITIALIZER) { - return pthread_mutex_unlock(&(s->u.mutex)); + return EPERM; } - if ((_LONG) PTW32_SPIN_LOCKED == - InterlockedCompareExchange((_LPLONG) &(s->interlock), - (_LONG) PTW32_SPIN_UNLOCKED, - (_LONG) PTW32_SPIN_LOCKED ) ) + switch ((long) InterlockedCompareExchange((_LPLONG) &(s->interlock), + (_LONG) PTW32_SPIN_UNLOCKED, + (_LONG) PTW32_SPIN_LOCKED )) { - return 0; + case PTW32_SPIN_LOCKED: return 0; + case PTW32_SPIN_UNLOCKED: return EPERM; + case PTW32_SPIN_USE_MUTEX: return pthread_mutex_unlock(&(s->u.mutex)); } return EINVAL; -- cgit v1.2.3