2004-06-24 21:10:31 +00:00
|
|
|
/*
|
|
|
|
* File : rw.c
|
|
|
|
*
|
|
|
|
* Title : Demo Readers/Writer.
|
|
|
|
*
|
|
|
|
* Short : A solution to the multi-reader's, one writer problem.
|
|
|
|
*
|
|
|
|
* Long :
|
|
|
|
*
|
|
|
|
* Author : Andrae Muys
|
|
|
|
*
|
|
|
|
* Date : 18 September 1997
|
|
|
|
*
|
|
|
|
* Revised : 4-7-04 Shamelessly stolen and adapted by Rusty Sears.
|
|
|
|
* Found the code at this url:
|
|
|
|
* http://www.cs.nmsu.edu/~jcook/Tools/pthreads/rw.c
|
|
|
|
*/
|
|
|
|
|
|
|
|
#include <stdlib.h>
|
|
|
|
#include <pthread.h>
|
|
|
|
#include <stdio.h>
|
|
|
|
#include <unistd.h>
|
2004-07-04 00:46:49 +00:00
|
|
|
#ifndef __LIBDFA_RW_H
|
|
|
|
#define __LIBDFA_RW_H
|
2007-08-24 23:01:08 +00:00
|
|
|
|
|
|
|
#ifdef __cplusplus
|
|
|
|
# define BEGIN_C_DECLS extern "C" {
|
|
|
|
# define END_C_DECLS }
|
|
|
|
#else /* !__cplusplus */
|
|
|
|
# define BEGIN_C_DECLS
|
|
|
|
# define END_C_DECLS
|
|
|
|
#endif /* __cplusplus */
|
|
|
|
|
|
|
|
BEGIN_C_DECLS
|
|
|
|
|
2004-06-24 21:10:31 +00:00
|
|
|
typedef struct {
|
|
|
|
pthread_mutex_t *mut;
|
|
|
|
int writers;
|
|
|
|
int readers;
|
|
|
|
int waiting;
|
|
|
|
pthread_cond_t *writeOK, *readOK;
|
|
|
|
} rwl;
|
|
|
|
|
|
|
|
rwl *initlock (void);
|
|
|
|
void readlock (rwl *lock, int d);
|
2007-03-08 07:36:02 +00:00
|
|
|
int tryreadlock(rwl *lock, int d);
|
2004-06-24 21:10:31 +00:00
|
|
|
void writelock (rwl *lock, int d);
|
2007-03-08 07:36:02 +00:00
|
|
|
int trywritelock(rwl *lock, int d);
|
2007-06-01 21:32:33 +00:00
|
|
|
/** aborts if called when no thread holds this latch. */
|
|
|
|
void assertlocked(rwl *lock);
|
2004-07-20 00:15:17 +00:00
|
|
|
void downgradelock(rwl * lock);
|
|
|
|
void unlock(rwl * lock);
|
|
|
|
/** @deprecated in favor of unlock() */
|
2004-06-24 21:10:31 +00:00
|
|
|
void readunlock (rwl *lock);
|
2004-07-20 00:15:17 +00:00
|
|
|
/** @deprecated in favor of unlock() */
|
2004-06-24 21:10:31 +00:00
|
|
|
void writeunlock (rwl *lock);
|
|
|
|
void deletelock (rwl *lock);
|
|
|
|
/*
|
|
|
|
typedef struct {
|
|
|
|
rwl *lock;
|
|
|
|
int id;
|
|
|
|
long delay;
|
|
|
|
} rwargs;
|
|
|
|
|
|
|
|
rwargs *newRWargs (rwl *l, int i, long d);
|
|
|
|
void *reader (void *args);
|
|
|
|
void *writer (void *args);
|
|
|
|
*/
|
2007-08-24 23:01:08 +00:00
|
|
|
|
|
|
|
END_C_DECLS
|
|
|
|
|
2004-07-04 00:46:49 +00:00
|
|
|
#endif /* rw.h */
|