SG_RWLock Class Reference

#include <SG_RWLock.h>

List of all members.

Public Member Functions

 SG_RWLock ()
void enter_read ()
void leave_read ()
void enter_write ()
void leave_write ()

Static Public Member Functions

static const char * name ()

Private Attributes

volatile int readers
volatile int writers
SystemLock l


Detailed Description

Definition at line 9 of file SG_RWLock.h.


Constructor & Destructor Documentation

SG_RWLock::SG_RWLock (  )  [inline]

Definition at line 13 of file SG_RWLock.h.

References readers, and writers.

00014         {
00015                 readers = writers = 0;
00016         }


Member Function Documentation

static const char* SG_RWLock::name (  )  [inline, static]

Definition at line 12 of file SG_RWLock.h.

00012 { return "SG_Lock"; }

void SG_RWLock::enter_read ( void   )  [inline]

Definition at line 17 of file SG_RWLock.h.

References atomic_inc(), readers, thread_yield(), and writers.

00018         {
00019                 atomic_inc(&readers);
00020 
00021         // Wait until all writers have left
00022                 while(writers > 0) thread_yield();
00023         }

void SG_RWLock::leave_read ( void   )  [inline]

Definition at line 24 of file SG_RWLock.h.

References atomic_dec(), and readers.

00025         {
00026                 atomic_dec(&readers);
00027         }

void SG_RWLock::enter_write ( void   )  [inline]

Definition at line 28 of file SG_RWLock.h.

References atomic_dec(), atomic_inc(), l, SystemLock::lock(), readers, thread_yield(), and writers.

00029         {
00030                 // Use a critsec for mutual exclusion between writers
00031                 l.lock();
00032                 // We must now wait until all readers have left the lock
00033                 atomic_inc(&writers);
00034 // -BUG         writers++; // Assume there are no readers
00035                 while (readers > 0) 
00036                 {
00037                         // Readers in the lock
00038                         // Decrement writers again to avoid deadlocking with readers that
00039                         // are interrupted immediately after incrementing readers
00040                         atomic_dec(&writers);
00041 // - BUG                        writers--;
00042                         thread_yield();
00043                         atomic_inc(&writers);
00044 // --BUG                        writers++; // Try again
00045                 }
00046         }

void SG_RWLock::leave_write ( void   )  [inline]

Definition at line 47 of file SG_RWLock.h.

References atomic_dec(), l, SystemLock::unlock(), and writers.

00048         {   
00049                 atomic_dec(&writers);
00050                 l.unlock();
00051         }


Member Data Documentation

volatile int SG_RWLock::readers [private]

Definition at line 53 of file SG_RWLock.h.

Referenced by enter_read(), enter_write(), leave_read(), and SG_RWLock().

volatile int SG_RWLock::writers [private]

Definition at line 54 of file SG_RWLock.h.

Referenced by enter_read(), enter_write(), leave_write(), and SG_RWLock().

Definition at line 55 of file SG_RWLock.h.

Referenced by enter_write(), and leave_write().


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