39 HANDLE rdgreen, wrgreen;
40 CRITICAL_SECTION rwcs;
51 data->wrpriority =
true;
52 data->rdcount = data->rdwaiting = data->wrcount = data->wrwaiting = 0;
53 InitializeCriticalSection(&(data->rwcs));
54 data->rdgreen = CreateEvent(
nullptr, FALSE,
TRUE,
nullptr);
55 data->wrgreen = CreateEvent(
nullptr, FALSE,
TRUE,
nullptr);
57 pthread_rwlock_init(&(data->rwlock),
nullptr);
65 CloseHandle(data->rdgreen);
66 CloseHandle(data->wrgreen);
67 DeleteCriticalSection(&(data->rwcs));
69 pthread_rwlock_destroy(&(data->rwlock));
80 EnterCriticalSection(&(data->rwcs));
87 if (!data->wrcount && (!data->wrpriority || !data->wrwaiting))
100 data->rdwaiting += 1;
104 ResetEvent(data->rdgreen);
107 LeaveCriticalSection(&(data->rwcs));
111 WaitForSingleObject(data->rdgreen, INFINITE);
116 pthread_rwlock_rdlock(&(data->rwlock));
124 EnterCriticalSection(&(data->rwcs));
128 if (data->wrpriority)
131 SetEvent(data->wrgreen);
132 else if(data->rdwaiting)
133 SetEvent(data->rdgreen);
138 SetEvent(data->rdgreen);
139 else if(data->wrwaiting)
140 SetEvent(data->wrgreen);
142 LeaveCriticalSection(&(data->rwcs));
144 pthread_rwlock_unlock(&(data->rwlock));
155 EnterCriticalSection(&(data->rwcs));
162 if (!data->rdcount && !data->wrcount && (data->wrpriority || !data->rdwaiting))
166 data->wrwaiting -= 1;
175 data->wrwaiting += 1;
179 ResetEvent(data->wrgreen);
182 LeaveCriticalSection(&(data->rwcs));
186 WaitForSingleObject(data->wrgreen, INFINITE);
190 pthread_rwlock_wrlock(&(data->rwlock));
198 EnterCriticalSection(&(data->rwcs));
200 if (data->wrpriority)
203 SetEvent(data->wrgreen);
204 else if (data->rdwaiting)
205 SetEvent(data->rdgreen);
210 SetEvent(data->rdgreen);
211 else if (data->wrwaiting)
212 SetEvent(data->wrgreen);
214 LeaveCriticalSection(&(data->rwcs));
216 pthread_rwlock_unlock(&(data->rwlock));
void WriteUnlock()
Releases write token.
void WaitWriteLock()
Requests authorization to write.
void WaitReadLock()
Requests authorization to read.
void ReadUnlock()
Releases read token.