mirror of
https://git.openldap.org/openldap/openldap.git
synced 2025-01-18 11:05:48 +08:00
Added Reader/Writer lock code from publicily available examples for
Nichols, Butler, Farrell's book "Pthreads Programming" (O'Reilly).
This commit is contained in:
parent
fe035ff175
commit
5d64c8f95d
76
libraries/liblthread/rdwr.c
Normal file
76
libraries/liblthread/rdwr.c
Normal file
@ -0,0 +1,76 @@
|
||||
/********************************************************
|
||||
* An example source module to accompany...
|
||||
*
|
||||
* "Using POSIX Threads: Programming with Pthreads"
|
||||
* by Brad nichols, Dick Buttlar, Jackie Farrell
|
||||
* O'Reilly & Associates, Inc.
|
||||
*
|
||||
********************************************************
|
||||
* rdwr.c --
|
||||
*
|
||||
* Library of functions implementing reader/writer locks
|
||||
*/
|
||||
#include <pthread.h>
|
||||
#include "rdwr.h"
|
||||
|
||||
int pthread_rdwr_init_np(pthread_rdwr_t *rdwrp, pthread_rdwrattr_t *attrp)
|
||||
{
|
||||
rdwrp->readers_reading = 0;
|
||||
rdwrp->writer_writing = 0;
|
||||
pthread_mutex_init(&(rdwrp->mutex), NULL);
|
||||
pthread_cond_init(&(rdwrp->lock_free), NULL);
|
||||
return 0;
|
||||
}
|
||||
|
||||
int pthread_rdwr_rlock_np(pthread_rdwr_t *rdwrp){
|
||||
pthread_mutex_lock(&(rdwrp->mutex));
|
||||
while(rdwrp->writer_writing) {
|
||||
pthread_cond_wait(&(rdwrp->lock_free), &(rdwrp->mutex));
|
||||
}
|
||||
rdwrp->readers_reading++;
|
||||
pthread_mutex_unlock(&(rdwrp->mutex));
|
||||
return 0;
|
||||
}
|
||||
|
||||
int pthread_rdwr_runlock_np(pthread_rdwr_t *rdwrp)
|
||||
{
|
||||
pthread_mutex_lock(&(rdwrp->mutex));
|
||||
if (rdwrp->readers_reading == 0) {
|
||||
pthread_mutex_unlock(&(rdwrp->mutex));
|
||||
return -1;
|
||||
}
|
||||
else {
|
||||
rdwrp->readers_reading--;
|
||||
if (rdwrp->readers_reading == 0) {
|
||||
pthread_cond_signal(&(rdwrp->lock_free));
|
||||
}
|
||||
pthread_mutex_unlock(&(rdwrp->mutex));
|
||||
return 0;
|
||||
}
|
||||
}
|
||||
|
||||
int pthread_rdwr_wlock_np(pthread_rdwr_t *rdwrp)
|
||||
{
|
||||
pthread_mutex_lock(&(rdwrp->mutex));
|
||||
while(rdwrp->writer_writing || rdwrp->readers_reading) {
|
||||
pthread_cond_wait(&(rdwrp->lock_free), &(rdwrp->mutex));
|
||||
}
|
||||
rdwrp->writer_writing++;
|
||||
pthread_mutex_unlock(&(rdwrp->mutex));
|
||||
return 0;
|
||||
}
|
||||
|
||||
int pthread_rdwr_wunlock_np(pthread_rdwr_t *rdwrp)
|
||||
{
|
||||
pthread_mutex_lock(&(rdwrp->mutex));
|
||||
if (rdwrp->writer_writing == 0) {
|
||||
pthread_mutex_unlock(&(rdwrp->mutex));
|
||||
return -1;
|
||||
}
|
||||
else {
|
||||
rdwrp->writer_writing = 0;
|
||||
pthread_cond_broadcast(&(rdwrp->lock_free));
|
||||
pthread_mutex_unlock(&(rdwrp->mutex));
|
||||
return 0;
|
||||
}
|
||||
}
|
28
libraries/liblthread/rdwr.h
Normal file
28
libraries/liblthread/rdwr.h
Normal file
@ -0,0 +1,28 @@
|
||||
/********************************************************
|
||||
* An example source module to accompany...
|
||||
*
|
||||
* "Using POSIX Threads: Programming with Pthreads"
|
||||
* by Brad nichols, Dick Buttlar, Jackie Farrell
|
||||
* O'Reilly & Associates, Inc.
|
||||
*
|
||||
********************************************************
|
||||
* rdwr.h --
|
||||
*
|
||||
* Include file for reader/writer locks
|
||||
*/
|
||||
typedef struct rdwr_var {
|
||||
int readers_reading;
|
||||
int writer_writing;
|
||||
pthread_mutex_t mutex;
|
||||
pthread_cond_t lock_free;
|
||||
} pthread_rdwr_t;
|
||||
|
||||
typedef void * pthread_rdwrattr_t;
|
||||
|
||||
#define pthread_rdwrattr_default NULL;
|
||||
|
||||
int pthread_rdwr_init_np(pthread_rdwr_t *rdwrp, pthread_rdwrattr_t *attrp);
|
||||
int pthread_rdwr_rlock_np(pthread_rdwr_t *rdwrp);
|
||||
int pthread_rdwr_runlock_np(pthread_rdwr_t *rdwrp);
|
||||
int pthread_rdwr_wlock_np(pthread_rdwr_t *rdwrp);
|
||||
int pthread_rdwr_wunlock_np(pthread_rdwr_t *rdwrp);
|
Loading…
Reference in New Issue
Block a user