From 7b1af325f12acc61cffd78b1b5ba580940c9b610 Mon Sep 17 00:00:00 2001 From: Simon Wilkinson Date: Sun, 10 Jul 2011 13:50:03 +0100 Subject: [PATCH] lwp: Don't depend on RX locking macros The lwp library should be independent of RX (in fact, bits of it are a dependency for RX). So, LWP cannot use the MUTEX_ENTER, CV_WAIT, and so on macros that RX defines. Just implement these natively within the pthreaded bits of lock.c to remove the dependency. Change-Id: I4cdb8313e791f253e84bbc4e256087e46a4c59bd Reviewed-on: http://gerrit.openafs.org/5396 Reviewed-by: Jeffrey Altman Tested-by: BuildBot Reviewed-by: Derrick Brashear --- src/lwp/lock.c | 39 ++++++++++++++++----------------------- src/lwp/lock.h | 6 ++---- 2 files changed, 18 insertions(+), 27 deletions(-) diff --git a/src/lwp/lock.c b/src/lwp/lock.c index d24a83b..ed50626 100644 --- a/src/lwp/lock.c +++ b/src/lwp/lock.c @@ -26,15 +26,8 @@ #include #include - #include -#ifdef AFS_PTHREAD_ENV -#include -#endif - -#include - #include "lwp.h" #include "lock.h" @@ -49,9 +42,9 @@ Lock_Init(struct Lock *lock) lock->wait_states = 0; lock->num_waiting = 0; #ifdef AFS_PTHREAD_ENV - MUTEX_INIT(&lock->mutex, "lock", MUTEX_DEFAULT, 0); - CV_INIT(&lock->read_cv, "read", CV_DEFAULT, 0); - CV_INIT(&lock->write_cv, "write", CV_DEFAULT, 0); + opr_Verify(pthread_mutex_init(&lock->mutex, NULL) == 0); + opr_Verify(pthread_cond_init(&lock->read_cv, NULL) == 0); + opr_Verify(pthread_cond_init(&lock->write_cv, NULL) == 0); #endif /* AFS_PTHREAD_ENV */ } @@ -59,9 +52,9 @@ void Lock_Destroy(struct Lock *lock) { #ifdef AFS_PTHREAD_ENV - MUTEX_DESTROY(&lock->mutex); - CV_DESTROY(&lock->read_cv); - CV_DESTROY(&lock->write_cv); + opr_Verify(pthread_mutex_destroy(&lock->mutex) == 0); + opr_Verify(pthread_cond_destroy(&lock->read_cv) == 0); + opr_Verify(pthread_cond_destroy(&lock->write_cv) == 0); #endif /* AFS_PTHREAD_ENV */ } @@ -75,7 +68,7 @@ Afs_Lock_Obtain(struct Lock *lock, int how) do { lock->wait_states |= READ_LOCK; #ifdef AFS_PTHREAD_ENV - CV_WAIT(&lock->read_cv, &lock->mutex); + opr_Verify(pthread_cond_wait(&lock->read_cv, &lock->mutex) == 0); #else /* AFS_PTHREAD_ENV */ LWP_WaitProcess(&lock->readers_reading); #endif /* AFS_PTHREAD_ENV */ @@ -89,7 +82,7 @@ Afs_Lock_Obtain(struct Lock *lock, int how) do { lock->wait_states |= WRITE_LOCK; #ifdef AFS_PTHREAD_ENV - CV_WAIT(&lock->write_cv, &lock->mutex); + opr_Verify(pthread_cond_wait(&lock->write_cv, &lock->mutex) == 0); #else /* AFS_PTHREAD_ENV */ LWP_WaitProcess(&lock->excl_locked); #endif /* AFS_PTHREAD_ENV */ @@ -103,7 +96,7 @@ Afs_Lock_Obtain(struct Lock *lock, int how) do { lock->wait_states |= SHARED_LOCK; #ifdef AFS_PTHREAD_ENV - CV_WAIT(&lock->write_cv, &lock->mutex); + opr_Verify(pthread_cond_wait(&lock->write_cv, &lock->mutex) == 0); #else /* AFS_PTHREAD_ENV */ LWP_WaitProcess(&lock->excl_locked); #endif /* AFS_PTHREAD_ENV */ @@ -117,7 +110,7 @@ Afs_Lock_Obtain(struct Lock *lock, int how) do { lock->wait_states |= WRITE_LOCK; #ifdef AFS_PTHREAD_ENV - CV_WAIT(&lock->write_cv, &lock->mutex); + opr_Verify(pthread_cond_wait(&lock->write_cv, &lock->mutex) == 0); #else /* AFS_PTHREAD_ENV */ LWP_WaitProcess(&lock->excl_locked); #endif /* AFS_PTHREAD_ENV */ @@ -128,7 +121,7 @@ Afs_Lock_Obtain(struct Lock *lock, int how) default: printf("Can't happen, bad LOCK type: %d\n", how); - assert(0); + opr_Assert(0); } } @@ -139,7 +132,7 @@ Afs_Lock_WakeupR(struct Lock *lock) if (lock->wait_states & READ_LOCK) { lock->wait_states &= ~READ_LOCK; #ifdef AFS_PTHREAD_ENV - CV_BROADCAST(&lock->read_cv); + opr_Verify(pthread_cond_broadcast(&lock->read_cv) == 0); #else /* AFS_PTHREAD_ENV */ LWP_NoYieldSignal(&lock->readers_reading); #endif /* AFS_PTHREAD_ENV */ @@ -153,14 +146,14 @@ Afs_Lock_ReleaseR(struct Lock *lock) if (lock->wait_states & READ_LOCK) { lock->wait_states &= ~READ_LOCK; #ifdef AFS_PTHREAD_ENV - CV_BROADCAST(&lock->read_cv); + opr_Verify(pthread_cond_broadcast(&lock->read_cv) == 0); #else /* AFS_PTHREAD_ENV */ LWP_NoYieldSignal(&lock->readers_reading); #endif /* AFS_PTHREAD_ENV */ } else { lock->wait_states &= ~EXCL_LOCKS; #ifdef AFS_PTHREAD_ENV - CV_BROADCAST(&lock->write_cv); + opr_Verify(pthread_cond_broadcast(&lock->write_cv) == 0); #else /* AFS_PTHREAD_ENV */ LWP_NoYieldSignal(&lock->excl_locked); #endif /* AFS_PTHREAD_ENV */ @@ -174,14 +167,14 @@ Afs_Lock_ReleaseW(struct Lock *lock) if (lock->wait_states & EXCL_LOCKS) { lock->wait_states &= ~EXCL_LOCKS; #ifdef AFS_PTHREAD_ENV - CV_BROADCAST(&lock->write_cv); + opr_Verify(pthread_cond_broadcast(&lock->write_cv) == 0); #else /* AFS_PTHREAD_ENV */ LWP_NoYieldSignal(&lock->excl_locked); #endif /* AFS_PTHREAD_ENV */ } else { lock->wait_states &= ~READ_LOCK; #ifdef AFS_PTHREAD_ENV - CV_BROADCAST(&lock->read_cv); + opr_Verify(pthread_cond_broadcast(&lock->read_cv) == 0); #else /* AFS_PTHREAD_ENV */ LWP_NoYieldSignal(&lock->readers_reading); #endif /* AFS_PTHREAD_ENV */ diff --git a/src/lwp/lock.h b/src/lwp/lock.h index 2f6805c..051eabe 100644 --- a/src/lwp/lock.h +++ b/src/lwp/lock.h @@ -44,11 +44,9 @@ #ifdef AFS_PTHREAD_ENV #include -/* can't include in non-lwp case; rx builds later */ #include -#include -#define LOCK_LOCK(A) MUTEX_ENTER(&(A)->mutex); -#define LOCK_UNLOCK(A) MUTEX_EXIT(&(A)->mutex); +#define LOCK_LOCK(A) opr_Verify(pthread_mutex_lock(&(A)->mutex)); +#define LOCK_UNLOCK(A) opr_Verify(pthread_mutex_unlock(&(A)->mutex)); #else /* AFS_PTHREAD_ENV */ #define LOCK_LOCK(A) #define LOCK_UNLOCK(A) -- 1.9.4