diff options
author | rpj <rpj> | 2001-10-12 08:24:52 +0000 |
---|---|---|
committer | rpj <rpj> | 2001-10-12 08:24:52 +0000 |
commit | 50d2dd36c9a30460b32a4c9a3b4b2c456a255467 (patch) | |
tree | c05551527200da991f9482d57fc18fa43ea29695 /spin.c | |
parent | 64a1ea1aa97e5de174220f8de6815ede9fcfabac (diff) |
* spin.c (pthread_spin_unlock): Was not returning
EPERM if the spinlock was not locked, for multi CPU
machines.
Diffstat (limited to 'spin.c')
-rw-r--r-- | spin.c | 15 |
1 files changed, 8 insertions, 7 deletions
@@ -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; |