public PushWaiter ( WaiterEntry newWaiterEntry ) : void | ||
newWaiterEntry | WaiterEntry | A waiter to put in the stack |
return | void |
public void PushWaiter(WaiterEntry newWaiterEntry)
{
// Remove the waiter if it is already in the stack and
// update waiter's count as needed
RemoveWaiter(newWaiterEntry, false);
// If the stack is empty then newWaiterEntry is the new head of the stack
if (null == _headWaiterEntry._nextWaiterEntry)
{
_headWaiterEntry._nextWaiterEntry = newWaiterEntry;
newWaiterEntry._prevWaiterEntry = _headWaiterEntry;
}
// If the stack is not empty then put newWaiterEntry as the new head
// of the stack.
else
{
// Save the old first waiter entry
WaiterEntry oldFirstWaiterEntry = _headWaiterEntry._nextWaiterEntry;
// Update the links
_headWaiterEntry._nextWaiterEntry = newWaiterEntry;
newWaiterEntry._nextWaiterEntry = oldFirstWaiterEntry;
newWaiterEntry._prevWaiterEntry = _headWaiterEntry;
oldFirstWaiterEntry._prevWaiterEntry = newWaiterEntry;
}
// Increment the number of waiters
++_waitersCount;
}
public void IdempotenceWaiterEntry() { WorkItemsQueue q = new WorkItemsQueue(); Assert.AreEqual(0, q.WaitersCount); WorkItemsQueue.WaiterEntry we1 = new WorkItemsQueue.WaiterEntry(); q.PushWaiter(we1); Assert.AreEqual(1, q.WaitersCount); q.PushWaiter(we1); Assert.AreEqual(1, q.WaitersCount); WorkItemsQueue.WaiterEntry we2 = new WorkItemsQueue.WaiterEntry(); q.PushWaiter(we2); Assert.AreEqual(2, q.WaitersCount); q.PushWaiter(we2); Assert.AreEqual(2, q.WaitersCount); }