lwp: Don't depend on RX locking macros
authorSimon Wilkinson <sxw@your-file-system.com>
Sun, 10 Jul 2011 12:50:03 +0000 (13:50 +0100)
committerDerrick Brashear <shadow@dementix.org>
Tue, 4 Sep 2012 13:53:55 +0000 (06:53 -0700)
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 <jaltman@your-file-system.com>
Tested-by: BuildBot <buildbot@rampaginggeek.com>
Reviewed-by: Derrick Brashear <shadow@dementix.org>

src/lwp/lock.c
src/lwp/lock.h

index d24a83b..ed50626 100644 (file)
 #include <afs/param.h>
 
 #include <roken.h>
-
 #include <afs/opr.h>
 
-#ifdef AFS_PTHREAD_ENV
-#include <rx/rx.h>
-#endif
-
-#include <assert.h>
-
 #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 */
index 2f6805c..051eabe 100644 (file)
 
 #ifdef AFS_PTHREAD_ENV
 #include <pthread.h>
-/* can't include in non-lwp case; rx builds later */
 #include <afs/opr.h>
-#include <rx/rx.h>
-#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)