mirror of
https://github.com/reactos/reactos.git
synced 2025-06-10 12:24:48 +00:00
[NTOSKRNL]
- Assert against waiting at DISPATCH_LEVEL svn path=/trunk/; revision=56747
This commit is contained in:
parent
8479f39975
commit
e3eb92dddf
1 changed files with 17 additions and 9 deletions
|
@ -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)
|
||||||
{
|
{
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue