diff options
Diffstat (limited to 'OpenSim/Region/ClientStack/LindenUDP/LLPacketQueue.cs')
-rw-r--r-- | OpenSim/Region/ClientStack/LindenUDP/LLPacketQueue.cs | 64 |
1 files changed, 30 insertions, 34 deletions
diff --git a/OpenSim/Region/ClientStack/LindenUDP/LLPacketQueue.cs b/OpenSim/Region/ClientStack/LindenUDP/LLPacketQueue.cs index d4d654f..8484846 100644 --- a/OpenSim/Region/ClientStack/LindenUDP/LLPacketQueue.cs +++ b/OpenSim/Region/ClientStack/LindenUDP/LLPacketQueue.cs | |||
@@ -62,6 +62,8 @@ namespace OpenSim.Region.ClientStack.LindenUDP | |||
62 | private Queue<LLQueItem> TextureOutgoingPacketQueue; | 62 | private Queue<LLQueItem> TextureOutgoingPacketQueue; |
63 | private Queue<LLQueItem> AssetOutgoingPacketQueue; | 63 | private Queue<LLQueItem> AssetOutgoingPacketQueue; |
64 | 64 | ||
65 | private List<ThrottleOutPacketType> Empty = new List<ThrottleOutPacketType>(); | ||
66 | // m_log.Info("[THROTTLE]: Entering Throttle"); | ||
65 | // private Dictionary<uint, uint> PendingAcks = new Dictionary<uint, uint>(); | 67 | // private Dictionary<uint, uint> PendingAcks = new Dictionary<uint, uint>(); |
66 | // private Dictionary<uint, Packet> NeedAck = new Dictionary<uint, Packet>(); | 68 | // private Dictionary<uint, Packet> NeedAck = new Dictionary<uint, Packet>(); |
67 | 69 | ||
@@ -85,20 +87,6 @@ namespace OpenSim.Region.ClientStack.LindenUDP | |||
85 | 87 | ||
86 | private Dictionary<uint,int> contents = new Dictionary<uint, int>(); | 88 | private Dictionary<uint,int> contents = new Dictionary<uint, int>(); |
87 | 89 | ||
88 | /// <summary> | ||
89 | /// The number of packets in the OutgoingPacketQueue | ||
90 | /// | ||
91 | /// </summary> | ||
92 | internal int TextureOutgoingPacketQueueCount | ||
93 | { | ||
94 | get | ||
95 | { | ||
96 | if (TextureOutgoingPacketQueue == null) | ||
97 | return 0; | ||
98 | return TextureOutgoingPacketQueue.Count; | ||
99 | } | ||
100 | } | ||
101 | |||
102 | // private long LastThrottle; | 90 | // private long LastThrottle; |
103 | // private long ThrottleInterval; | 91 | // private long ThrottleInterval; |
104 | private Timer throttleTimer; | 92 | private Timer throttleTimer; |
@@ -212,28 +200,28 @@ namespace OpenSim.Region.ClientStack.LindenUDP | |||
212 | switch (item.throttleType & ThrottleOutPacketType.TypeMask) | 200 | switch (item.throttleType & ThrottleOutPacketType.TypeMask) |
213 | { | 201 | { |
214 | case ThrottleOutPacketType.Resend: | 202 | case ThrottleOutPacketType.Resend: |
215 | ThrottleCheck(ref ResendThrottle, ref ResendOutgoingPacketQueue, item); | 203 | ThrottleCheck(ref ResendThrottle, ref ResendOutgoingPacketQueue, item, ThrottleOutPacketType.Resend); |
216 | break; | 204 | break; |
217 | case ThrottleOutPacketType.Texture: | 205 | case ThrottleOutPacketType.Texture: |
218 | ThrottleCheck(ref TextureThrottle, ref TextureOutgoingPacketQueue, item); | 206 | ThrottleCheck(ref TextureThrottle, ref TextureOutgoingPacketQueue, item, ThrottleOutPacketType.Texture); |
219 | break; | 207 | break; |
220 | case ThrottleOutPacketType.Task: | 208 | case ThrottleOutPacketType.Task: |
221 | if ((item.throttleType & ThrottleOutPacketType.LowPriority) != 0) | 209 | if ((item.throttleType & ThrottleOutPacketType.LowPriority) != 0) |
222 | ThrottleCheck(ref TaskThrottle, ref TaskLowpriorityPacketQueue, item); | 210 | ThrottleCheck(ref TaskThrottle, ref TaskLowpriorityPacketQueue, item, ThrottleOutPacketType.Task); |
223 | else | 211 | else |
224 | ThrottleCheck(ref TaskThrottle, ref TaskOutgoingPacketQueue, item); | 212 | ThrottleCheck(ref TaskThrottle, ref TaskOutgoingPacketQueue, item, ThrottleOutPacketType.Task); |
225 | break; | 213 | break; |
226 | case ThrottleOutPacketType.Land: | 214 | case ThrottleOutPacketType.Land: |
227 | ThrottleCheck(ref LandThrottle, ref LandOutgoingPacketQueue, item); | 215 | ThrottleCheck(ref LandThrottle, ref LandOutgoingPacketQueue, item, ThrottleOutPacketType.Land); |
228 | break; | 216 | break; |
229 | case ThrottleOutPacketType.Asset: | 217 | case ThrottleOutPacketType.Asset: |
230 | ThrottleCheck(ref AssetThrottle, ref AssetOutgoingPacketQueue, item); | 218 | ThrottleCheck(ref AssetThrottle, ref AssetOutgoingPacketQueue, item, ThrottleOutPacketType.Asset); |
231 | break; | 219 | break; |
232 | case ThrottleOutPacketType.Cloud: | 220 | case ThrottleOutPacketType.Cloud: |
233 | ThrottleCheck(ref CloudThrottle, ref CloudOutgoingPacketQueue, item); | 221 | ThrottleCheck(ref CloudThrottle, ref CloudOutgoingPacketQueue, item, ThrottleOutPacketType.Cloud); |
234 | break; | 222 | break; |
235 | case ThrottleOutPacketType.Wind: | 223 | case ThrottleOutPacketType.Wind: |
236 | ThrottleCheck(ref WindThrottle, ref WindOutgoingPacketQueue, item); | 224 | ThrottleCheck(ref WindThrottle, ref WindOutgoingPacketQueue, item, ThrottleOutPacketType.Wind); |
237 | break; | 225 | break; |
238 | 226 | ||
239 | default: | 227 | default: |
@@ -408,6 +396,7 @@ namespace OpenSim.Region.ClientStack.LindenUDP | |||
408 | 396 | ||
409 | int MaxThrottleLoops = 4550; // 50*7 packets can be dequeued at once. | 397 | int MaxThrottleLoops = 4550; // 50*7 packets can be dequeued at once. |
410 | int throttleLoops = 0; | 398 | int throttleLoops = 0; |
399 | List<ThrottleOutPacketType> e; | ||
411 | 400 | ||
412 | // We're going to dequeue all of the saved up packets until | 401 | // We're going to dequeue all of the saved up packets until |
413 | // we've hit the throttle limit or there's no more packets to send | 402 | // we've hit the throttle limit or there's no more packets to send |
@@ -420,8 +409,6 @@ namespace OpenSim.Region.ClientStack.LindenUDP | |||
420 | 409 | ||
421 | ResetCounters(); | 410 | ResetCounters(); |
422 | 411 | ||
423 | List<ThrottleOutPacketType> Empty = new List<ThrottleOutPacketType>(); | ||
424 | // m_log.Info("[THROTTLE]: Entering Throttle"); | ||
425 | while (TotalThrottle.UnderLimit() && qchanged && throttleLoops <= MaxThrottleLoops) | 412 | while (TotalThrottle.UnderLimit() && qchanged && throttleLoops <= MaxThrottleLoops) |
426 | { | 413 | { |
427 | qchanged = false; // We will break out of the loop if no work was accomplished | 414 | qchanged = false; // We will break out of the loop if no work was accomplished |
@@ -448,7 +435,7 @@ namespace OpenSim.Region.ClientStack.LindenUDP | |||
448 | LandThrottle.AddBytes(qpack.Length); | 435 | LandThrottle.AddBytes(qpack.Length); |
449 | qchanged = true; | 436 | qchanged = true; |
450 | 437 | ||
451 | if (LandOutgoingPacketQueue.Count == 0) | 438 | if (LandOutgoingPacketQueue.Count == 0 && !Empty.Contains(ThrottleOutPacketType.Land)) |
452 | Empty.Add(ThrottleOutPacketType.Land); | 439 | Empty.Add(ThrottleOutPacketType.Land); |
453 | } | 440 | } |
454 | 441 | ||
@@ -461,7 +448,7 @@ namespace OpenSim.Region.ClientStack.LindenUDP | |||
461 | WindThrottle.AddBytes(qpack.Length); | 448 | WindThrottle.AddBytes(qpack.Length); |
462 | qchanged = true; | 449 | qchanged = true; |
463 | 450 | ||
464 | if (WindOutgoingPacketQueue.Count == 0) | 451 | if (WindOutgoingPacketQueue.Count == 0 && !Empty.Contains(ThrottleOutPacketType.Wind)) |
465 | Empty.Add(ThrottleOutPacketType.Wind); | 452 | Empty.Add(ThrottleOutPacketType.Wind); |
466 | } | 453 | } |
467 | 454 | ||
@@ -474,7 +461,7 @@ namespace OpenSim.Region.ClientStack.LindenUDP | |||
474 | CloudThrottle.AddBytes(qpack.Length); | 461 | CloudThrottle.AddBytes(qpack.Length); |
475 | qchanged = true; | 462 | qchanged = true; |
476 | 463 | ||
477 | if (CloudOutgoingPacketQueue.Count == 0) | 464 | if (CloudOutgoingPacketQueue.Count == 0 && !Empty.Contains(ThrottleOutPacketType.Cloud)) |
478 | Empty.Add(ThrottleOutPacketType.Cloud); | 465 | Empty.Add(ThrottleOutPacketType.Cloud); |
479 | } | 466 | } |
480 | 467 | ||
@@ -496,7 +483,7 @@ namespace OpenSim.Region.ClientStack.LindenUDP | |||
496 | TaskThrottle.AddBytes(qpack.Length); | 483 | TaskThrottle.AddBytes(qpack.Length); |
497 | qchanged = true; | 484 | qchanged = true; |
498 | 485 | ||
499 | if (TaskOutgoingPacketQueue.Count == 0 && TaskLowpriorityPacketQueue.Count == 0) | 486 | if (TaskOutgoingPacketQueue.Count == 0 && TaskLowpriorityPacketQueue.Count == 0 && !Empty.Contains(ThrottleOutPacketType.Task)) |
500 | Empty.Add(ThrottleOutPacketType.Task); | 487 | Empty.Add(ThrottleOutPacketType.Task); |
501 | } | 488 | } |
502 | 489 | ||
@@ -509,7 +496,7 @@ namespace OpenSim.Region.ClientStack.LindenUDP | |||
509 | TextureThrottle.AddBytes(qpack.Length); | 496 | TextureThrottle.AddBytes(qpack.Length); |
510 | qchanged = true; | 497 | qchanged = true; |
511 | 498 | ||
512 | if (TextureOutgoingPacketQueue.Count == 0) | 499 | if (TextureOutgoingPacketQueue.Count == 0 && !Empty.Contains(ThrottleOutPacketType.Texture)) |
513 | Empty.Add(ThrottleOutPacketType.Texture); | 500 | Empty.Add(ThrottleOutPacketType.Texture); |
514 | } | 501 | } |
515 | 502 | ||
@@ -522,16 +509,20 @@ namespace OpenSim.Region.ClientStack.LindenUDP | |||
522 | AssetThrottle.AddBytes(qpack.Length); | 509 | AssetThrottle.AddBytes(qpack.Length); |
523 | qchanged = true; | 510 | qchanged = true; |
524 | 511 | ||
525 | if (AssetOutgoingPacketQueue.Count == 0) | 512 | if (AssetOutgoingPacketQueue.Count == 0 && !Empty.Contains(ThrottleOutPacketType.Asset)) |
526 | Empty.Add(ThrottleOutPacketType.Asset); | 513 | Empty.Add(ThrottleOutPacketType.Asset); |
527 | } | 514 | } |
528 | } | 515 | } |
529 | // m_log.Info("[THROTTLE]: Processed " + throttleLoops + " packets"); | 516 | // m_log.Info("[THROTTLE]: Processed " + throttleLoops + " packets"); |
530 | 517 | ||
531 | foreach (ThrottleOutPacketType t in Empty) | 518 | e = new List<ThrottleOutPacketType>(Empty); |
532 | { | 519 | Empty.Clear(); |
520 | } | ||
521 | |||
522 | foreach (ThrottleOutPacketType t in e) | ||
523 | { | ||
524 | if (GetQueueCount(t) == 0) | ||
533 | TriggerOnQueueEmpty(t); | 525 | TriggerOnQueueEmpty(t); |
534 | } | ||
535 | } | 526 | } |
536 | } | 527 | } |
537 | 528 | ||
@@ -552,7 +543,7 @@ namespace OpenSim.Region.ClientStack.LindenUDP | |||
552 | ProcessThrottle(); | 543 | ProcessThrottle(); |
553 | } | 544 | } |
554 | 545 | ||
555 | private void ThrottleCheck(ref LLPacketThrottle throttle, ref Queue<LLQueItem> q, LLQueItem item) | 546 | private void ThrottleCheck(ref LLPacketThrottle throttle, ref Queue<LLQueItem> q, LLQueItem item, ThrottleOutPacketType itemType) |
556 | { | 547 | { |
557 | // The idea.. is if the packet throttle queues are empty | 548 | // The idea.. is if the packet throttle queues are empty |
558 | // and the client is under throttle for the type. Queue | 549 | // and the client is under throttle for the type. Queue |
@@ -568,6 +559,11 @@ namespace OpenSim.Region.ClientStack.LindenUDP | |||
568 | throttle.AddBytes(item.Length); | 559 | throttle.AddBytes(item.Length); |
569 | TotalThrottle.AddBytes(item.Length); | 560 | TotalThrottle.AddBytes(item.Length); |
570 | SendQueue.Enqueue(item); | 561 | SendQueue.Enqueue(item); |
562 | lock (this) | ||
563 | { | ||
564 | if (!Empty.Contains(itemType)) | ||
565 | Empty.Add(itemType); | ||
566 | } | ||
571 | } | 567 | } |
572 | catch (Exception e) | 568 | catch (Exception e) |
573 | { | 569 | { |