* FireQueueEmpty now checks if a measurable amount of time has passed, and if not it sleeps for a small amount of time. This throttles OnQueueEmpty calls where there is no callback or the callback is doing very little work

* Changed HandleQueueEmpty()'s Monitor.TryEnter() calls to locks. We want to take our time in this function and do all the work necessary, since returning too fast will induce a sleep anyways
prioritization
John Hurliman 2009-10-21 16:21:08 -07:00
parent 2752a3525c
commit b06f258319
3 changed files with 16 additions and 38 deletions

View File

@ -3558,45 +3558,23 @@ namespace OpenSim.Region.ClientStack.LindenUDP
ProcessTextureRequests(); ProcessTextureRequests();
break; break;
case ThrottleOutPacketType.Task: case ThrottleOutPacketType.Task:
if (Monitor.TryEnter(m_avatarTerseUpdates.SyncRoot)) lock (m_avatarTerseUpdates.SyncRoot)
{
try
{ {
if (m_avatarTerseUpdates.Count > 0) if (m_avatarTerseUpdates.Count > 0)
{
ProcessAvatarTerseUpdates(); ProcessAvatarTerseUpdates();
return;
}
}
finally { Monitor.Exit(m_avatarTerseUpdates.SyncRoot); }
} }
break; break;
case ThrottleOutPacketType.State: case ThrottleOutPacketType.State:
if (Monitor.TryEnter(m_primFullUpdates.SyncRoot)) lock (m_primFullUpdates.SyncRoot)
{
try
{ {
if (m_primFullUpdates.Count > 0) if (m_primFullUpdates.Count > 0)
{
ProcessPrimFullUpdates(); ProcessPrimFullUpdates();
return;
}
}
finally { Monitor.Exit(m_primFullUpdates.SyncRoot); }
} }
if (Monitor.TryEnter(m_primTerseUpdates.SyncRoot)) lock (m_primTerseUpdates.SyncRoot)
{
try
{ {
if (m_primTerseUpdates.Count > 0) if (m_primTerseUpdates.Count > 0)
{
ProcessPrimTerseUpdates(); ProcessPrimTerseUpdates();
return;
}
}
finally { Monitor.Exit(m_primTerseUpdates.SyncRoot); }
} }
break; break;
} }
@ -10344,7 +10322,7 @@ namespace OpenSim.Region.ClientStack.LindenUDP
{ {
if (lookup.Heap.ContainsHandle(lookup.Handle)) if (lookup.Heap.ContainsHandle(lookup.Handle))
lookup.Heap[lookup.Handle] = lookup.Heap[lookup.Handle] =
new MinHeapItem(priority, item.Value, item.LocalID); new MinHeapItem(priority, item.Value, item.LocalID, this.m_comparison);
} }
else else
{ {

View File

@ -535,14 +535,18 @@ namespace OpenSim.Region.ClientStack.LindenUDP
ThrottleOutPacketType type = (ThrottleOutPacketType)i; ThrottleOutPacketType type = (ThrottleOutPacketType)i;
QueueEmpty callback = OnQueueEmpty; QueueEmpty callback = OnQueueEmpty;
int start = Environment.TickCount;
if (callback != null) if (callback != null)
{ {
try { callback(type); } try { callback(type); }
catch (Exception e) { m_log.Error("[LLUDPCLIENT]: OnQueueEmpty(" + type + ") threw an exception: " + e.Message, e); } catch (Exception e) { m_log.Error("[LLUDPCLIENT]: OnQueueEmpty(" + type + ") threw an exception: " + e.Message, e); }
} }
// HACK: Try spending some extra time here to slow down OnQueueEmpty calls // Make sure all queue empty calls take at least a measurable amount of time,
//System.Threading.Thread.Sleep(100); // otherwise we'll peg a CPU trying to fire these too fast
if (Environment.TickCount == start)
System.Threading.Thread.Sleep((int)m_udpServer.TickCountResolution);
m_onQueueEmptyRunning[i] = false; m_onQueueEmptyRunning[i] = false;
} }

View File

@ -125,10 +125,6 @@ namespace OpenSim.Region.ClientStack.LindenUDP
expiredPackets = new List<OutgoingPacket>(); expiredPackets = new List<OutgoingPacket>();
expiredPackets.Add(packet); expiredPackets.Add(packet);
} }
/*else
{
break;
}*/
} }
} }