diff --git a/OpenSim/Framework/PriorityQueue.cs b/OpenSim/Framework/PriorityQueue.cs index e7a7f7f13c..e4f1111e02 100644 --- a/OpenSim/Framework/PriorityQueue.cs +++ b/OpenSim/Framework/PriorityQueue.cs @@ -45,7 +45,8 @@ namespace OpenSim.Framework /// /// Total number of queues (priorities) available /// - public const uint NumberOfQueues = 12; + + public const uint NumberOfQueues = 12; // includes immediate queues, m_queueCounts need to be set acording /// /// Number of queuest (priorities) that are processed immediately @@ -60,7 +61,8 @@ namespace OpenSim.Framework // each pass. weighted towards the higher priority queues private uint m_nextQueue = 0; private uint m_countFromQueue = 0; - private uint[] m_queueCounts = { 8, 4, 4, 2, 2, 2, 2, 1, 1, 1, 1, 1 }; + // first queues are imediate, so no counts + private uint[] m_queueCounts = {0, 0, 8, 4, 4, 2, 2, 2, 2, 1, 1, 1}; // next request is a counter of the number of updates queued, it provides // a total ordering on the updates coming through the queue and is more @@ -137,7 +139,7 @@ namespace OpenSim.Framework /// public bool TryDequeue(out IEntityUpdate value, out Int32 timeinqueue) { - // If there is anything in priority queue 0, return it first no + // If there is anything in imediate queues, return it first no // matter what else. Breaks fairness. But very useful. for (int iq = 0; iq < NumberOfImmediateQueues; iq++) { @@ -172,14 +174,13 @@ namespace OpenSim.Framework } // Find the next non-immediate queue with updates in it - for (int i = 0; i < NumberOfQueues; ++i) + for (uint i = NumberOfImmediateQueues; i < NumberOfQueues; ++i) { - m_nextQueue = (uint)((m_nextQueue + 1) % NumberOfQueues); - m_countFromQueue = m_queueCounts[m_nextQueue]; + m_nextQueue++; + if(m_nextQueue >= NumberOfQueues) + m_nextQueue = NumberOfImmediateQueues; - // if this is one of the immediate queues, just skip it - if (m_nextQueue < NumberOfImmediateQueues) - continue; + m_countFromQueue = m_queueCounts[m_nextQueue]; if (m_heaps[m_nextQueue].Count > 0) { @@ -189,7 +190,6 @@ namespace OpenSim.Framework m_lookupTable.Remove(item.Value.Entity.LocalId); timeinqueue = Util.EnvironmentTickCountSubtract(item.EntryTime); value = item.Value; - return true; } }