private static IWorkItemWaiterEntry CreateNotSignalableWorkItemWaiterEntry()
        {
            IWorkItemWaiterEntry workItemWaiterEntry = Substitute.For <IWorkItemWaiterEntry>();

            workItemWaiterEntry.TrySignal(null).ReturnsForAnyArgs(false);
            return(workItemWaiterEntry);
        }
        public void EnqueueTrySignalMethodShouldBeCalledWhenWaitingStackIsNotEmpty()
        {
            IWorkItemWaiterEntry      workItemWaiterEntry      = Substitute.For <IWorkItemWaiterEntry>();
            IWorkItemWaiterEntryStack workItemWaiterEntryStack = Substitute.For <IWorkItemWaiterEntryStack>();

            int count = 1;

            workItemWaiterEntryStack.Count.Returns(x => count);
            workItemWaiterEntryStack.Pop().Returns(
                x =>
            {
                if (count == 1)
                {
                    count = 0;
                    return(workItemWaiterEntry);
                }

                return(null);
            });

            WorkItemQueue workItemQueue = new WorkItemQueue(1 * 1000, workItemWaiterEntryStack);

            IWorkItem workItem = Substitute.For <IWorkItem>();

            workItemQueue.Enqueue(workItem);

            workItemWaiterEntry.Received(1).TrySignal(workItem);
        }
        /// <summary>
        /// Ýþ parçasý bekleyici kaydý yýðýnýna bir tane kayýt ekler.
        /// </summary>
        /// <param name="workItemWaiterEntry">Ýþ parçasý bekleyici kaydý.</param>
        public void Push(IWorkItemWaiterEntry workItemWaiterEntry)
        {
            if (workItemWaiterEntry == null)
            {
                throw new ArgumentNullException("workItemWaiterEntry");
            }

            m_WorkItemWaiterEntries.AddFirst(workItemWaiterEntry);
        }
Пример #4
0
        /// <summary>
        /// Ýþ parçasý bekleyici kaydý yýðýnýna bir tane kayýt ekler.
        /// </summary>
        /// <param name="workItemWaiterEntry">Ýþ parçasý bekleyici kaydý.</param>
        public void Push(IWorkItemWaiterEntry workItemWaiterEntry)
        {
            if (workItemWaiterEntry == null)
            {
                throw new ArgumentNullException("workItemWaiterEntry");
            }

            m_WorkItemWaiterEntries.AddFirst(workItemWaiterEntry);
        }
Пример #5
0
        public void PeekShouldReturnTheOnlyItemAndShouldNotRemovwItemWhenStackHasOneItems()
        {
            WorkItemWaiterEntryStack stack = new WorkItemWaiterEntryStack();
            IWorkItemWaiterEntry     entry = Substitute.For <IWorkItemWaiterEntry>();

            stack.Push(entry);

            Assert.AreEqual(entry, stack.Peek());
            Assert.AreEqual(1, stack.Count);

            Assert.AreEqual(entry, stack.Peek());
            Assert.AreEqual(1, stack.Count);
        }
Пример #6
0
        /// <summary>
        /// Ýþ parçasý bekleyici kaydý yýðýnýnýn en üstteki kaydýný yýðýndan çýkarmadan döndürür.
        /// </summary>
        /// <returns>Yýðýnýn en üstündeki iþ parçasý bekleyici kaydý.</returns>
        public IWorkItemWaiterEntry Peek()
        {
            LinkedListNode <IWorkItemWaiterEntry> firstNode = m_WorkItemWaiterEntries.First;

            if (firstNode == null)
            {
                return(null);
            }

            IWorkItemWaiterEntry first = firstNode.Value;

            return(first);
        }
Пример #7
0
        public void PopShouldReturnTheOnlyItemAndSetCountToZeroWhenStackHasOneItems()
        {
            WorkItemWaiterEntryStack stack = new WorkItemWaiterEntryStack();
            IWorkItemWaiterEntry     entry = Substitute.For <IWorkItemWaiterEntry>();

            stack.Push(entry);

            Assert.AreEqual(entry, stack.Pop());
            Assert.AreEqual(0, stack.Count);

            Assert.AreEqual(null, stack.Pop());
            Assert.AreEqual(0, stack.Count);
        }
Пример #8
0
        public void RemoveShouldReturnFalseIfTheSpecifiedItemIsNotFoundInTheStack()
        {
            WorkItemWaiterEntryStack stack      = new WorkItemWaiterEntryStack();
            IWorkItemWaiterEntry     firstEntry = Substitute.For <IWorkItemWaiterEntry>();
            IWorkItemWaiterEntry     lastEntry  = Substitute.For <IWorkItemWaiterEntry>();

            Assert.AreEqual(false, stack.Remove(firstEntry));

            stack.Push(firstEntry);

            Assert.AreEqual(1, stack.Count);

            Assert.AreEqual(false, stack.Remove(lastEntry));
        }
        public void EnqueueTrySignalMethodShouldNotBeCalledWhenWaitingStackIsEmpty()
        {
            IWorkItemWaiterEntry      workItemWaiterEntry      = Substitute.For <IWorkItemWaiterEntry>();
            IWorkItemWaiterEntryStack workItemWaiterEntryStack = Substitute.For <IWorkItemWaiterEntryStack>();

            workItemWaiterEntryStack.Count.Returns(0);

            WorkItemQueue workItemQueue = new WorkItemQueue(1 * 1000, workItemWaiterEntryStack);

            IWorkItem workItem = Substitute.For <IWorkItem>();

            workItemQueue.Enqueue(workItem);

            workItemWaiterEntry.DidNotReceiveWithAnyArgs().TrySignal(workItem);
        }
Пример #10
0
        public void PushShouldAddTheItemToFirstPlace()
        {
            WorkItemWaiterEntryStack stack      = new WorkItemWaiterEntryStack();
            IWorkItemWaiterEntry     firstEntry = Substitute.For <IWorkItemWaiterEntry>();
            IWorkItemWaiterEntry     lastEntry  = Substitute.For <IWorkItemWaiterEntry>();

            stack.Push(firstEntry);

            Assert.AreEqual(1, stack.Count);
            Assert.AreEqual(firstEntry, stack.Peek());

            stack.Push(lastEntry);

            Assert.AreEqual(lastEntry, stack.Peek());
            Assert.AreEqual(2, stack.Count);
        }
Пример #11
0
        public void PeekShouldReturnLastAddedItemAndShouldNotRemoveItemWhenStackHasMoreThanOneItems()
        {
            WorkItemWaiterEntryStack stack      = new WorkItemWaiterEntryStack();
            IWorkItemWaiterEntry     firstEntry = Substitute.For <IWorkItemWaiterEntry>();
            IWorkItemWaiterEntry     lastEntry  = Substitute.For <IWorkItemWaiterEntry>();

            stack.Push(firstEntry);
            stack.Push(lastEntry);

            Assert.AreEqual(2, stack.Count);

            Assert.AreEqual(lastEntry, stack.Peek());
            Assert.AreEqual(2, stack.Count);

            Assert.AreEqual(lastEntry, stack.Peek());
            Assert.AreEqual(2, stack.Count);
        }
        public void EnqueueShouldNotAddWorkItemToQueueWhenWaiterIsSignaled()
        {
            IWorkItem workItem = Substitute.For <IWorkItem>();

            IWorkItemWaiterEntry workItemWaiterEntry = Substitute.For <IWorkItemWaiterEntry>();

            workItemWaiterEntry.TrySignal(workItem).Returns(true);

            IWorkItemWaiterEntryStack workItemWaiterEntryStack = Substitute.For <IWorkItemWaiterEntryStack>();

            workItemWaiterEntryStack.Count.Returns(1);
            workItemWaiterEntryStack.Pop().Returns(workItemWaiterEntry);

            WorkItemQueue workItemQueue = new WorkItemQueue(1 * 1000, workItemWaiterEntryStack);

            workItemQueue.Enqueue(workItem);

            Assert.AreEqual(0, workItemQueue.Count);
        }
Пример #13
0
        /// <summary>
        /// Ýþ parçasýný kuyruða atar.
        /// </summary>
        /// <param name="workItem">Ýþ parçasý.</param>
        public void Enqueue(IWorkItem workItem)
        {
            if (workItem == null)
            {
                throw new ArgumentNullException("workItem");
            }

            lock (this)
            {
                if (m_IsShutDown)
                {
                    throw new LaboThreadingException("Ýþ parçasý kuyruðu iþ parçasý eklemeye kapatýlmýþtýr. Yeni iþ parçasý ekleyemezsiniz.");
                }

                bool enqueue = true;

                // Eðer bekleyen Thread varsa iþ parçasýný ona yollayacaðýz.
                while (m_WorkItemWaiterEntryStack.Count > 0)
                {
                    // Dequeue a waiter.
                    IWorkItemWaiterEntry waiterEntry = m_WorkItemWaiterEntryStack.Pop();

                    // Eðer zaman aþýmý yoksa iþ parçasý bekleyen Thread'e iþlenmesi için yolluyoruz ve kuyruða eklememize gerek kalmýyor.
                    if (waiterEntry.TrySignal(workItem))
                    {
                        workItem.State = WorkItemState.Scheduled;

                        enqueue = false;
                        break;
                    }
                }

                // Hiç bekleyen Thread yoksa iþ parçasýný kuyruða ekliyoruz.
                if (enqueue)
                {
                    workItem.State = WorkItemState.Queued;

                    // Enqueue the work item
                    m_WorkItemsQueue.Enqueue(workItem);
                }
            }
        }
Пример #14
0
        public void PopShouldReturnLastAddedItemAndDecrementCountWhenStackHasMoreThanOneItems()
        {
            WorkItemWaiterEntryStack stack      = new WorkItemWaiterEntryStack();
            IWorkItemWaiterEntry     firstEntry = Substitute.For <IWorkItemWaiterEntry>();
            IWorkItemWaiterEntry     lastEntry  = Substitute.For <IWorkItemWaiterEntry>();

            stack.Push(firstEntry);
            stack.Push(lastEntry);

            Assert.AreEqual(2, stack.Count);

            Assert.AreEqual(lastEntry, stack.Pop());
            Assert.AreEqual(1, stack.Count);

            Assert.AreEqual(firstEntry, stack.Pop());
            Assert.AreEqual(0, stack.Count);

            Assert.AreEqual(null, stack.Pop());
            Assert.AreEqual(0, stack.Count);
        }
Пример #15
0
        public void RemoveShouldRemoveItemFromStack()
        {
            WorkItemWaiterEntryStack stack      = new WorkItemWaiterEntryStack();
            IWorkItemWaiterEntry     firstEntry = Substitute.For <IWorkItemWaiterEntry>();
            IWorkItemWaiterEntry     lastEntry  = Substitute.For <IWorkItemWaiterEntry>();

            stack.Push(firstEntry);
            stack.Push(lastEntry);

            Assert.AreEqual(2, stack.Count);

            Assert.AreEqual(lastEntry, stack.Peek());
            Assert.AreEqual(true, stack.Remove(lastEntry));
            Assert.AreEqual(firstEntry, stack.Peek());

            Assert.AreEqual(1, stack.Count);

            Assert.AreEqual(true, stack.Remove(firstEntry));
            Assert.AreEqual(0, stack.Count);
        }
Пример #16
0
 /// <summary>
 /// Ýþ parçasý bekleyici kaydý yýðýnýna bir tane kayýt çýkarýr.
 /// </summary>
 /// <param name="workItemWaiterEntry">Ýþ parçasý bekleyici kaydý.</param>
 /// <returns><c>true</c> eðer iþ parçasý bekleyici kaydý çýkarýldýysa, yoksa; <c>false</c></returns>
 public bool Remove(IWorkItemWaiterEntry workItemWaiterEntry)
 {
     return(m_WorkItemWaiterEntries.Remove(workItemWaiterEntry));
 }
 /// <summary>
 /// Ýþ parçasý bekleyici kaydý yýðýnýna bir tane kayýt çýkarýr.
 /// </summary>
 /// <param name="workItemWaiterEntry">Ýþ parçasý bekleyici kaydý.</param>
 /// <returns><c>true</c> eðer iþ parçasý bekleyici kaydý çýkarýldýysa, yoksa; <c>false</c></returns>
 public bool Remove(IWorkItemWaiterEntry workItemWaiterEntry)
 {
     return m_WorkItemWaiterEntries.Remove(workItemWaiterEntry);
 }