public LinkedListNode<SendParameters> Peek(LinkedList<SendParameters> list, DropRealTimeChunks drop) { lock (this) { if (this.m_Queue.Count > 0) { LinkedListNode<SendParameters> node = (LinkedListNode<SendParameters>)this.m_Queue.Peek(); if (node.Value.Tags.Priority != MessagePriority.RealTime) { //If item is not real-time, we're done. } else if ((drop == DropRealTimeChunks.Sometimes) && (this.m_Queue.Count >= DROP_REALTIME_THRESHOLD) && (m_NonRealTimeChunkCount > 0)) { //Here we drop real-time items when we are over a queue length //threshold, but only if there is at least one //non-real-time item in the queue. while (node.Value.Tags.Priority == MessagePriority.RealTime) { Trace.WriteLine("Dropping Real-Time Chunk", this.GetType().ToString()); node = (LinkedListNode<SendParameters>)m_Queue.Dequeue(); list.Remove(node); node = (LinkedListNode<SendParameters>)m_Queue.Peek(); } } else if (drop == DropRealTimeChunks.Always) { //Here we drop real-time items unconditionally until we come to //a non-real-time item, or until the queue is empty. while (node.Value.Tags.Priority == MessagePriority.RealTime) { Trace.WriteLine("Dropping Real-Time Chunk", this.GetType().ToString()); node = (LinkedListNode<SendParameters>)m_Queue.Dequeue(); list.Remove(node); if (m_Queue.Count > 0) { node = (LinkedListNode<SendParameters>)m_Queue.Peek(); } else { node = null; break; } } } return node; } } return null; }
public LinkedListNode <SendParameters> Peek(LinkedList <SendParameters> list, DropRealTimeChunks drop) { lock (this) { if (this.m_Queue.Count > 0) { LinkedListNode <SendParameters> node = (LinkedListNode <SendParameters>) this.m_Queue.Peek(); if (node.Value.Tags.Priority != MessagePriority.RealTime) { //If item is not real-time, we're done. } else if ((drop == DropRealTimeChunks.Sometimes) && (this.m_Queue.Count >= DROP_REALTIME_THRESHOLD) && (m_NonRealTimeChunkCount > 0)) { //Here we drop real-time items when we are over a queue length //threshold, but only if there is at least one //non-real-time item in the queue. while (node.Value.Tags.Priority == MessagePriority.RealTime) { Trace.WriteLine("Dropping Real-Time Chunk", this.GetType().ToString()); node = (LinkedListNode <SendParameters>)m_Queue.Dequeue(); list.Remove(node); node = (LinkedListNode <SendParameters>)m_Queue.Peek(); } } else if (drop == DropRealTimeChunks.Always) { //Here we drop real-time items unconditionally until we come to //a non-real-time item, or until the queue is empty. while (node.Value.Tags.Priority == MessagePriority.RealTime) { Trace.WriteLine("Dropping Real-Time Chunk", this.GetType().ToString()); node = (LinkedListNode <SendParameters>)m_Queue.Dequeue(); list.Remove(node); if (m_Queue.Count > 0) { node = (LinkedListNode <SendParameters>)m_Queue.Peek(); } else { node = null; break; } } } return(node); } } return(null); }