EvgRWLock2 Class Reference

#include <evg_rwlock_2.h>

List of all members.

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


Detailed Description

Definition at line 25 of file evg_rwlock_2.h.


Constructor & Destructor Documentation

EvgRWLock2::EvgRWLock2 (  )  [inline]

Definition at line 40 of file evg_rwlock_2.h.

00040 : rwdata(0L) {}


Member Function Documentation

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]

Definition at line 38 of file evg_rwlock_2.h.

00038 { return "Evgeniy's RW Lock 2"; }

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         }


Member Data Documentation

volatile int EvgRWLock2::readers [private]

Definition at line 27 of file evg_rwlock_2.h.


The documentation for this class was generated from the following file:

Generated on Wed Mar 19 14:59:59 2008 for rwlock by  doxygen 1.5.5