#include <afsconfig.h>
#include <afs/param.h>
-
-#ifndef AFS_PTHREAD_ENV
+#ifdef AFS_PTHREAD_ENV
#include <afs/afs_assert.h>
-#else /* AFS_PTHREAD_ENV */
+/* can't include this in lwp, rx hasn't built yet */
+#include <rx/rx.h>
+#else
#include <assert.h>
-#endif /* AFS_PTHRED_ENV */
+#endif
+
#include "lwp.h"
#include "lock.h"
#include <stdio.h>
lock->wait_states = 0;
lock->num_waiting = 0;
#ifdef AFS_PTHREAD_ENV
- assert(pthread_mutex_init(&lock->mutex, (const pthread_mutexattr_t *)0) ==
- 0);
- assert(pthread_cond_init(&lock->read_cv, (const pthread_condattr_t *)0) ==
- 0);
- assert(pthread_cond_init(&lock->write_cv, (const pthread_condattr_t *)0)
- == 0);
-#endif /* AFS_PTHRED_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);
+#endif /* AFS_PTHREAD_ENV */
}
void
Lock_Destroy(struct Lock *lock)
{
#ifdef AFS_PTHREAD_ENV
- assert(pthread_mutex_destroy(&lock->mutex) == 0);
- assert(pthread_cond_destroy(&lock->read_cv) == 0);
- assert(pthread_cond_destroy(&lock->write_cv) == 0);
-#endif /* AFS_PTHRED_ENV */
+ MUTEX_DESTROY(&lock->mutex);
+ CV_DESTROY(&lock->read_cv);
+ CV_DESTROY(&lock->write_cv);
+#endif /* AFS_PTHREAD_ENV */
}
void
do {
lock->wait_states |= READ_LOCK;
#ifdef AFS_PTHREAD_ENV
- assert(pthread_cond_wait(&lock->read_cv, &lock->mutex) == 0);
+ CV_WAIT(&lock->read_cv, &lock->mutex);
#else /* AFS_PTHREAD_ENV */
LWP_WaitProcess(&lock->readers_reading);
#endif /* AFS_PTHREAD_ENV */
do {
lock->wait_states |= WRITE_LOCK;
#ifdef AFS_PTHREAD_ENV
- assert(pthread_cond_wait(&lock->write_cv, &lock->mutex) == 0);
+ CV_WAIT(&lock->write_cv, &lock->mutex);
#else /* AFS_PTHREAD_ENV */
LWP_WaitProcess(&lock->excl_locked);
#endif /* AFS_PTHREAD_ENV */
do {
lock->wait_states |= SHARED_LOCK;
#ifdef AFS_PTHREAD_ENV
- assert(pthread_cond_wait(&lock->write_cv, &lock->mutex) == 0);
+ CV_WAIT(&lock->write_cv, &lock->mutex);
#else /* AFS_PTHREAD_ENV */
LWP_WaitProcess(&lock->excl_locked);
#endif /* AFS_PTHREAD_ENV */
do {
lock->wait_states |= WRITE_LOCK;
#ifdef AFS_PTHREAD_ENV
- assert(pthread_cond_wait(&lock->write_cv, &lock->mutex) == 0);
+ CV_WAIT(&lock->write_cv, &lock->mutex);
#else /* AFS_PTHREAD_ENV */
LWP_WaitProcess(&lock->excl_locked);
#endif /* AFS_PTHREAD_ENV */
if (lock->wait_states & READ_LOCK) {
lock->wait_states &= ~READ_LOCK;
#ifdef AFS_PTHREAD_ENV
- assert(pthread_cond_broadcast(&lock->read_cv) == 0);
+ CV_BROADCAST(&lock->read_cv);
#else /* AFS_PTHREAD_ENV */
LWP_NoYieldSignal(&lock->readers_reading);
#endif /* AFS_PTHREAD_ENV */
if (lock->wait_states & READ_LOCK) {
lock->wait_states &= ~READ_LOCK;
#ifdef AFS_PTHREAD_ENV
- assert(pthread_cond_broadcast(&lock->read_cv) == 0);
+ CV_BROADCAST(&lock->read_cv);
#else /* AFS_PTHREAD_ENV */
LWP_NoYieldSignal(&lock->readers_reading);
#endif /* AFS_PTHREAD_ENV */
} else {
lock->wait_states &= ~EXCL_LOCKS;
#ifdef AFS_PTHREAD_ENV
- assert(pthread_cond_broadcast(&lock->write_cv) == 0);
+ CV_BROADCAST(&lock->write_cv);
#else /* AFS_PTHREAD_ENV */
LWP_NoYieldSignal(&lock->excl_locked);
#endif /* AFS_PTHREAD_ENV */
if (lock->wait_states & EXCL_LOCKS) {
lock->wait_states &= ~EXCL_LOCKS;
#ifdef AFS_PTHREAD_ENV
- assert(pthread_cond_broadcast(&lock->write_cv) == 0);
+ CV_BROADCAST(&lock->write_cv);
#else /* AFS_PTHREAD_ENV */
LWP_NoYieldSignal(&lock->excl_locked);
#endif /* AFS_PTHREAD_ENV */
} else {
lock->wait_states &= ~READ_LOCK;
#ifdef AFS_PTHREAD_ENV
- assert(pthread_cond_broadcast(&lock->read_cv) == 0);
+ CV_BROADCAST(&lock->read_cv);
#else /* AFS_PTHREAD_ENV */
LWP_NoYieldSignal(&lock->readers_reading);
#endif /* AFS_PTHREAD_ENV */