NonblockingRWLockIOCompl Class Reference

#include <rwlock_iocompl.h>

List of all members.

Public Member Functions

void take_writer_lock (void)
void release_writer_lock (void)
 NonblockingRWLockIOCompl ()
virtual ~NonblockingRWLockIOCompl ()
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 Attributes

int readers
int writers
int lock_tokens
HANDLE writers_iocport


Detailed Description

Definition at line 13 of file rwlock_iocompl.h.


Constructor & Destructor Documentation

NonblockingRWLockIOCompl::NonblockingRWLockIOCompl (  )  [inline]

Definition at line 46 of file rwlock_iocompl.h.

References release_writer_lock(), and writers_iocport.

00046                                    : readers(0L), writers(0L), lock_tokens(0)
00047         {
00048                  writers_iocport = CreateIoCompletionPort(
00049                          INVALID_HANDLE_VALUE, 
00050                          NULL,
00051                          NULL,
00052                          0);
00053                  release_writer_lock();
00054         }

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

Definition at line 56 of file rwlock_iocompl.h.

References writers_iocport.

00057         {
00058                 CloseHandle(writers_iocport);
00059     }


Member Function Documentation

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

Definition at line 16 of file rwlock_iocompl.h.

00016 { return "NonblockingRWLockIOCompl"; }

void NonblockingRWLockIOCompl::take_writer_lock ( void   )  [inline]

Definition at line 18 of file rwlock_iocompl.h.

References atomic_dec(), lock_tokens, thread_yield(), and writers_iocport.

Referenced by enter_read(), and enter_write().

00019         {
00020                 DWORD ln;
00021                 ULONG_PTR key;
00022                 LPOVERLAPPED ovlp;
00023                 // cout << "NonblockingRWLockIOCompl taking writer lock " << writers_iocport << "\n";
00024                 while(!GetQueuedCompletionStatus(
00025                         writers_iocport,
00026                         &ln,
00027                         &key,
00028                         &ovlp,
00029                         200)) 
00030                 {
00031                         thread_yield();
00032                 }
00033                 atomic_dec(&lock_tokens);
00034                 // cout << "NonblockingRWLockIOCompl writer lock " << writers_iocport << " taken\n";
00035         }

void NonblockingRWLockIOCompl::release_writer_lock ( void   )  [inline]

Definition at line 37 of file rwlock_iocompl.h.

References atomic_inc(), lock_tokens, and writers_iocport.

Referenced by enter_read(), leave_write(), and NonblockingRWLockIOCompl().

00038         {
00039                 assert(PostQueuedCompletionStatus(
00040                                 writers_iocport,
00041                                 0,
00042                                 NULL,
00043                                 NULL)!=0);
00044                 atomic_inc(&lock_tokens);
00045         }

void NonblockingRWLockIOCompl::enter_read ( void   )  [inline]

Definition at line 63 of file rwlock_iocompl.h.

References atomic_dec(), atomic_inc(), readers, release_writer_lock(), take_writer_lock(), and writers.

00064         {
00065                 atomic_inc(&readers);
00066                 while(writers)
00067                 {
00068                         atomic_dec(&readers);
00069                         take_writer_lock();
00070                         atomic_inc(&readers);
00071                         release_writer_lock();
00072                 }
00073         }

void NonblockingRWLockIOCompl::leave_read ( void   )  [inline]

Definition at line 78 of file rwlock_iocompl.h.

References atomic_dec(), and readers.

00079         {
00080                 atomic_dec(&readers);
00081         }

void NonblockingRWLockIOCompl::enter_write ( void   )  [inline]

Definition at line 86 of file rwlock_iocompl.h.

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

00087         {
00088                 take_writer_lock();
00089                 atomic_inc(&writers);
00090                 while(readers > 0L) 
00091                 {
00092                         yield();
00093                 }
00094         }

void NonblockingRWLockIOCompl::leave_write ( void   )  [inline]

Definition at line 99 of file rwlock_iocompl.h.

References atomic_dec(), release_writer_lock(), and writers.

00100         {
00101                 atomic_dec(&writers);
00102                 release_writer_lock();
00103         }


Member Data Documentation

Definition at line 106 of file rwlock_iocompl.h.

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

Definition at line 107 of file rwlock_iocompl.h.

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

Definition at line 108 of file rwlock_iocompl.h.

Referenced by release_writer_lock(), and take_writer_lock().


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