diff options
author | rpj <rpj> | 2001-10-08 05:14:05 +0000 |
---|---|---|
committer | rpj <rpj> | 2001-10-08 05:14:05 +0000 |
commit | 64a1ea1aa97e5de174220f8de6815ede9fcfabac (patch) | |
tree | b4d8c2b5cbcdb4a8e7525154b3c187f79f1d46bb | |
parent | dcc0da53c266b2e6c3d54892919112ee0106c88c (diff) |
pthread_spin_trylock was not returning EBUSY on multi CPU machines.
-rw-r--r-- | ChangeLog | 5 | ||||
-rw-r--r-- | spin.c | 16 |
2 files changed, 11 insertions, 10 deletions
@@ -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 @@ -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; |