00001 #include <stdio.h> 00002 #include <stdlib.h> 00003 #include "include/rwlock.h" 00004 00005 int rwlock_wrlock(rwlock_t* rwlock) 00006 { 00007 MUTEX_LOCK(rwlock->lock); 00008 while(rwlock->readers) { 00009 COND_WAIT(rwlock->writer_cond, rwlock->lock); 00010 } 00011 return 0; 00012 } 00013 00014 int rwlock_wrunlock(rwlock_t* rwlock) 00015 { 00016 COND_SIGNAL(rwlock->reader_cond); 00017 MUTEX_UNLOCK(rwlock->lock); 00018 return 0; 00019 } 00020 00021 int rwlock_rdlock(rwlock_t* rwlock) 00022 { 00023 MUTEX_LOCK(rwlock->lock); 00024 rwlock->readers++; 00025 MUTEX_UNLOCK(rwlock->lock); 00026 return 0; 00027 } 00028 00029 int rwlock_rdunlock(rwlock_t* rwlock) 00030 { 00031 MUTEX_LOCK(rwlock->lock); 00032 rwlock->readers--; 00033 COND_SIGNAL(rwlock->writer_cond); 00034 MUTEX_UNLOCK(rwlock->lock); 00035 return 0; 00036 } 00037 00038 int rwlock_rdwait(rwlock_t* rwlock) 00039 { 00040 MUTEX_LOCK(rwlock->lock); 00041 rwlock->readers--; 00042 COND_WAIT(rwlock->reader_cond, rwlock->lock); 00043 rwlock->readers++; 00044 MUTEX_UNLOCK(rwlock->lock); 00045 return 0; 00046 } 00047 00048 rwlock_t* rwlock_New(void) 00049 { 00050 rwlock_t* rwlock = (rwlock_t*)malloc(sizeof(rwlock_t)); 00051 rwlock->readers = 0; 00052 MUTEX_NEW(rwlock->lock); 00053 MUTEX_INIT(rwlock->lock); 00054 COND_NEW(rwlock->reader_cond); 00055 COND_INIT(rwlock->reader_cond); 00056 COND_NEW(rwlock->writer_cond); 00057 COND_INIT(rwlock->writer_cond); 00058 return rwlock; 00059 } 00060 00061 int rwlock_Destroy(rwlock_t* rwlock) 00062 { 00063 MUTEX_DESTROY(rwlock->lock); 00064 COND_DESTROY(rwlock->reader_cond); 00065 COND_DESTROY(rwlock->writer_cond); 00066 free(rwlock->lock); 00067 free(rwlock->reader_cond); 00068 free(rwlock->writer_cond); 00069 free(rwlock); 00070 return 0; 00071 }