#include <evg_rwlock_2.h>
Public Member Functions | |
| EvgRWLock2 () | |
| 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 | readers |
Definition at line 25 of file evg_rwlock_2.h.
| EvgRWLock2::EvgRWLock2 | ( | ) | [inline] |
| void EvgRWLock2::yield | ( | ) | [inline, private] |
Definition at line 32 of file evg_rwlock_2.h.
References thread_yield().
Referenced by enter_read(), and enter_write().
00033 { 00034 thread_yield(); 00035 }
| static const char* EvgRWLock2::name | ( | ) | [inline, static] |
| void EvgRWLock2::enter_read | ( | void | ) | [inline] |
Definition at line 44 of file evg_rwlock_2.h.
References atomic_dec_return(), atomic_inc_return(), and yield().
00045 { 00046 if(atomic_inc_return(&rwdata) & 0xFFFF8000) 00047 for(;;) 00048 { 00049 if(atomic_dec_return(&rwdata) & 0xFFFF8000) yield(); 00050 if((atomic_inc_return(&rwdata) & 0xFFFF8000)==0) break; 00051 } 00052 }
| void EvgRWLock2::leave_read | ( | void | ) | [inline] |
Definition at line 56 of file evg_rwlock_2.h.
References atomic_dec().
00057 { 00058 atomic_dec(&rwdata); 00059 }
| void EvgRWLock2::enter_write | ( | void | ) | [inline] |
Definition at line 63 of file evg_rwlock_2.h.
References atomic_add(), atomic_cmpexch_return(), atomic_cmpexch_return_w(), and yield().
00064 { 00065 if(atomic_cmpexch_return(&rwdata, 0x00008000, 0)) 00066 { 00067 atomic_add(&rwdata, 0x00010000); 00068 for(;;) 00069 { 00070 if(atomic_cmpexch_return_w((short *)&rwdata, (short)0x8000, (short)0) == 0) 00071 { 00072 atomic_add(&rwdata, -0x00010000); 00073 break; 00074 } 00075 yield(); 00076 } 00077 } 00078 }
| void EvgRWLock2::leave_write | ( | void | ) | [inline] |
Definition at line 82 of file evg_rwlock_2.h.
References atomic_and().
00083 { 00084 atomic_and(&rwdata, ~0x00008000); 00085 }
volatile int EvgRWLock2::readers [private] |
Definition at line 27 of file evg_rwlock_2.h.
1.5.5