Merge pull request #2012 from CookiePLMonster/interlocked-lockcounts
Interlocked lockcounts
This commit is contained in:
commit
44f0aee5d4
|
@ -148,8 +148,7 @@ XBSYSAPI EXPORTNUM(12) xbox::void_xt NTAPI xbox::ExAcquireReadWriteLockExclusive
|
|||
LOG_FUNC_ONE_ARG(ReadWriteLock);
|
||||
|
||||
bool interrupt_mode = DisableInterrupts();
|
||||
ReadWriteLock->LockCount++;
|
||||
if (ReadWriteLock->LockCount != 0) {
|
||||
if (InterlockedIncrement(reinterpret_cast<LONG*>(&ReadWriteLock->LockCount)) != 0) {
|
||||
ReadWriteLock->WritersWaitingCount++;
|
||||
RestoreInterruptMode(interrupt_mode);
|
||||
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_queued_write = (ReadWriteLock->ReadersEntryCount != 0) && (ReadWriteLock->WritersWaitingCount != 0);
|
||||
bool must_wait = must_wait_on_active_write || must_wait_on_queued_write;
|
||||
ReadWriteLock->LockCount++;
|
||||
if ((ReadWriteLock->LockCount != 0) && must_wait) {
|
||||
if (InterlockedIncrement(reinterpret_cast<LONG*>(&ReadWriteLock->LockCount)) != 0 && must_wait) {
|
||||
ReadWriteLock->ReadersWaitingCount++;
|
||||
RestoreInterruptMode(interrupt_mode);
|
||||
#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);
|
||||
|
||||
bool interrupt_mode = DisableInterrupts();
|
||||
ReadWriteLock->LockCount--;
|
||||
if (ReadWriteLock->LockCount == -1) {
|
||||
if (InterlockedDecrement(reinterpret_cast<LONG*>(&ReadWriteLock->LockCount)) == -1) {
|
||||
ReadWriteLock->ReadersEntryCount = 0;
|
||||
RestoreInterruptMode(interrupt_mode);
|
||||
return;
|
||||
|
|
|
@ -684,8 +684,7 @@ XBSYSAPI EXPORTNUM(277) xbox::void_xt NTAPI xbox::RtlEnterCriticalSection
|
|||
|
||||
HANDLE thread = (HANDLE)KeGetCurrentThread();
|
||||
|
||||
CriticalSection->LockCount++;
|
||||
if(CriticalSection->LockCount == 0) {
|
||||
if(InterlockedIncrement(reinterpret_cast<LONG*>(&CriticalSection->LockCount)) == 0) {
|
||||
CriticalSection->OwningThread = thread;
|
||||
CriticalSection->RecursionCount = 1;
|
||||
}
|
||||
|
@ -1228,10 +1227,10 @@ XBSYSAPI EXPORTNUM(294) xbox::void_xt NTAPI xbox::RtlLeaveCriticalSection
|
|||
LOG_FUNC_ONE_ARG(CriticalSection);
|
||||
|
||||
CriticalSection->RecursionCount--;
|
||||
CriticalSection->LockCount--;
|
||||
LONG count = InterlockedDecrement(reinterpret_cast<LONG*>(&CriticalSection->LockCount));
|
||||
if(CriticalSection->RecursionCount == 0) {
|
||||
CriticalSection->OwningThread = 0;
|
||||
if(CriticalSection->LockCount >= 0) {
|
||||
if(count >= 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;
|
||||
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->RecursionCount = 1;
|
||||
ret = true;
|
||||
}
|
||||
else {
|
||||
if(CriticalSection->OwningThread == thread) {
|
||||
CriticalSection->LockCount++;
|
||||
InterlockedIncrement(reinterpret_cast<LONG*>(&CriticalSection->LockCount));
|
||||
CriticalSection->RecursionCount++;
|
||||
ret = true;
|
||||
}
|
||||
|
|
Loading…
Reference in New Issue