EvgW32RWLock Class Reference

#include <evg_w32_rwlock.h>

List of all members.

Public Member Functions

 EvgW32RWLock ()
virtual ~EvgW32RWLock ()
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 ()
void reader_wait (long milliseconds)
void signal_readers (void)
void writer_wait (long milliseconds)
void signal_writers (void)

Private Attributes

volatile long rwdata
volatile long waiting_readers
volatile long waiting_writers
HANDLE readers_iocport
HANDLE writers_iocport


Detailed Description

Definition at line 26 of file evg_w32_rwlock.h.


Constructor & Destructor Documentation

EvgW32RWLock::EvgW32RWLock (  )  [inline]

Definition at line 94 of file evg_w32_rwlock.h.

References readers_iocport, and writers_iocport.

00094                        : rwdata(0L), waiting_readers(0), waiting_writers(0)
00095         {
00096                  readers_iocport = CreateIoCompletionPort(
00097                          INVALID_HANDLE_VALUE, 
00098                          NULL,
00099                          NULL,
00100                          0);
00101                  writers_iocport = CreateIoCompletionPort(
00102                          INVALID_HANDLE_VALUE, 
00103                          NULL,
00104                          NULL,
00105                          0);
00106         }

virtual EvgW32RWLock::~EvgW32RWLock (  )  [inline, virtual]

Definition at line 108 of file evg_w32_rwlock.h.

References readers_iocport, and writers_iocport.

00109         {
00110                 CloseHandle(readers_iocport);
00111                 CloseHandle(writers_iocport);
00112     }


Member Function Documentation

void EvgW32RWLock::yield (  )  [inline, private]

Definition at line 37 of file evg_w32_rwlock.h.

00038         {
00039                 Sleep(0);
00040         }

void EvgW32RWLock::reader_wait ( long  milliseconds  )  [inline, private]

Definition at line 42 of file evg_w32_rwlock.h.

References readers_iocport.

00043         {
00044                 DWORD ln;
00045                 ULONG_PTR key;
00046                 LPOVERLAPPED ovlp;
00047                 GetQueuedCompletionStatus(
00048                         readers_iocport,
00049                         &ln,
00050                         &key,
00051                         &ovlp,
00052                         milliseconds);
00053         }

void EvgW32RWLock::signal_readers ( void   )  [inline, private]

Definition at line 54 of file evg_w32_rwlock.h.

References readers_iocport, and waiting_readers.

Referenced by leave_write().

00055         {
00056                 long i, w=waiting_readers;
00057                 for(i=0; i<w; i++)
00058                 {
00059                         PostQueuedCompletionStatus(
00060                                 readers_iocport,
00061                                 0,
00062                                 NULL,
00063                                 NULL);
00064                 }
00065         }

void EvgW32RWLock::writer_wait ( long  milliseconds  )  [inline, private]

Definition at line 66 of file evg_w32_rwlock.h.

References writers_iocport.

Referenced by enter_write().

00067         {
00068                 DWORD ln;
00069                 ULONG_PTR key;
00070                 LPOVERLAPPED ovlp;
00071                 GetQueuedCompletionStatus(
00072                         writers_iocport,
00073                         &ln,
00074                         &key,
00075                         &ovlp,
00076                         milliseconds);
00077         }

void EvgW32RWLock::signal_writers ( void   )  [inline, private]

Definition at line 78 of file evg_w32_rwlock.h.

References waiting_writers, and writers_iocport.

00079         {
00080                 long i, w=waiting_writers;
00081                 //InterlockedExchangeAdd(&waiting_writers, -w);
00082                 for(i=0; i<w; w++)
00083                 {
00084                         PostQueuedCompletionStatus(
00085                                 writers_iocport,
00086                                 0,
00087                                 NULL,
00088                                 NULL);
00089                 }
00090         }

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

Definition at line 92 of file evg_w32_rwlock.h.

00092 { return "Evgeniy's W32 RW Lock"; }

void EvgW32RWLock::enter_read ( void   )  [inline]

Definition at line 116 of file evg_w32_rwlock.h.

References atomic_dec(), atomic_inc(), and rwdata.

00117         {
00118 //              for(;;)
00119 //              {
00120                         if((atomic_inc(rwdata) & 0x80000000) == 0) break;
00121                         if(atomic_dec(rwdata) & 0x80000000)
00122                         {
00123                                 take_writer_lock();
00124                                 atomic_inc(rwdata);
00125                                 release_writer_lock();
00126                         }
00127 //              }
00128         }

void EvgW32RWLock::leave_read ( void   )  [inline]

Definition at line 132 of file evg_w32_rwlock.h.

References atomic_dec(), and rwdata.

00133         {
00134                 atomic_dec(rwdata);
00135         }

void EvgW32RWLock::enter_write ( void   )  [inline]

Definition at line 139 of file evg_w32_rwlock.h.

References atomic_dec(), rwdata, waiting_writers, and writer_wait().

00140         {
00141                 for(;;)
00142                 {
00143                         if(InterlockedCompareExchange(&rwdata, 0x80000000, 0) == 0) break;
00144                         writer_wait(100);
00145                 }
00146                 atomic_dec(waiting_writers);
00147         }

void EvgW32RWLock::leave_write ( void   )  [inline]

Definition at line 152 of file evg_w32_rwlock.h.

References rwdata, and signal_readers().

00153         {
00154                 InterlockedExchangeAdd(&rwdata, 0x80000000);
00155                 signal_readers();
00156         }


Member Data Documentation

volatile long EvgW32RWLock::rwdata [private]

Definition at line 28 of file evg_w32_rwlock.h.

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

volatile long EvgW32RWLock::waiting_readers [private]

Definition at line 29 of file evg_w32_rwlock.h.

Referenced by signal_readers().

volatile long EvgW32RWLock::waiting_writers [private]

Definition at line 30 of file evg_w32_rwlock.h.

Referenced by enter_write(), and signal_writers().

Definition at line 31 of file evg_w32_rwlock.h.

Referenced by EvgW32RWLock(), reader_wait(), signal_readers(), and ~EvgW32RWLock().

Definition at line 32 of file evg_w32_rwlock.h.

Referenced by EvgW32RWLock(), signal_writers(), writer_wait(), and ~EvgW32RWLock().


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