11#include <helper/SRwLock.h>
18 virtual void LockShared(
void) = 0;
19 virtual void UnlockShared(
void) = 0;
20 virtual void LockExclusive(
void) = 0;
21 virtual void UnlockExclusive(
void) = 0;
25static bool native_rw_locks_supported =
false;
26static bool module_load_attempted =
false;
27static HMODULE library = NULL;
29typedef void (WINAPI* InitializeSRWLock)(PSRWLOCK);
31typedef void (WINAPI* AcquireSRWLockExclusive)(PSRWLOCK);
32typedef void (WINAPI* ReleaseSRWLockExclusive)(PSRWLOCK);
34typedef void (WINAPI* AcquireSRWLockShared)(PSRWLOCK);
35typedef void (WINAPI* ReleaseSRWLockShared)(PSRWLOCK);
37InitializeSRWLock initialize_srw_lock;
38AcquireSRWLockExclusive acquire_srw_lock_exclusive;
39AcquireSRWLockShared acquire_srw_lock_shared;
40ReleaseSRWLockShared release_srw_lock_shared;
41ReleaseSRWLockExclusive release_srw_lock_exclusive;
43static bool LoadModule() {
44 if (module_load_attempted) {
45 return native_rw_locks_supported;
47 module_load_attempted =
true;
49 library = LoadLibrary(TEXT(
"Kernel32.dll"));
55 (InitializeSRWLock)GetProcAddress(library,
"InitializeSRWLock");
57 acquire_srw_lock_exclusive =
58 (AcquireSRWLockExclusive)GetProcAddress(library,
59 "AcquireSRWLockExclusive");
60 release_srw_lock_exclusive =
61 (ReleaseSRWLockExclusive)GetProcAddress(library,
62 "ReleaseSRWLockExclusive");
63 acquire_srw_lock_shared =
64 (AcquireSRWLockShared)GetProcAddress(library,
"AcquireSRWLockShared");
65 release_srw_lock_shared =
66 (ReleaseSRWLockShared)GetProcAddress(library,
"ReleaseSRWLockShared");
68 if (initialize_srw_lock && acquire_srw_lock_exclusive &&
69 release_srw_lock_exclusive && acquire_srw_lock_shared &&
70 release_srw_lock_shared) {
71 native_rw_locks_supported =
true;
73 return native_rw_locks_supported;
76class SRwLockWinXP :
public IRwLock
82 InitializeCriticalSection(&m_csWriter);
83 InitializeCriticalSection(&m_csReader);
84 m_evtReaders = CreateEvent(NULL, TRUE, TRUE, NULL);
90 WaitForSingleObject(m_evtReaders, INFINITE);
91 CloseHandle(m_evtReaders);
92 DeleteCriticalSection(&m_csWriter);
93 DeleteCriticalSection(&m_csReader);
96 void LockShared(
void)
override
98 EnterCriticalSection(&m_csWriter);
99 EnterCriticalSection(&m_csReader);
100 if (++m_nReaders == 1)
102 ::ResetEvent(m_evtReaders);
104 LeaveCriticalSection(&m_csReader);
105 LeaveCriticalSection(&m_csWriter);
108 void UnlockShared(
void)
override
110 EnterCriticalSection(&m_csReader);
111 if (--m_nReaders == 0)
113 ::SetEvent(m_evtReaders);
115 LeaveCriticalSection(&m_csReader);
118 void LockExclusive(
void)
override
120 EnterCriticalSection(&m_csWriter);
121 WaitForSingleObject(m_evtReaders, INFINITE);
124 void UnlockExclusive(
void)
override
126 LeaveCriticalSection(&m_csWriter);
130 CRITICAL_SECTION m_csWriter;
131 CRITICAL_SECTION m_csReader;
136class SRwLockWin7 :
public IRwLock {
140 initialize_srw_lock(&m_rwlock);
143 void LockExclusive()
override{
144 acquire_srw_lock_exclusive(&m_rwlock);
147 void UnlockExclusive()
override {
148 release_srw_lock_exclusive(&m_rwlock);
151 void LockShared()
override {
152 acquire_srw_lock_shared(&m_rwlock);
155 void UnlockShared()
override {
156 release_srw_lock_shared(&m_rwlock);
161class SRwLockPosix :
public IRwLock {
165 InitializeSRWLock(&m_rwlock);
168 UninitializeSRWLock(&m_rwlock);
171 void LockExclusive()
override {
172 AcquireSRWLockExclusive(&m_rwlock);
175 void UnlockExclusive()
override {
176 ReleaseSRWLockExclusive(&m_rwlock);
179 void LockShared()
override {
180 AcquireSRWLockShared(&m_rwlock);
183 void UnlockShared()
override {
184 ReleaseSRWLockShared(&m_rwlock);
193 impl =
new SRwLockWin7();
197 impl =
new SRwLockWinXP();
200 impl =
new SRwLockPosix;
210 impl->LockExclusive();
215 impl->UnlockExclusive();
225 impl->UnlockShared();
~SRwLock()
Destructor. Destroys the read-write lock.
SRwLock()
Constructor. Initializes a new read-write lock.
void LockShared()
Acquires a shared lock.
void UnlockExclusive()
Releases an exclusive lock.
void UnlockShared()
Releases a shared lock.
void LockExclusive()
Acquires an exclusive lock.