Merge pull request #2012 from CookiePLMonster/interlocked-lockcounts

Interlocked lockcounts
This commit is contained in:
PatrickvL 2020-10-28 11:20:11 +01:00 committed by GitHub
commit 44f0aee5d4
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
2 changed files with 8 additions and 12 deletions

View File

@ -148,8 +148,7 @@ XBSYSAPI EXPORTNUM(12) xbox::void_xt NTAPI xbox::ExAcquireReadWriteLockExclusive
LOG_FUNC_ONE_ARG(ReadWriteLock); LOG_FUNC_ONE_ARG(ReadWriteLock);
bool interrupt_mode = DisableInterrupts(); bool interrupt_mode = DisableInterrupts();
ReadWriteLock->LockCount++; if (InterlockedIncrement(reinterpret_cast<LONG*>(&ReadWriteLock->LockCount)) != 0) {
if (ReadWriteLock->LockCount != 0) {
ReadWriteLock->WritersWaitingCount++; ReadWriteLock->WritersWaitingCount++;
RestoreInterruptMode(interrupt_mode); RestoreInterruptMode(interrupt_mode);
KeWaitForSingleObject( KeWaitForSingleObject(
@ -180,8 +179,7 @@ XBSYSAPI EXPORTNUM(13) xbox::void_xt NTAPI xbox::ExAcquireReadWriteLockShared
bool must_wait_on_active_write = ReadWriteLock->ReadersEntryCount == 0; bool must_wait_on_active_write = ReadWriteLock->ReadersEntryCount == 0;
bool must_wait_on_queued_write = (ReadWriteLock->ReadersEntryCount != 0) && (ReadWriteLock->WritersWaitingCount != 0); bool must_wait_on_queued_write = (ReadWriteLock->ReadersEntryCount != 0) && (ReadWriteLock->WritersWaitingCount != 0);
bool must_wait = must_wait_on_active_write || must_wait_on_queued_write; bool must_wait = must_wait_on_active_write || must_wait_on_queued_write;
ReadWriteLock->LockCount++; if (InterlockedIncrement(reinterpret_cast<LONG*>(&ReadWriteLock->LockCount)) != 0 && must_wait) {
if ((ReadWriteLock->LockCount != 0) && must_wait) {
ReadWriteLock->ReadersWaitingCount++; ReadWriteLock->ReadersWaitingCount++;
RestoreInterruptMode(interrupt_mode); RestoreInterruptMode(interrupt_mode);
#if 0 //FIXME - Enable once KeReleaseSempahore is implemented (used in ExFreeReadWriteLock for Sharedlocks). #if 0 //FIXME - Enable once KeReleaseSempahore is implemented (used in ExFreeReadWriteLock for Sharedlocks).
@ -587,8 +585,7 @@ XBSYSAPI EXPORTNUM(28) xbox::void_xt NTAPI xbox::ExReleaseReadWriteLock
LOG_FUNC_ONE_ARG(ReadWriteLock); LOG_FUNC_ONE_ARG(ReadWriteLock);
bool interrupt_mode = DisableInterrupts(); bool interrupt_mode = DisableInterrupts();
ReadWriteLock->LockCount--; if (InterlockedDecrement(reinterpret_cast<LONG*>(&ReadWriteLock->LockCount)) == -1) {
if (ReadWriteLock->LockCount == -1) {
ReadWriteLock->ReadersEntryCount = 0; ReadWriteLock->ReadersEntryCount = 0;
RestoreInterruptMode(interrupt_mode); RestoreInterruptMode(interrupt_mode);
return; return;

View File

@ -684,8 +684,7 @@ XBSYSAPI EXPORTNUM(277) xbox::void_xt NTAPI xbox::RtlEnterCriticalSection
HANDLE thread = (HANDLE)KeGetCurrentThread(); HANDLE thread = (HANDLE)KeGetCurrentThread();
CriticalSection->LockCount++; if(InterlockedIncrement(reinterpret_cast<LONG*>(&CriticalSection->LockCount)) == 0) {
if(CriticalSection->LockCount == 0) {
CriticalSection->OwningThread = thread; CriticalSection->OwningThread = thread;
CriticalSection->RecursionCount = 1; CriticalSection->RecursionCount = 1;
} }
@ -1228,10 +1227,10 @@ XBSYSAPI EXPORTNUM(294) xbox::void_xt NTAPI xbox::RtlLeaveCriticalSection
LOG_FUNC_ONE_ARG(CriticalSection); LOG_FUNC_ONE_ARG(CriticalSection);
CriticalSection->RecursionCount--; CriticalSection->RecursionCount--;
CriticalSection->LockCount--; LONG count = InterlockedDecrement(reinterpret_cast<LONG*>(&CriticalSection->LockCount));
if(CriticalSection->RecursionCount == 0) { if(CriticalSection->RecursionCount == 0) {
CriticalSection->OwningThread = 0; CriticalSection->OwningThread = 0;
if(CriticalSection->LockCount >= 0) { if(count >= 0) {
KeSetEvent((PRKEVENT)CriticalSection, (KPRIORITY)1, (boolean_xt)0); KeSetEvent((PRKEVENT)CriticalSection, (KPRIORITY)1, (boolean_xt)0);
} }
} }
@ -1647,14 +1646,14 @@ XBSYSAPI EXPORTNUM(306) xbox::boolean_xt NTAPI xbox::RtlTryEnterCriticalSection
BOOLEAN ret = false; BOOLEAN ret = false;
HANDLE thread = (HANDLE)KeGetCurrentThread(); HANDLE thread = (HANDLE)KeGetCurrentThread();
if(InterlockedCompareExchange((::PLONG)(&CriticalSection->LockCount), 0, -1) == -1) { if(InterlockedCompareExchange(reinterpret_cast<LONG*>(&CriticalSection->LockCount), 0, -1) == -1) {
CriticalSection->OwningThread = thread; CriticalSection->OwningThread = thread;
CriticalSection->RecursionCount = 1; CriticalSection->RecursionCount = 1;
ret = true; ret = true;
} }
else { else {
if(CriticalSection->OwningThread == thread) { if(CriticalSection->OwningThread == thread) {
CriticalSection->LockCount++; InterlockedIncrement(reinterpret_cast<LONG*>(&CriticalSection->LockCount));
CriticalSection->RecursionCount++; CriticalSection->RecursionCount++;
ret = true; ret = true;
} }