#include <rwlock_iocompl.h>
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 |
Definition at line 13 of file rwlock_iocompl.h.
| 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 }
| static const char* NonblockingRWLockIOCompl::name | ( | ) | [inline, static] |
| 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 }
int NonblockingRWLockIOCompl::readers [private] |
Definition at line 106 of file rwlock_iocompl.h.
Referenced by enter_read(), enter_write(), and leave_read().
int NonblockingRWLockIOCompl::writers [private] |
Definition at line 107 of file rwlock_iocompl.h.
Referenced by enter_read(), enter_write(), and leave_write().
int NonblockingRWLockIOCompl::lock_tokens [private] |
Definition at line 108 of file rwlock_iocompl.h.
Referenced by release_writer_lock(), and take_writer_lock().
HANDLE NonblockingRWLockIOCompl::writers_iocport [private] |
Definition at line 109 of file rwlock_iocompl.h.
Referenced by NonblockingRWLockIOCompl(), release_writer_lock(), take_writer_lock(), and ~NonblockingRWLockIOCompl().
1.5.5