Example #1
0
        private Task ProcessQueue()
        {
            try
            {
                while (!_cancellationToken.IsCancellationRequested)
                {
                    KeyValuePair <int, Package> pair;

                    if (_queue.TryPeek(out pair))
                    {
                        if (pair.Key == _lastSequenceNumber + 1)
                        {
                            if (_queue.TryDequeue(out pair))
                            {
                                _lastSequenceNumber = pair.Key;

                                HandlePackage(pair.Value, this);

                                if (_queue.Count == 0)
                                {
                                    WaitHandle.SignalAndWait(_mainWaitEvent, _waitEvent, TimeSpan.FromMilliseconds(50), true);
                                }
                            }
                        }
                        else if (pair.Key <= _lastSequenceNumber)
                        {
                            if (Log.IsDebugEnabled)
                            {
                                Log.Warn($"{Username} - Resent. Expected {_lastSequenceNumber + 1}, but was {pair.Key}.");
                            }
                            if (_queue.TryDequeue(out pair))
                            {
                                pair.Value.PutPool();
                            }
                        }
                        else
                        {
                            if (Log.IsDebugEnabled)
                            {
                                Log.Warn($"{Username} - Wrong sequence. Expected {_lastSequenceNumber + 1}, but was {pair.Key}.");
                            }
                            WaitHandle.SignalAndWait(_mainWaitEvent, _waitEvent, TimeSpan.FromMilliseconds(50), true);
                        }
                    }
                    else
                    {
                        if (_queue.Count == 0)
                        {
                            WaitHandle.SignalAndWait(_mainWaitEvent, _waitEvent, TimeSpan.FromMilliseconds(50), true);
                        }
                    }
                }
            }
            catch (Exception e)
            {
                Log.Error($"Exit receive handler task for player", e);
            }

            return(Task.CompletedTask);
        }
Example #2
0
        public IList <BaseEvent> Dequeue(long t)
        {
            var eList = new List <BaseEvent>();
            KeyValuePair <long, BaseEvent> pair;

            while (pQueue.Count > 0)
            {
                while (!pQueue.TryPeek(out pair))
                {
                    ;
                }

                if (pair.Value.Time > t)
                {
                    break;
                }

                while (!pQueue.TryDequeue(out pair))
                {
                    ;
                }

                eList.Add(pair.Value);
            }
            return(eList);
        }
        public void Priorities()
        {
            var q      = new ConcurrentPriorityQueue <int>();
            var values = new int[10000];
            var r      = new Random(0);

            for (int i = 0; i < values.Length; i++)
            {
                int value;
                switch (r.Next(3))
                {
                case 0:
                    value = 0;
                    break;

                case 1:
                    value = int.MaxValue;
                    break;

                default:
                    value = 0x7FFFFFFF & r.Next();
                    break;
                }

                values[i] = value;
                q.Enqueue(value, value);
            }

            Array.Sort(values);
            Array.Reverse(values);
            int dequeuedPriority0, dequeuedValue0, dequeuedPriority1, dequeuedValue1;

            foreach (int t in values)
            {
                XAssert.IsTrue(q.TryPeek(out dequeuedPriority0, out dequeuedValue0));
                XAssert.IsTrue(q.TryDequeue(out dequeuedPriority1, out dequeuedValue1));
                XAssert.AreEqual(dequeuedPriority0, dequeuedPriority0);
                XAssert.AreEqual(dequeuedPriority1, dequeuedPriority1);
                XAssert.AreEqual(t, dequeuedValue1);
            }

            XAssert.IsFalse(q.TryPeek(out dequeuedPriority0, out dequeuedValue0));
            XAssert.IsFalse(q.TryDequeue(out dequeuedPriority1, out dequeuedValue1));
        }
Example #4
0
        private void ProcessOrderedQueue()
        {
            try
            {
                while (!_cancellationToken.IsCancellationRequested && !ConnectionInfo.IsEmulator)
                {
                    if (_orderingBufferQueue.TryPeek(out KeyValuePair <int, Packet> pair))
                    {
                        if (pair.Key == _lastOrderingIndex + 1)
                        {
                            if (_orderingBufferQueue.TryDequeue(out pair))
                            {
                                //Log.Debug($"Handling packet ordering index={pair.Value.ReliabilityHeader.OrderingIndex}. Current index={_lastOrderingIndex}");

                                _lastOrderingIndex = pair.Key;
                                HandlePacket(pair.Value);

                                if (_orderingBufferQueue.Count == 0)
                                {
                                    WaitHandle.SignalAndWait(_packetHandledWaitEvent, _packetQueuedWaitEvent, 500, true);
                                }
                            }
                        }
                        else if (pair.Key <= _lastOrderingIndex)
                        {
                            if (Log.IsDebugEnabled)
                            {
                                Log.Debug($"{Username} - Resent. Expected {_lastOrderingIndex + 1}, but was {pair.Key}.");
                            }
                            if (_orderingBufferQueue.TryDequeue(out pair))
                            {
                                pair.Value.PutPool();
                            }
                        }
                        else
                        {
                            if (Log.IsDebugEnabled)
                            {
                                Log.Debug($"{Username} - Wrong sequence. Expected {_lastOrderingIndex + 1}, but was {pair.Key}.");
                            }
                            WaitHandle.SignalAndWait(_packetHandledWaitEvent, _packetQueuedWaitEvent, 500, true);
                        }
                    }
                    else
                    {
                        if (_orderingBufferQueue.Count == 0)
                        {
                            WaitHandle.SignalAndWait(_packetHandledWaitEvent, _packetQueuedWaitEvent, 500, true);
                        }
                    }
                }
            }
            catch (ObjectDisposedException)
            {
                // Ignore. Comes from the reset events being waited on while being disposed. Not a problem.
            }
            catch (Exception e)
            {
                Log.Error($"Exit receive handler task for player", e);
            }
        }