#include <evg_w32_rwlock.h>
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 |
Definition at line 26 of file evg_w32_rwlock.h.
| 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 }
| void EvgW32RWLock::yield | ( | ) | [inline, private] |
| 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] |
| 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 }
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] |
volatile long EvgW32RWLock::waiting_writers [private] |
HANDLE EvgW32RWLock::readers_iocport [private] |
Definition at line 31 of file evg_w32_rwlock.h.
Referenced by EvgW32RWLock(), reader_wait(), signal_readers(), and ~EvgW32RWLock().
HANDLE EvgW32RWLock::writers_iocport [private] |
Definition at line 32 of file evg_w32_rwlock.h.
Referenced by EvgW32RWLock(), signal_writers(), writer_wait(), and ~EvgW32RWLock().
1.5.5