Refactor ExReleaseReadWriteLock.

This commit is contained in:
Fisherman166 2020-05-28 09:10:51 -07:00
parent b72be80b88
commit 49e68a1ecc
1 changed files with 23 additions and 27 deletions

View File

@ -592,37 +592,33 @@ XBSYSAPI EXPORTNUM(28) xboxkrnl::VOID NTAPI xboxkrnl::ExReleaseReadWriteLock
bool interrupt_mode = DisableInterrupts(); bool interrupt_mode = DisableInterrupts();
ReadWriteLock->LockCount--; ReadWriteLock->LockCount--;
if (ReadWriteLock->LockCount >= 0) { if (ReadWriteLock->LockCount == -1) {
if(ReadWriteLock->ReadersEntryCount == 0) { ReadWriteLock->ReadersEntryCount = 0;
if(ReadWriteLock->ReadersWaitingCount == 0) { RestoreInterruptMode(interrupt_mode);
ReadWriteLock->WritersWaitingCount--; return;
RestoreInterruptMode(interrupt_mode); }
KeSetEvent(&ReadWriteLock->WriterEvent, 1, 0);
} if (ReadWriteLock->ReadersEntryCount == 0) {
else { if (ReadWriteLock->ReadersWaitingCount != 0) {
ULONG temp_readers_waiting = ReadWriteLock->ReadersWaitingCount; ULONG temp_readers_waiting = ReadWriteLock->ReadersWaitingCount;
ReadWriteLock->ReadersEntryCount = ReadWriteLock->ReadersWaitingCount; ReadWriteLock->ReadersEntryCount = ReadWriteLock->ReadersWaitingCount;
ReadWriteLock->ReadersWaitingCount = 0; ReadWriteLock->ReadersWaitingCount = 0;
RestoreInterruptMode(interrupt_mode); RestoreInterruptMode(interrupt_mode);
KeReleaseSemaphore(&ReadWriteLock->ReaderSemaphore, 1, (BOOLEAN)temp_readers_waiting, 0); KeReleaseSemaphore(&ReadWriteLock->ReaderSemaphore, 1, (BOOLEAN)temp_readers_waiting, 0);
} return;
}
else {
ReadWriteLock->ReadersEntryCount--;
if(ReadWriteLock->ReadersEntryCount == 0) {
ReadWriteLock->WritersWaitingCount--;
RestoreInterruptMode(interrupt_mode);
KeSetEvent(&ReadWriteLock->WriterEvent, 1, 0);
}
else {
RestoreInterruptMode(interrupt_mode);
}
} }
} }
else { else {
ReadWriteLock->ReadersEntryCount = 0; ReadWriteLock->ReadersEntryCount--;
RestoreInterruptMode(interrupt_mode); if (ReadWriteLock->ReadersEntryCount != 0) {
RestoreInterruptMode(interrupt_mode);
return;
}
} }
ReadWriteLock->WritersWaitingCount--;
RestoreInterruptMode(interrupt_mode);
KeSetEvent(&ReadWriteLock->WriterEvent, 1, 0);
} }
// ****************************************************************** // ******************************************************************