Пример #1
0
        public void DelayQueuePeekNothingTest()
        {
            DelayQueue target = new DelayQueue();

            Assert.IsNull(target.poll());
            Assert.IsNull(target.peek());
        }
 public void CreateQueue()
 {
     _queue           = new DelayQueue <DummyMessage>(new ParallelOperations());
     _queue.Dequeued += OnQueueDequeued;
     _queue.Start(Delay);
     _stopwatch.Start();
 }
Пример #3
0
        public void DelayQueuePutSome()
        {
            DelayQueue target = new DelayQueue();

            TestNow = new DateTime(2000, 1, 1);
            TimeSpan delta = new TimeSpan(1, 0, 0, 0);

            target.put(new DelayItem(TestNow + delta));
            Assert.AreEqual(1, target.Count);
            target.put(new DelayItem(TestNow + delta + delta));
            Assert.AreEqual(2, target.Count);
        }
Пример #4
0
        public void DelayQueuePollNotReady()
        {
            DelayQueue target = new DelayQueue();

            TestNow = new DateTime(2000, 1, 1);
            TimeSpan  delta = new TimeSpan(1, 0, 0, 0);
            DelayItem item1 = new DelayItem(TestNow + delta);
            DelayItem item2 = new DelayItem(TestNow + delta + delta);

            target.put(item1);
            target.put(item2);
            Assert.IsNull(target.poll());
            Assert.AreEqual(2, target.Count);
        }
Пример #5
0
        public void DelayQueueTakeInOrder()
        {
            List <DelayItem> takenItems            = new List <DelayItem>();
            SortedList <DateTime, DelayItem> items = new SortedList <DateTime, DelayItem>();

            DelayQueue target = new DelayQueue();

            TestNow = new DateTime(2000, 1, 1);
            List <int> offsets = new List <int>();

            offsets.Add(8);
            offsets.Add(6);
            offsets.Add(7);
            offsets.Add(5);

            foreach (int i in offsets)
            {
                DateTime  dt   = TestNow + new TimeSpan(0, 0, i);
                DelayItem item = new DelayItem(dt);
                items.Add(dt, item);
                target.put(item);
            }

            Thread thr = new Thread(() =>
            {
                while (target.Count > 0)
                {
                    takenItems.Add((DelayItem)target.take());
                }
            });

            thr.Start();

            for (int i = 0; i < 12; i++)
            {
                Thread.Sleep(1000);
                TestNow += new TimeSpan(0, 0, 1);
            }

            thr.Join();

            Assert.AreEqual(items.Count, takenItems.Count);
            Assert.AreEqual(0, target.Count);

            for (int i = 0; i < items.Count; i++)
            {
                Assert.AreSame(items[items.Keys[i]], takenItems[i]);
            }
        }
Пример #6
0
        public void TestAddsKeptInSequence()
        {
            DelayQueue<uint> dq = new DelayQueue<uint>();
            dq.Enqueue(0, 1);
            dq.Enqueue(1, 1);
            dq.Enqueue(2, 1);
            dq.Enqueue(3, 1);
            Assert.AreEqual(1, dq.MaximumDelay);
            Assert.IsFalse(dq.Dequeue(0, null));
            uint lastSeen = 0;
            dq.Enqueue(4, 1);
            Assert.AreEqual(1, dq.MaximumDelay);
            Assert.IsTrue(dq.Dequeue(1, v => Assert.AreEqual(lastSeen++, v)));

            Assert.AreEqual(0, dq.Count);
            Assert.AreEqual(0, dq.MaximumDelay);
        }
Пример #7
0
        /// <summary>
        ///
        /// </summary>
        /// <param name="tickSpan">时间槽大小,毫秒</param>
        /// <param name="slotCount">时间槽数量</param>
        /// <param name="startMs">起始时间戳,标识时间轮创建时间</param>
        /// <param name="taskCount">任务总数</param>
        /// <param name="delayQueue">时间槽延时队列</param>
        public TimingWheel(long tickSpan, int slotCount, long startMs, AtomicInt taskCount, DelayQueue <TimeSlot> delayQueue)
        {
            _tickSpan   = tickSpan;
            _slotCount  = slotCount;
            _taskCount  = taskCount;
            _delayQueue = delayQueue;

            _wheelSpan = _tickSpan * _slotCount;
            _timeSlots = new TimeSlot[_slotCount];

            for (int i = 0; i < _timeSlots.Length; i++)
            {
                _timeSlots[i] = new TimeSlot(_taskCount);
            }

            // 计算起始时间槽的起始时间戳,注意起始时间槽并不一定是第0个
            SetNeedle(startMs);
        }
Пример #8
0
        public void DelayQueuePollInOrder()
        {
            List <DelayItem> takenItems            = new List <DelayItem>();
            SortedList <DateTime, DelayItem> items = new SortedList <DateTime, DelayItem>();

            DelayQueue target = new DelayQueue();

            TestNow = new DateTime(2000, 1, 1);
            List <int> offsets = new List <int>();

            offsets.Add(8);
            offsets.Add(6);
            offsets.Add(7);
            offsets.Add(5);

            foreach (int i in offsets)
            {
                DateTime  dt   = TestNow + new TimeSpan(0, 0, i);
                DelayItem item = new DelayItem(dt);
                items.Add(dt, item);
                target.put(item);
            }

            TestNow += new TimeSpan(0, 0, 50);
            while (target.Count > 0)
            {
                takenItems.Add((DelayItem)target.poll());
            }


            Assert.AreEqual(items.Count, takenItems.Count);
            Assert.AreEqual(0, target.Count);

            for (int i = 0; i < items.Count; i++)
            {
                Assert.AreSame(items[items.Keys[i]], takenItems[i]);
            }
        }
Пример #9
0
        public void DelayQueuePollMultipleReady()
        {
            DelayQueue target = new DelayQueue();

            TestNow = new DateTime(2000, 1, 1);
            TimeSpan  delta    = new TimeSpan(1, 0, 0, 0);
            const int numItems = 10;

            SortedList <TimeSpan, DelayItem> items = new SortedList <TimeSpan, DelayItem>(10);

            // Put in five ready items, five not ready items
            {
                TimeSpan d2 = delta;
                for (int i = 0; i < numItems / 2; i++, d2 += delta)
                {
                    DelayItem iplus  = new DelayItem(TestNow + d2);
                    DelayItem iminus = new DelayItem(TestNow - d2);
                    target.put(iplus);
                    target.put(iminus);
                    items.Add(d2, iplus);
                    items.Add(-d2, iminus);
                }
            }

            Assert.AreEqual(numItems, target.Count);

            for (int i = 0; i < numItems / 2; i++)
            {
                object qItem = target.poll();
                object item  = items[items.Keys[0]];
                items.RemoveAt(0);
                Assert.AreSame(item, qItem);
                Assert.AreEqual(items.Count, target.Count);
            }

            Assert.IsNull(target.peek());
            Assert.IsNull(target.poll());
        }
Пример #10
0
 public void TestReversedAdds()
 {
     DelayQueue<uint> dq = new DelayQueue<uint>();
     Assert.AreEqual(0, dq.Count);
     for (uint i = 0; i < 10; i++)
     {
         dq.Enqueue(10 - i - 1, 10 - i);
         Assert.AreEqual(i + 1, dq.Count);
         Assert.AreEqual(10, dq.MaximumDelay);   // MaxDelay shouldn't change
     }
     Assert.IsFalse(dq.Dequeue(0, null));    // nothing at time 0
     for (uint i = 0; i < 10; i++)
     {
         Assert.AreEqual(10 - i, dq.Count);
         Assert.AreEqual(10 - i , dq.MaximumDelay);
         bool dequeued = dq.Dequeue(1, e => Assert.AreEqual(i, e));
         Assert.IsTrue(dequeued);
         Assert.AreEqual(10 - (i + 1), dq.Count);
         Assert.AreEqual(10 - i - 1, dq.MaximumDelay);
         Assert.IsFalse(dq.Dequeue(0, null));
     }
     Assert.AreEqual(0, dq.Count);
     Assert.AreEqual(0, dq.MaximumDelay);
 }
Пример #11
0
        public void TestSequentialAdds()
        {
            DelayQueue<uint> dq = new DelayQueue<uint>();
            Assert.AreEqual(0, dq.Count);
            for (uint i = 0; i < 10; i++)
            {
                dq.Enqueue(i, i + 1);
                Assert.AreEqual(i + 1, dq.Count);
                Assert.AreEqual(i + 1, dq.MaximumDelay);
            }

            Assert.IsFalse(dq.Dequeue(0, null));    // nothing at time 0
            for (uint i = 0; i < 10; i++)
            {
                uint expected = i;
                Assert.AreEqual(10 - i, dq.Count);
                Assert.AreEqual(10 - i, dq.MaximumDelay);
                bool dequeued = dq.Dequeue(1, e => Assert.AreEqual(expected, e));
                Assert.IsTrue(dequeued);
                Assert.AreEqual(10 - (i + 1), dq.Count);
                Assert.AreEqual(10 - (i + 1), dq.MaximumDelay);
                Assert.IsFalse(dq.Dequeue(0, null));
            }
            Assert.AreEqual(0, dq.Count);
            Assert.AreEqual(0, dq.MaximumDelay);
        }
Пример #12
0
        public void TestSequentialAddsButUnequalRemoved()
        {
            DelayQueue<uint> dq = new DelayQueue<uint>();
            Assert.AreEqual(0, dq.Count);
            Assert.AreEqual(0, dq.MaximumDelay);
            for (uint i = 0; i < 5; i++)
            {
                dq.Enqueue(2 * i, i + 1);
                dq.Enqueue(2 * i + 1, i + 1);
                Assert.AreEqual(2 * (i + 1), dq.Count);
                Assert.AreEqual(i + 1, dq.MaximumDelay);
            }

            Assert.IsFalse(dq.Dequeue(0, null));    // nothing at time 0
            uint lastCount = 0;
            for (uint i = 0; i < 5; i++)
            {
                Assert.AreEqual(10 - (2 * i), dq.Count);
                Assert.AreEqual(5 - i, dq.MaximumDelay);
                bool dequeued = dq.Dequeue(1, e => Assert.AreEqual(lastCount++, e));
                Assert.IsTrue(dequeued);
                Assert.AreEqual(10 - 2 * (i + 1), dq.Count);
                Assert.AreEqual(5 - i - 1, dq.MaximumDelay);
                Assert.IsFalse(dq.Dequeue(0, null));
            }
            Assert.AreEqual(0, dq.Count);
        }
Пример #13
0
        private void ProcessPacket(PacketMode mode, TransportPacket packet, DelayQueue<TransportPacket> queue)
        {
            uint delay = (uint)Math.Max(0, CalculateDelay());
            if (Ordering != Ordering.Unordered)
            {
                // if this transport is ordered or sequenced, then the packets
                // must be sent in order, and thus must be delayed in order.
                // Thus when figuring out the possible delay of a packet,
                // we must ensure it's at least as delayed as the previous
                // packet, which must be the most-delayed packet.
                delay = (uint)Math.Max(delay, lastPacketTime[mode] - timer.TimeInMilliseconds);
            }

            if (Reliability != Reliability.Reliable || Ordering != Ordering.Ordered)
            {
                double pDropped = PacketLossCorrelation * pLastDropped +
                    (1d - PacketLossCorrelation) * urng.NextDouble();
                pLastDropped = pDropped;
                if(pDropped < PacketLoss)
                {
                    NotifyPacketDisposition(mode, PacketEffect.Dropped, packet);
                    return;
                }
            }

            // don't include reordering time when recording the scheduled
            // time for this current packet -- if we reorder by delaying,
            // then we *don't* want subsequent packets
            lastPacketTime[mode] = timer.TimeInMilliseconds + delay;

            // Sequenced and ordered transports cannot have out-of-order packets
            if (Ordering == Ordering.Unordered && urng.NextDouble() < PacketReordering)
            {
                // reorder packets by delaying this current packet
                delay += queue.MaximumDelay == 0 ? 10u : queue.MaximumDelay / 2;
                NotifyPacketDisposition(mode, PacketEffect.Reordered, packet);
            }
            else if(delay > 0)
            {
                NotifyPacketDisposition(mode, PacketEffect.Delayed, packet);
            }
            else
            {
                NotifyPacketDisposition(mode, PacketEffect.None, packet);
            }
            packet.Retain();    // countered in Really{Send,Receive}Packet
            queue.Enqueue(packet, delay);
        }
Пример #14
0
        public void DelayQueueConstructorTest()
        {
            DelayQueue target = new DelayQueue();

            Assert.AreEqual(0, target.Count);
        }