Amib.Threading.Internal.WorkItemsQueue.PushWaiter C# (CSharp) Метод

PushWaiter() публичный Метод

Push a new waiter into the waiter's stack
public PushWaiter ( WaiterEntry newWaiterEntry ) : void
newWaiterEntry WaiterEntry A waiter to put in the stack
Результат 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;
        }

Usage Example

        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);
        }