2 ** This basic implementation of Reader/Writer locks does not
3 ** protect writers from starvation. That is, if a writer is
4 ** currently waiting on a reader, any new reader will get
5 ** the lock before the writer.
8 /********************************************************
9 * An example source module to accompany...
11 * "Using POSIX Threads: Programming with Pthreads"
12 * by Brad nichols, Dick Buttlar, Jackie Farrell
13 * O'Reilly & Associates, Inc.
15 ********************************************************
18 * Library of functions implementing reader/writer locks
21 #include <lthread_rdwr.h>
23 int pthread_rdwr_init_np(pthread_rdwr_t *rdwrp, pthread_rdwrattr_t *attrp)
25 rdwrp->readers_reading = 0;
26 rdwrp->writer_writing = 0;
27 pthread_mutex_init(&(rdwrp->mutex), NULL);
28 pthread_cond_init(&(rdwrp->lock_free), NULL);
32 int pthread_rdwr_rlock_np(pthread_rdwr_t *rdwrp){
33 pthread_mutex_lock(&(rdwrp->mutex));
34 while(rdwrp->writer_writing) {
35 pthread_cond_wait(&(rdwrp->lock_free), &(rdwrp->mutex));
37 rdwrp->readers_reading++;
38 pthread_mutex_unlock(&(rdwrp->mutex));
42 int pthread_rdwr_runlock_np(pthread_rdwr_t *rdwrp)
44 pthread_mutex_lock(&(rdwrp->mutex));
45 if (rdwrp->readers_reading == 0) {
46 pthread_mutex_unlock(&(rdwrp->mutex));
50 rdwrp->readers_reading--;
51 if (rdwrp->readers_reading == 0) {
52 pthread_cond_signal(&(rdwrp->lock_free));
54 pthread_mutex_unlock(&(rdwrp->mutex));
59 int pthread_rdwr_wlock_np(pthread_rdwr_t *rdwrp)
61 pthread_mutex_lock(&(rdwrp->mutex));
62 while(rdwrp->writer_writing || rdwrp->readers_reading) {
63 pthread_cond_wait(&(rdwrp->lock_free), &(rdwrp->mutex));
65 rdwrp->writer_writing++;
66 pthread_mutex_unlock(&(rdwrp->mutex));
70 int pthread_rdwr_wunlock_np(pthread_rdwr_t *rdwrp)
72 pthread_mutex_lock(&(rdwrp->mutex));
73 if (rdwrp->writer_writing == 0) {
74 pthread_mutex_unlock(&(rdwrp->mutex));
78 rdwrp->writer_writing = 0;
79 pthread_cond_broadcast(&(rdwrp->lock_free));
80 pthread_mutex_unlock(&(rdwrp->mutex));