ExfWakePushLock(PushLock, OldValue);
break;
}
-
+
/* Get the wait block */
WaitBlock = (PEX_PUSH_LOCK_WAIT_BLOCK)(OldValue.Value &
~EX_PUSH_LOCK_PTR_BITS);
-
+
/* Loop the blocks */
FirstWaitBlock = WaitBlock;
while (TRUE)
FirstWaitBlock->Last = LastWaitBlock;
break;
}
-
+
/* Save the block */
PreviousWaitBlock = WaitBlock;
-
+
/* Get the next block */
WaitBlock = WaitBlock->Next;
-
+
/* Save the previous */
WaitBlock->Previous = PreviousWaitBlock;
}
-
+
/* Remove the wake bit */
NewValue.Value = OldValue.Value &~ EX_PUSH_LOCK_WAKING;
-
+
/* Sanity checks */
ASSERT(NewValue.Locked);
ASSERT(!NewValue.Waking);
-
+
/* Update the value */
NewValue.Ptr = InterlockedCompareExchangePointer(&PushLock->Ptr,
NewValue.Ptr,
OldValue.Ptr);
-
+
/* If we updated correctly, leave */
if (NewValue.Value == OldValue.Value) break;
-
+
/* Update value */
OldValue = NewValue;
}
{
EX_PUSH_LOCK OldValue = *PushLock, NewValue, TempValue;
BOOLEAN NeedWake;
- DEFINE_WAIT_BLOCK(WaitBlock);
+ EX_PUSH_LOCK_WAIT_BLOCK Block;
+ PEX_PUSH_LOCK_WAIT_BLOCK WaitBlock = &Block;
/* Start main loop */
for (;;)
EX_PUSH_LOCK_LOCK |
EX_PUSH_LOCK_WAKING |
EX_PUSH_LOCK_WAITING |
- PtrToUlong(WaitBlock);
+ (ULONG_PTR)WaitBlock;
/* Check if the pushlock was already waking */
if (!OldValue.Waking) NeedWake = TRUE;
NewValue.Value = EX_PUSH_LOCK_MULTIPLE_SHARED |
EX_PUSH_LOCK_LOCK |
EX_PUSH_LOCK_WAITING |
- PtrToUlong(WaitBlock);
+ (ULONG_PTR)WaitBlock;
}
else
{
/* Point to our wait block */
NewValue.Value = EX_PUSH_LOCK_LOCK |
EX_PUSH_LOCK_WAITING |
- PtrToUlong(WaitBlock);
+ (ULONG_PTR)WaitBlock;
}
}
{
EX_PUSH_LOCK OldValue = *PushLock, NewValue;
BOOLEAN NeedWake;
- DEFINE_WAIT_BLOCK(WaitBlock);
+ EX_PUSH_LOCK_WAIT_BLOCK Block;
+ PEX_PUSH_LOCK_WAIT_BLOCK WaitBlock = &Block;
/* Start main loop */
for (;;)
EX_PUSH_LOCK_LOCK)) |
EX_PUSH_LOCK_WAKING |
EX_PUSH_LOCK_WAITING |
- PtrToUlong(WaitBlock);
+ (ULONG_PTR)WaitBlock;
/* Check if the pushlock was already waking */
if (!OldValue.Waking) NeedWake = TRUE;
/* Point to our wait block */
NewValue.Value = (OldValue.Value & EX_PUSH_LOCK_PTR_BITS) |
EX_PUSH_LOCK_WAITING |
- PtrToUlong(WaitBlock);
+ (ULONG_PTR)WaitBlock;
}
/* Sanity check */
/* Sanity check */
ASSERT(OldValue.Locked);
-
+
/* Start main loop */
while (TRUE)
{
/* Get the wait block */
WaitBlock = (PEX_PUSH_LOCK_WAIT_BLOCK)(OldValue.Value &
~EX_PUSH_LOCK_PTR_BITS);
-
+
/* Loop until we find the last wait block */
while (TRUE)
{
/* Get the last wait block */
LastWaitBlock = WaitBlock->Last;
-
+
/* Did it exist? */
if (LastWaitBlock)
{
WaitBlock = LastWaitBlock;
break;
}
-
+
/* Keep searching */
WaitBlock = WaitBlock->Next;
}
-
+
/* Make sure the Share Count is above 0 */
if (WaitBlock->ShareCount > 0)
{
/* This shouldn't be an exclusive wait block */
ASSERT(WaitBlock->Flags & EX_PUSH_LOCK_FLAGS_EXCLUSIVE);
-
+
/* Do the decrease and check if the lock isn't shared anymore */
if (InterlockedDecrement(&WaitBlock->ShareCount) > 0) return;
}
}
-
+
/*
* If nobody was waiting on the block, then we possibly reduced the number
* of times the pushlock was shared, and we unlocked it.
NewValue.Value = OldValue.Value;
NewValue.MultipleShared = FALSE;
NewValue.Locked = FALSE;
-
+
/* Sanity check */
ASSERT(NewValue.Waking && !NewValue.Locked && !NewValue.MultipleShared);
-
+
/* Write the new value */
NewValue.Ptr = InterlockedCompareExchangePointer(&PushLock->Ptr,
NewValue.Ptr,
NewValue.Value = OldValue.Value;
NewValue.MultipleShared = FALSE;
NewValue.Locked = FALSE;
-
+
/* It's not already waking, so add the wake bit */
NewValue.Waking = TRUE;
-
+
/* Sanity check */
ASSERT(NewValue.Waking && !NewValue.Locked && !NewValue.MultipleShared);
-
+
/* Write the new value */
WakeValue = NewValue;
NewValue.Ptr = InterlockedCompareExchangePointer(&PushLock->Ptr,
NewValue.Ptr,
OldValue.Ptr);
if (NewValue.Value != OldValue.Value) continue;
-
+
/* The write was successful. The pushlock is Unlocked and Waking */
ExfWakePushLock(PushLock, WakeValue);
return;
/* Get the wait block */
WaitBlock = (PEX_PUSH_LOCK_WAIT_BLOCK)(OldValue.Value &
~EX_PUSH_LOCK_PTR_BITS);
-
+
/* Loop until we find the last wait block */
while (TRUE)
{
/* Get the last wait block */
LastWaitBlock = WaitBlock->Last;
-
+
/* Did it exist? */
if (LastWaitBlock)
{
WaitBlock = LastWaitBlock;
break;
}
-
+
/* Keep searching */
WaitBlock = WaitBlock->Next;
}
NewValue.Value = OldValue.Value &~ EX_PUSH_LOCK_LOCK;
/* Sanity check */
- ASSERT(NewValue.Waking && !NewValue.Waiting);
+ ASSERT(NewValue.Waking || !NewValue.Waiting);
/* Write the New Value */
NewValue.Ptr = InterlockedCompareExchangePointer(&PushLock->Ptr,
* and locked, don't do anything
*/
if ((OldValue.Waking) || (OldValue.Locked) || !(OldValue.Waiting)) return;
-
+
/* Make it Waking */
NewValue = OldValue;
NewValue.Waking = TRUE;
-
+
/* Write the New Value */
if (InterlockedCompareExchangePointer(&PushLock->Ptr,
NewValue.Ptr,