1 /********************************************************
2 * An example source module to accompany...
4 * "Using POSIX Threads: Programming with Pthreads"
5 * by Brad nichols, Dick Buttlar, Jackie Farrell
6 * O'Reilly & Associates, Inc.
8 ********************************************************
11 * Library of functions implementing reader/writer locks
16 int pthread_rdwr_init_np(pthread_rdwr_t *rdwrp, pthread_rdwrattr_t *attrp)
18 rdwrp->readers_reading = 0;
19 rdwrp->writer_writing = 0;
20 pthread_mutex_init(&(rdwrp->mutex), NULL);
21 pthread_cond_init(&(rdwrp->lock_free), NULL);
25 int pthread_rdwr_rlock_np(pthread_rdwr_t *rdwrp){
26 pthread_mutex_lock(&(rdwrp->mutex));
27 while(rdwrp->writer_writing) {
28 pthread_cond_wait(&(rdwrp->lock_free), &(rdwrp->mutex));
30 rdwrp->readers_reading++;
31 pthread_mutex_unlock(&(rdwrp->mutex));
35 int pthread_rdwr_runlock_np(pthread_rdwr_t *rdwrp)
37 pthread_mutex_lock(&(rdwrp->mutex));
38 if (rdwrp->readers_reading == 0) {
39 pthread_mutex_unlock(&(rdwrp->mutex));
43 rdwrp->readers_reading--;
44 if (rdwrp->readers_reading == 0) {
45 pthread_cond_signal(&(rdwrp->lock_free));
47 pthread_mutex_unlock(&(rdwrp->mutex));
52 int pthread_rdwr_wlock_np(pthread_rdwr_t *rdwrp)
54 pthread_mutex_lock(&(rdwrp->mutex));
55 while(rdwrp->writer_writing || rdwrp->readers_reading) {
56 pthread_cond_wait(&(rdwrp->lock_free), &(rdwrp->mutex));
58 rdwrp->writer_writing++;
59 pthread_mutex_unlock(&(rdwrp->mutex));
63 int pthread_rdwr_wunlock_np(pthread_rdwr_t *rdwrp)
65 pthread_mutex_lock(&(rdwrp->mutex));
66 if (rdwrp->writer_writing == 0) {
67 pthread_mutex_unlock(&(rdwrp->mutex));
71 rdwrp->writer_writing = 0;
72 pthread_cond_broadcast(&(rdwrp->lock_free));
73 pthread_mutex_unlock(&(rdwrp->mutex));