* Changed the flush logic to drop packets in non-transactional streams, and to not fire any "put more data in the queues" callbacks

* Minor tweaks to code formatting to make the callback chain for packet queuing easier to follow
prioritization
John Hurliman 2009-10-02 12:00:42 -07:00
parent 3ba36bb4d8
commit 9b342d3e0d
3 changed files with 19 additions and 59 deletions

View File

@ -3131,9 +3131,6 @@ namespace OpenSim.Region.ClientStack.LindenUDP
} }
} }
// Unlike the other timers, this one is only started after
// the first request is seen.
void HandleQueueEmpty(ThrottleOutPacketType queue) void HandleQueueEmpty(ThrottleOutPacketType queue)
{ {
switch (queue) switch (queue)
@ -3147,10 +3144,7 @@ namespace OpenSim.Region.ClientStack.LindenUDP
void ProcessTextureRequests() void ProcessTextureRequests()
{ {
if (m_imageManager != null) if (m_imageManager != null)
{ m_imageManager.ProcessImageQueue(m_textureSendLimit, m_textureDataLimit);
m_imageManager.ProcessImageQueue(m_textureSendLimit,
m_textureDataLimit);
}
} }
void ProcessPrimFullUpdates(object sender, ElapsedEventArgs e) void ProcessPrimFullUpdates(object sender, ElapsedEventArgs e)

View File

@ -776,9 +776,7 @@ namespace OpenSim.Region.ClientStack.LindenUDP
{ {
QueueEmpty handlerQueueEmpty = OnQueueEmpty; QueueEmpty handlerQueueEmpty = OnQueueEmpty;
if (handlerQueueEmpty == null) if (handlerQueueEmpty != null)
return;
handlerQueueEmpty(queue); handlerQueueEmpty(queue);
} }

View File

@ -273,55 +273,25 @@ namespace OpenSim.Region.ClientStack.LindenUDP
{ {
lock (this) lock (this)
{ {
while (PacketsWaiting()) // These categories do not contain transactional packets so we can safely drop any pending data in them
LandOutgoingPacketQueue.Clear();
WindOutgoingPacketQueue.Clear();
CloudOutgoingPacketQueue.Clear();
TextureOutgoingPacketQueue.Clear();
AssetOutgoingPacketQueue.Clear();
// Now comes the fun part.. we dump all remaining resend and task packets into the send queue
while (ResendOutgoingPacketQueue.Count > 0 || TaskOutgoingPacketQueue.Count > 0 || TaskLowpriorityPacketQueue.Count > 0)
{ {
//Now comes the fun part.. we dump all our elements into m_packetQueue that we've saved up.
if (ResendOutgoingPacketQueue.Count > 0) if (ResendOutgoingPacketQueue.Count > 0)
{
SendQueue.Enqueue(ResendOutgoingPacketQueue.Dequeue()); SendQueue.Enqueue(ResendOutgoingPacketQueue.Dequeue());
}
if (LandOutgoingPacketQueue.Count > 0)
{
SendQueue.Enqueue(LandOutgoingPacketQueue.Dequeue());
TriggerOnQueueEmpty(ThrottleOutPacketType.Land);
}
if (WindOutgoingPacketQueue.Count > 0)
{
SendQueue.Enqueue(WindOutgoingPacketQueue.Dequeue());
TriggerOnQueueEmpty(ThrottleOutPacketType.Wind);
}
if (CloudOutgoingPacketQueue.Count > 0)
{
SendQueue.Enqueue(CloudOutgoingPacketQueue.Dequeue());
TriggerOnQueueEmpty(ThrottleOutPacketType.Cloud);
}
bool tasksSent = false;
if (TaskOutgoingPacketQueue.Count > 0) if (TaskOutgoingPacketQueue.Count > 0)
{
tasksSent = true;
SendQueue.PriorityEnqueue(TaskOutgoingPacketQueue.Dequeue()); SendQueue.PriorityEnqueue(TaskOutgoingPacketQueue.Dequeue());
}
if (TaskLowpriorityPacketQueue.Count > 0) if (TaskLowpriorityPacketQueue.Count > 0)
{
tasksSent = true;
SendQueue.Enqueue(TaskLowpriorityPacketQueue.Dequeue()); SendQueue.Enqueue(TaskLowpriorityPacketQueue.Dequeue());
} }
if (tasksSent)
{
TriggerOnQueueEmpty(ThrottleOutPacketType.Task);
}
if (TextureOutgoingPacketQueue.Count > 0)
{
SendQueue.Enqueue(TextureOutgoingPacketQueue.Dequeue());
TriggerOnQueueEmpty(ThrottleOutPacketType.Texture);
}
if (AssetOutgoingPacketQueue.Count > 0)
{
SendQueue.Enqueue(AssetOutgoingPacketQueue.Dequeue());
TriggerOnQueueEmpty(ThrottleOutPacketType.Asset);
}
}
// m_log.Info("[THROTTLE]: Processed " + throttleLoops + " packets");
} }
} }
@ -530,9 +500,7 @@ namespace OpenSim.Region.ClientStack.LindenUDP
{ {
QueueEmpty handlerQueueEmpty = OnQueueEmpty; QueueEmpty handlerQueueEmpty = OnQueueEmpty;
if (handlerQueueEmpty == null) if (handlerQueueEmpty != null)
return;
handlerQueueEmpty(queue); handlerQueueEmpty(queue);
} }