diff options
author | rpj <rpj> | 2001-07-06 18:16:50 +0000 |
---|---|---|
committer | rpj <rpj> | 2001-07-06 18:16:50 +0000 |
commit | 06974b302eaf8f08382e6e786aea53f420c12222 (patch) | |
tree | 1b574a41dacc634a105a74127b2dac30a60bda13 /barrier.c | |
parent | 7a3104dc65b469cbb9c88b6a9c7b7bea4126a43e (diff) |
Spinlocks and barriers fixed and working. Beta level.
* spin.c: Revamped and working; included static initialiser.
* barrier.c: Likewise.
* condvar.c: Macro constant change; inline auto init routine.
* mutex.c: Likewise.
* rwlock.c: Likewise.
* private.c: Add support for spinlock initialiser.
* global.c: Likewise.
* implement.h: Likewise.
* pthread.h (PTHREAD_SPINLOCK_INITIALIZER): Fix typo.
tests/ChangeLog:
* spin3.c: Changed test and fixed.
* spin4.c: Fixed.
* barrier3.c: Fixed.
* barrier4.c: Fixed.
Diffstat (limited to 'barrier.c')
-rw-r--r-- | barrier.c | 16 |
1 files changed, 7 insertions, 9 deletions
@@ -148,22 +148,22 @@ pthread_barrier_wait(pthread_barrier_t *barrier) } else { + pthread_t self; + int oldCancelState; + + (void) pthread_mutex_unlock(&(b->mtxExclusiveAccess)); + + self = pthread_self(); + /* * pthread_barrier_wait() is not a cancelation point * so temporarily prevent sem_wait() from being one. */ - pthread_t self = pthread_self(); - int oldCancelState; - if (self->cancelType == PTHREAD_CANCEL_DEFERRED) { pthread_setcancelstate(PTHREAD_CANCEL_DISABLE, &oldCancelState); } - /* Could still be PTHREAD_CANCEL_ASYNCHRONOUS. */ - pthread_cleanup_push(pthread_mutex_unlock, - (void *) &(b->mtxExclusiveAccess)); - if (0 != sem_wait(&(b->semBarrierBreeched))) { result = errno; @@ -173,8 +173,6 @@ pthread_barrier_wait(pthread_barrier_t *barrier) { pthread_setcancelstate(oldCancelState, NULL); } - - pthread_cleanup_pop(1); } } |