[NTOSKRNL]

- Assert against waiting at DISPATCH_LEVEL

svn path=/trunk/; revision=56747
This commit is contained in:
Thomas Faber 2012-06-19 08:24:32 +00:00
parent 8479f39975
commit e3eb92dddf

View file

@ -126,14 +126,14 @@ KiAcquireGuardedMutex(IN OUT PKGUARDED_MUTEX GuardedMutex)
/* We depend on these bits being just right */ /* We depend on these bits being just right */
C_ASSERT((GM_LOCK_WAITER_WOKEN * 2) == GM_LOCK_WAITER_INC); C_ASSERT((GM_LOCK_WAITER_WOKEN * 2) == GM_LOCK_WAITER_INC);
/* Increase the contention count */ /* Increase the contention count */
GuardedMutex->Contention++; GuardedMutex->Contention++;
/* Start by unlocking the Guarded Mutex */ /* Start by unlocking the Guarded Mutex */
BitsToRemove = GM_LOCK_BIT; BitsToRemove = GM_LOCK_BIT;
BitsToAdd = GM_LOCK_WAITER_INC; BitsToAdd = GM_LOCK_WAITER_INC;
/* Start change loop */ /* Start change loop */
for (;;) for (;;)
{ {
@ -142,10 +142,10 @@ KiAcquireGuardedMutex(IN OUT PKGUARDED_MUTEX GuardedMutex)
(BitsToRemove == (GM_LOCK_BIT | GM_LOCK_WAITER_WOKEN))); (BitsToRemove == (GM_LOCK_BIT | GM_LOCK_WAITER_WOKEN)));
ASSERT((BitsToAdd == GM_LOCK_WAITER_INC) || ASSERT((BitsToAdd == GM_LOCK_WAITER_INC) ||
(BitsToAdd == GM_LOCK_WAITER_WOKEN)); (BitsToAdd == GM_LOCK_WAITER_WOKEN));
/* Get the Count Bits */ /* Get the Count Bits */
OldValue = GuardedMutex->Count; OldValue = GuardedMutex->Count;
/* Start internal bit change loop */ /* Start internal bit change loop */
for (;;) for (;;)
{ {
@ -155,7 +155,7 @@ KiAcquireGuardedMutex(IN OUT PKGUARDED_MUTEX GuardedMutex)
/* Sanity check */ /* Sanity check */
ASSERT((BitsToRemove == GM_LOCK_BIT) || ASSERT((BitsToRemove == GM_LOCK_BIT) ||
((OldValue & GM_LOCK_WAITER_WOKEN) != 0)); ((OldValue & GM_LOCK_WAITER_WOKEN) != 0));
/* Unlock it by removing the Lock Bit */ /* Unlock it by removing the Lock Bit */
NewValue = OldValue ^ BitsToRemove; NewValue = OldValue ^ BitsToRemove;
NewValue = InterlockedCompareExchange(&GuardedMutex->Count, NewValue = InterlockedCompareExchange(&GuardedMutex->Count,
@ -172,15 +172,15 @@ KiAcquireGuardedMutex(IN OUT PKGUARDED_MUTEX GuardedMutex)
OldValue); OldValue);
if (NewValue == OldValue) break; if (NewValue == OldValue) break;
} }
/* Old value changed, loop again */ /* Old value changed, loop again */
OldValue = NewValue; OldValue = NewValue;
} }
/* Now we have to wait for it */ /* Now we have to wait for it */
KeWaitForGate(&GuardedMutex->Gate, WrGuardedMutex, KernelMode); KeWaitForGate(&GuardedMutex->Gate, WrGuardedMutex, KernelMode);
ASSERT((GuardedMutex->Count & GM_LOCK_WAITER_WOKEN) != 0); ASSERT((GuardedMutex->Count & GM_LOCK_WAITER_WOKEN) != 0);
/* Ok, the wait is done, so set the new bits */ /* Ok, the wait is done, so set the new bits */
BitsToRemove = GM_LOCK_BIT | GM_LOCK_WAITER_WOKEN; BitsToRemove = GM_LOCK_BIT | GM_LOCK_WAITER_WOKEN;
BitsToAdd = GM_LOCK_WAITER_WOKEN; BitsToAdd = GM_LOCK_WAITER_WOKEN;
@ -417,6 +417,10 @@ KeWaitForSingleObject(IN PVOID Object,
PLARGE_INTEGER OriginalDueTime = Timeout; PLARGE_INTEGER OriginalDueTime = Timeout;
ULONG Hand = 0; ULONG Hand = 0;
ASSERT(KeGetCurrentIrql() < DISPATCH_LEVEL ||
(KeGetCurrentIrql() == DISPATCH_LEVEL &&
Timeout && Timeout->QuadPart == 0));
/* Check if the lock is already held */ /* Check if the lock is already held */
if (!Thread->WaitNext) goto WaitStart; if (!Thread->WaitNext) goto WaitStart;
@ -583,6 +587,10 @@ KeWaitForMultipleObjects(IN ULONG Count,
LARGE_INTEGER DueTime = {{0}}, NewDueTime, InterruptTime; LARGE_INTEGER DueTime = {{0}}, NewDueTime, InterruptTime;
ULONG Index, Hand = 0; ULONG Index, Hand = 0;
ASSERT(KeGetCurrentIrql() < DISPATCH_LEVEL ||
(KeGetCurrentIrql() == DISPATCH_LEVEL &&
Timeout && Timeout->QuadPart == 0));
/* Make sure the Wait Count is valid */ /* Make sure the Wait Count is valid */
if (!WaitBlockArray) if (!WaitBlockArray)
{ {