]> git.sur5r.net Git - openldap/blob - libraries/liblthread/rdwr.c
Added Reader/Writer lock code from publicily available examples for
[openldap] / libraries / liblthread / rdwr.c
1 /********************************************************
2  * An example source module to accompany...
3  *
4  * "Using POSIX Threads: Programming with Pthreads"
5  *               by Brad nichols, Dick Buttlar, Jackie Farrell
6  *               O'Reilly & Associates, Inc.
7  *
8  ********************************************************
9  * rdwr.c --
10  * 
11  * Library of functions implementing reader/writer locks
12  */
13 #include <pthread.h>
14 #include "rdwr.h"
15
16 int pthread_rdwr_init_np(pthread_rdwr_t *rdwrp, pthread_rdwrattr_t *attrp)
17 {
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);
22         return 0;
23 }
24
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));
29         }
30         rdwrp->readers_reading++;
31         pthread_mutex_unlock(&(rdwrp->mutex));
32         return 0;
33 }
34
35 int pthread_rdwr_runlock_np(pthread_rdwr_t *rdwrp)
36 {
37         pthread_mutex_lock(&(rdwrp->mutex));
38         if (rdwrp->readers_reading == 0) {
39                 pthread_mutex_unlock(&(rdwrp->mutex));
40                 return -1;
41         }
42         else {
43                 rdwrp->readers_reading--;
44                 if (rdwrp->readers_reading == 0) {
45                         pthread_cond_signal(&(rdwrp->lock_free));
46                 }
47                 pthread_mutex_unlock(&(rdwrp->mutex));
48                 return 0;
49         }
50 }
51
52 int pthread_rdwr_wlock_np(pthread_rdwr_t *rdwrp)
53 {
54         pthread_mutex_lock(&(rdwrp->mutex));
55         while(rdwrp->writer_writing || rdwrp->readers_reading) {
56                 pthread_cond_wait(&(rdwrp->lock_free), &(rdwrp->mutex));
57         }
58         rdwrp->writer_writing++;
59         pthread_mutex_unlock(&(rdwrp->mutex));
60         return 0;
61 }
62
63 int pthread_rdwr_wunlock_np(pthread_rdwr_t *rdwrp)
64 {
65         pthread_mutex_lock(&(rdwrp->mutex));
66         if (rdwrp->writer_writing == 0) {
67                 pthread_mutex_unlock(&(rdwrp->mutex));
68                 return -1;
69         }
70         else {
71                 rdwrp->writer_writing = 0;
72                 pthread_cond_broadcast(&(rdwrp->lock_free));
73                 pthread_mutex_unlock(&(rdwrp->mutex));
74                 return 0;
75         }
76 }