Refactor ExReleaseReadWriteLock.
This commit is contained in:
parent
b72be80b88
commit
49e68a1ecc
|
@ -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);
|
||||||
}
|
}
|
||||||
|
|
||||||
// ******************************************************************
|
// ******************************************************************
|
||||||
|
|
Loading…
Reference in New Issue