#include <evg_rwlock.h>
Public Member Functions | |
SharedCounterRWLock () | |
void | enter_read (void) |
void | leave_read (void) |
void | enter_write (void) |
void | leave_write (void) |
Static Public Member Functions | |
static const char * | name () |
Private Member Functions | |
void | yield () |
Private Attributes | |
volatile int | rwdata |
Definition at line 25 of file evg_rwlock.h.
SharedCounterRWLock::SharedCounterRWLock | ( | ) | [inline] |
void SharedCounterRWLock::yield | ( | ) | [inline, private] |
Definition at line 32 of file evg_rwlock.h.
References thread_yield().
Referenced by enter_read(), and enter_write().
00033 { 00034 thread_yield(); 00035 }
static const char* SharedCounterRWLock::name | ( | ) | [inline, static] |
void SharedCounterRWLock::enter_read | ( | void | ) | [inline] |
Definition at line 44 of file evg_rwlock.h.
References atomic_dec_return(), atomic_inc_return(), rwdata, and yield().
00045 { 00046 if(atomic_inc_return(&rwdata) & 0x80000000) 00047 for(;;) 00048 { 00049 if(atomic_dec_return(&rwdata) & 0x80000000) yield(); 00050 if((atomic_inc_return(&rwdata) & 0x80000000)==0) break; 00051 } 00052 }
void SharedCounterRWLock::leave_read | ( | void | ) | [inline] |
Definition at line 57 of file evg_rwlock.h.
References atomic_dec(), and rwdata.
00058 { 00059 atomic_dec(&rwdata); 00060 }
void SharedCounterRWLock::enter_write | ( | void | ) | [inline] |
Definition at line 65 of file evg_rwlock.h.
References atomic_cmpexch_return(), rwdata, and yield().
00066 { 00067 for(;;) 00068 { 00069 if(atomic_cmpexch_return(&rwdata, 0x80000000, 0) == 0) break; 00070 if(rwdata) yield(); 00071 } 00072 }
void SharedCounterRWLock::leave_write | ( | void | ) | [inline] |
Definition at line 77 of file evg_rwlock.h.
References atomic_and(), and rwdata.
00078 { 00079 atomic_and(&rwdata, ~0x80000000); 00080 // atomic_add(&rwdata, 0x80000000); 00081 }
volatile int SharedCounterRWLock::rwdata [private] |
Definition at line 27 of file evg_rwlock.h.
Referenced by enter_read(), enter_write(), leave_read(), and leave_write().