summaryrefslogtreecommitdiff
path: root/lib/libpthread/thread/thr_rwlock.c
diff options
context:
space:
mode:
authorAlexander Kabaev <kan@FreeBSD.org>2003-05-30 00:21:52 +0000
committerAlexander Kabaev <kan@FreeBSD.org>2003-05-30 00:21:52 +0000
commit84d55c7fad83f4fa1330cc8c2206da8ebd0b300d (patch)
tree94d7f73e2932ac623f1590991875a38731aca104 /lib/libpthread/thread/thr_rwlock.c
parent43dd76d2428f29c23526d500d7e28d7dfce6fa49 (diff)
Notes
Diffstat (limited to 'lib/libpthread/thread/thr_rwlock.c')
-rw-r--r--lib/libpthread/thread/thr_rwlock.c33
1 files changed, 19 insertions, 14 deletions
diff --git a/lib/libpthread/thread/thr_rwlock.c b/lib/libpthread/thread/thr_rwlock.c
index 5f1d8e77363a..f9559ab79ba7 100644
--- a/lib/libpthread/thread/thr_rwlock.c
+++ b/lib/libpthread/thread/thr_rwlock.c
@@ -46,7 +46,6 @@ __weak_reference(_pthread_rwlock_trywrlock, pthread_rwlock_trywrlock);
__weak_reference(_pthread_rwlock_unlock, pthread_rwlock_unlock);
__weak_reference(_pthread_rwlock_wrlock, pthread_rwlock_wrlock);
-
/*
* Prototypes
*/
@@ -158,16 +157,16 @@ _pthread_rwlock_rdlock (pthread_rwlock_t *rwlock)
}
/* grab the monitor lock */
- if ((ret = _pthread_mutex_lock(&prwlock->lock)) != 0)
+ if ((ret = _thr_mutex_lock(&prwlock->lock)) != 0)
return (ret);
/* give writers priority over readers */
while (prwlock->blocked_writers || prwlock->state < 0) {
- ret = _pthread_cond_wait(&prwlock->read_signal, &prwlock->lock);
+ ret = _thr_cond_wait(&prwlock->read_signal, &prwlock->lock);
if (ret != 0) {
/* can't do a whole lot if this fails */
- _pthread_mutex_unlock(&prwlock->lock);
+ _thr_mutex_unlock(&prwlock->lock);
return (ret);
}
}
@@ -184,11 +183,13 @@ _pthread_rwlock_rdlock (pthread_rwlock_t *rwlock)
* lock. Decrementing 'state' is no good because we probably
* don't have the monitor lock.
*/
- _pthread_mutex_unlock(&prwlock->lock);
+ _thr_mutex_unlock(&prwlock->lock);
return (ret);
}
+__strong_reference(_pthread_rwlock_rdlock, _thr_rwlock_rdlock);
+
int
_pthread_rwlock_tryrdlock (pthread_rwlock_t *rwlock)
{
@@ -276,28 +277,30 @@ _pthread_rwlock_unlock (pthread_rwlock_t *rwlock)
return (EINVAL);
/* grab the monitor lock */
- if ((ret = _pthread_mutex_lock(&prwlock->lock)) != 0)
+ if ((ret = _thr_mutex_lock(&prwlock->lock)) != 0)
return (ret);
if (prwlock->state > 0) {
if (--prwlock->state == 0 && prwlock->blocked_writers)
- ret = _pthread_cond_signal(&prwlock->write_signal);
+ ret = _thr_cond_signal(&prwlock->write_signal);
} else if (prwlock->state < 0) {
prwlock->state = 0;
if (prwlock->blocked_writers)
- ret = _pthread_cond_signal(&prwlock->write_signal);
+ ret = _thr_cond_signal(&prwlock->write_signal);
else
- ret = _pthread_cond_broadcast(&prwlock->read_signal);
+ ret = _thr_cond_broadcast(&prwlock->read_signal);
} else
ret = EINVAL;
/* see the comment on this in pthread_rwlock_rdlock */
- _pthread_mutex_unlock(&prwlock->lock);
+ _thr_mutex_unlock(&prwlock->lock);
return (ret);
}
+__strong_reference(_pthread_rwlock_unlock, _thr_rwlock_unlock);
+
int
_pthread_rwlock_wrlock (pthread_rwlock_t *rwlock)
{
@@ -318,17 +321,17 @@ _pthread_rwlock_wrlock (pthread_rwlock_t *rwlock)
}
/* grab the monitor lock */
- if ((ret = _pthread_mutex_lock(&prwlock->lock)) != 0)
+ if ((ret = _thr_mutex_lock(&prwlock->lock)) != 0)
return (ret);
while (prwlock->state != 0) {
++prwlock->blocked_writers;
- ret = _pthread_cond_wait(&prwlock->write_signal, &prwlock->lock);
+ ret = _thr_cond_wait(&prwlock->write_signal, &prwlock->lock);
if (ret != 0) {
--prwlock->blocked_writers;
- _pthread_mutex_unlock(&prwlock->lock);
+ _thr_mutex_unlock(&prwlock->lock);
return (ret);
}
@@ -339,7 +342,9 @@ _pthread_rwlock_wrlock (pthread_rwlock_t *rwlock)
prwlock->state = -1;
/* see the comment on this in pthread_rwlock_rdlock */
- _pthread_mutex_unlock(&prwlock->lock);
+ _thr_mutex_unlock(&prwlock->lock);
return (ret);
}
+
+__strong_reference(_pthread_rwlock_wrlock, _thr_rwlock_wrlock);