From 5d986002fdb6d91426529f14344d7b2d133c6633 Mon Sep 17 00:00:00 2001
From: UbitUmarov
Date: Wed, 26 Sep 2012 00:17:54 +0100
Subject:  fix priorityQueue to correctly use the fairness counts starting at 8
 for  nonimediate queues. Imediate queues where not taken into account so it 
 was unused.

---
 OpenSim/Framework/PriorityQueue.cs | 20 ++++++++++----------
 1 file changed, 10 insertions(+), 10 deletions(-)

diff --git a/OpenSim/Framework/PriorityQueue.cs b/OpenSim/Framework/PriorityQueue.cs
index e7a7f7f..e4f1111 100644
--- a/OpenSim/Framework/PriorityQueue.cs
+++ b/OpenSim/Framework/PriorityQueue.cs
@@ -45,7 +45,8 @@ namespace OpenSim.Framework
         /// <summary>
         /// Total number of queues (priorities) available
         /// </summary>
-        public const uint NumberOfQueues = 12;
+
+        public const uint NumberOfQueues = 12; // includes immediate queues, m_queueCounts need to be set acording
 
         /// <summary>
         /// 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
         /// </summary>
         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;
                 }
             }
-- 
cgit v1.1