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
22 #include <lthread_rdwr.h>
24 int pthread_rdwr_init_np(pthread_rdwr_t *rdwrp, pthread_rdwrattr_t *attrp)
26 rdwrp->readers_reading = 0;
27 rdwrp->writer_writing = 0;
28 pthread_mutex_init(&(rdwrp->mutex), NULL);
29 pthread_cond_init(&(rdwrp->lock_free), NULL);
33 int pthread_rdwr_rlock_np(pthread_rdwr_t *rdwrp){
34 pthread_mutex_lock(&(rdwrp->mutex));
35 while(rdwrp->writer_writing) {
36 pthread_cond_wait(&(rdwrp->lock_free), &(rdwrp->mutex));
38 rdwrp->readers_reading++;
39 pthread_mutex_unlock(&(rdwrp->mutex));
43 int pthread_rdwr_runlock_np(pthread_rdwr_t *rdwrp)
45 pthread_mutex_lock(&(rdwrp->mutex));
46 if (rdwrp->readers_reading == 0) {
47 pthread_mutex_unlock(&(rdwrp->mutex));
51 rdwrp->readers_reading--;
52 if (rdwrp->readers_reading == 0) {
53 pthread_cond_signal(&(rdwrp->lock_free));
55 pthread_mutex_unlock(&(rdwrp->mutex));
60 int pthread_rdwr_wlock_np(pthread_rdwr_t *rdwrp)
62 pthread_mutex_lock(&(rdwrp->mutex));
63 while(rdwrp->writer_writing || rdwrp->readers_reading) {
64 pthread_cond_wait(&(rdwrp->lock_free), &(rdwrp->mutex));
66 rdwrp->writer_writing++;
67 pthread_mutex_unlock(&(rdwrp->mutex));
71 int pthread_rdwr_wunlock_np(pthread_rdwr_t *rdwrp)
73 pthread_mutex_lock(&(rdwrp->mutex));
74 if (rdwrp->writer_writing == 0) {
75 pthread_mutex_unlock(&(rdwrp->mutex));
79 rdwrp->writer_writing = 0;
80 pthread_cond_broadcast(&(rdwrp->lock_free));
81 pthread_mutex_unlock(&(rdwrp->mutex));
89 * return 0 if false, suitable for assert(pthread_rdwr_Xchk(rdwr))
91 * Currently they don't check if the calling thread is the one
92 * that has the lock, just that there is a reader or writer.
94 * Basically sufficent for testing that places that should have
98 int pthread_rdwr_rchk_np(pthread_rdwr_t *rdwrp)
100 return(rdwrp->readers_reading!=0);
103 int pthread_rdwr_wchk_np(pthread_rdwr_t *rdwrp)
105 return(rdwrp->writer_writing!=0);
107 int pthread_rdwr_rwchk_np(pthread_rdwr_t *rdwrp)
109 return(pthread_rdwr_rchk_np(rdwrp) || pthread_rdwr_wchk_np(rdwrp));
112 #endif /* LDAP_DEBUG */