diff options
Diffstat (limited to 'OpenSim/Region/ClientStack/LindenUDP/LLPacketQueue.cs')
-rw-r--r-- | OpenSim/Region/ClientStack/LindenUDP/LLPacketQueue.cs | 68 |
1 files changed, 46 insertions, 22 deletions
diff --git a/OpenSim/Region/ClientStack/LindenUDP/LLPacketQueue.cs b/OpenSim/Region/ClientStack/LindenUDP/LLPacketQueue.cs index 51dcde7..96f8ac6 100644 --- a/OpenSim/Region/ClientStack/LindenUDP/LLPacketQueue.cs +++ b/OpenSim/Region/ClientStack/LindenUDP/LLPacketQueue.cs | |||
@@ -54,6 +54,7 @@ namespace OpenSim.Region.ClientStack.LindenUDP | |||
54 | private Queue<LLQueItem> WindOutgoingPacketQueue; | 54 | private Queue<LLQueItem> WindOutgoingPacketQueue; |
55 | private Queue<LLQueItem> CloudOutgoingPacketQueue; | 55 | private Queue<LLQueItem> CloudOutgoingPacketQueue; |
56 | private Queue<LLQueItem> TaskOutgoingPacketQueue; | 56 | private Queue<LLQueItem> TaskOutgoingPacketQueue; |
57 | private Queue<LLQueItem> TaskLowpriorityPacketQueue; | ||
57 | private Queue<LLQueItem> TextureOutgoingPacketQueue; | 58 | private Queue<LLQueItem> TextureOutgoingPacketQueue; |
58 | private Queue<LLQueItem> AssetOutgoingPacketQueue; | 59 | private Queue<LLQueItem> AssetOutgoingPacketQueue; |
59 | 60 | ||
@@ -99,6 +100,7 @@ namespace OpenSim.Region.ClientStack.LindenUDP | |||
99 | WindOutgoingPacketQueue = new Queue<LLQueItem>(); | 100 | WindOutgoingPacketQueue = new Queue<LLQueItem>(); |
100 | CloudOutgoingPacketQueue = new Queue<LLQueItem>(); | 101 | CloudOutgoingPacketQueue = new Queue<LLQueItem>(); |
101 | TaskOutgoingPacketQueue = new Queue<LLQueItem>(); | 102 | TaskOutgoingPacketQueue = new Queue<LLQueItem>(); |
103 | TaskLowpriorityPacketQueue = new Queue<LLQueItem>(); | ||
102 | TextureOutgoingPacketQueue = new Queue<LLQueItem>(); | 104 | TextureOutgoingPacketQueue = new Queue<LLQueItem>(); |
103 | AssetOutgoingPacketQueue = new Queue<LLQueItem>(); | 105 | AssetOutgoingPacketQueue = new Queue<LLQueItem>(); |
104 | 106 | ||
@@ -106,8 +108,8 @@ namespace OpenSim.Region.ClientStack.LindenUDP | |||
106 | // Set up the throttle classes (min, max, current) in bytes | 108 | // Set up the throttle classes (min, max, current) in bytes |
107 | ResendThrottle = new LLPacketThrottle(5000, 100000, 16000); | 109 | ResendThrottle = new LLPacketThrottle(5000, 100000, 16000); |
108 | LandThrottle = new LLPacketThrottle(1000, 100000, 2000); | 110 | LandThrottle = new LLPacketThrottle(1000, 100000, 2000); |
109 | WindThrottle = new LLPacketThrottle(1000, 100000, 1000); | 111 | WindThrottle = new LLPacketThrottle(0, 100000, 0); |
110 | CloudThrottle = new LLPacketThrottle(1000, 100000, 1000); | 112 | CloudThrottle = new LLPacketThrottle(0, 100000, 0); |
111 | TaskThrottle = new LLPacketThrottle(1000, 800000, 3000); | 113 | TaskThrottle = new LLPacketThrottle(1000, 800000, 3000); |
112 | AssetThrottle = new LLPacketThrottle(1000, 800000, 1000); | 114 | AssetThrottle = new LLPacketThrottle(1000, 800000, 1000); |
113 | TextureThrottle = new LLPacketThrottle(1000, 800000, 4000); | 115 | TextureThrottle = new LLPacketThrottle(1000, 800000, 4000); |
@@ -149,6 +151,12 @@ namespace OpenSim.Region.ClientStack.LindenUDP | |||
149 | return; | 151 | return; |
150 | } | 152 | } |
151 | 153 | ||
154 | if (item.Incoming) | ||
155 | { | ||
156 | SendQueue.PriorityEnqueue(item); | ||
157 | return; | ||
158 | } | ||
159 | |||
152 | lock (this) | 160 | lock (this) |
153 | { | 161 | { |
154 | switch (item.throttleType) | 162 | switch (item.throttleType) |
@@ -162,6 +170,9 @@ namespace OpenSim.Region.ClientStack.LindenUDP | |||
162 | case ThrottleOutPacketType.Task: | 170 | case ThrottleOutPacketType.Task: |
163 | ThrottleCheck(ref TaskThrottle, ref TaskOutgoingPacketQueue, item); | 171 | ThrottleCheck(ref TaskThrottle, ref TaskOutgoingPacketQueue, item); |
164 | break; | 172 | break; |
173 | case ThrottleOutPacketType.LowpriorityTask: | ||
174 | ThrottleCheck(ref TaskThrottle, ref TaskLowpriorityPacketQueue, item); | ||
175 | break; | ||
165 | case ThrottleOutPacketType.Land: | 176 | case ThrottleOutPacketType.Land: |
166 | ThrottleCheck(ref LandThrottle, ref LandOutgoingPacketQueue, item); | 177 | ThrottleCheck(ref LandThrottle, ref LandOutgoingPacketQueue, item); |
167 | break; | 178 | break; |
@@ -178,7 +189,7 @@ namespace OpenSim.Region.ClientStack.LindenUDP | |||
178 | default: | 189 | default: |
179 | // Acknowledgements and other such stuff should go directly to the blocking Queue | 190 | // Acknowledgements and other such stuff should go directly to the blocking Queue |
180 | // Throttling them may and likely 'will' be problematic | 191 | // Throttling them may and likely 'will' be problematic |
181 | SendQueue.Enqueue(item); | 192 | SendQueue.PriorityEnqueue(item); |
182 | break; | 193 | break; |
183 | } | 194 | } |
184 | } | 195 | } |
@@ -214,7 +225,11 @@ namespace OpenSim.Region.ClientStack.LindenUDP | |||
214 | } | 225 | } |
215 | if (TaskOutgoingPacketQueue.Count > 0) | 226 | if (TaskOutgoingPacketQueue.Count > 0) |
216 | { | 227 | { |
217 | SendQueue.Enqueue(TaskOutgoingPacketQueue.Dequeue()); | 228 | SendQueue.PriorityEnqueue(TaskOutgoingPacketQueue.Dequeue()); |
229 | } | ||
230 | if (TaskLowpriorityPacketQueue.Count > 0) | ||
231 | { | ||
232 | SendQueue.Enqueue(TaskLowpriorityPacketQueue.Dequeue()); | ||
218 | } | 233 | } |
219 | if (TextureOutgoingPacketQueue.Count > 0) | 234 | if (TextureOutgoingPacketQueue.Count > 0) |
220 | { | 235 | { |
@@ -261,6 +276,7 @@ namespace OpenSim.Region.ClientStack.LindenUDP | |||
261 | WindOutgoingPacketQueue.Count > 0 || | 276 | WindOutgoingPacketQueue.Count > 0 || |
262 | CloudOutgoingPacketQueue.Count > 0 || | 277 | CloudOutgoingPacketQueue.Count > 0 || |
263 | TaskOutgoingPacketQueue.Count > 0 || | 278 | TaskOutgoingPacketQueue.Count > 0 || |
279 | TaskLowpriorityPacketQueue.Count > 0 || | ||
264 | AssetOutgoingPacketQueue.Count > 0 || | 280 | AssetOutgoingPacketQueue.Count > 0 || |
265 | TextureOutgoingPacketQueue.Count > 0); | 281 | TextureOutgoingPacketQueue.Count > 0); |
266 | } | 282 | } |
@@ -319,11 +335,19 @@ namespace OpenSim.Region.ClientStack.LindenUDP | |||
319 | TotalThrottle.Add(qpack.Packet.ToBytes().Length); | 335 | TotalThrottle.Add(qpack.Packet.ToBytes().Length); |
320 | CloudThrottle.Add(qpack.Packet.ToBytes().Length); | 336 | CloudThrottle.Add(qpack.Packet.ToBytes().Length); |
321 | } | 337 | } |
322 | if (TaskThrottle.UnderLimit() && TaskOutgoingPacketQueue.Count > 0) | 338 | if (TaskThrottle.UnderLimit() && (TaskOutgoingPacketQueue.Count > 0 || TaskLowpriorityPacketQueue.Count > 0)) |
323 | { | 339 | { |
324 | LLQueItem qpack = TaskOutgoingPacketQueue.Dequeue(); | 340 | LLQueItem qpack; |
325 | 341 | if(TaskOutgoingPacketQueue.Count > 0) | |
326 | SendQueue.Enqueue(qpack); | 342 | { |
343 | qpack = TaskOutgoingPacketQueue.Dequeue(); | ||
344 | SendQueue.PriorityEnqueue(qpack); | ||
345 | } | ||
346 | else | ||
347 | { | ||
348 | qpack = TaskLowpriorityPacketQueue.Dequeue(); | ||
349 | SendQueue.Enqueue(qpack); | ||
350 | } | ||
327 | TotalThrottle.Add(qpack.Packet.ToBytes().Length); | 351 | TotalThrottle.Add(qpack.Packet.ToBytes().Length); |
328 | TaskThrottle.Add(qpack.Packet.ToBytes().Length); | 352 | TaskThrottle.Add(qpack.Packet.ToBytes().Length); |
329 | } | 353 | } |
@@ -490,18 +514,18 @@ namespace OpenSim.Region.ClientStack.LindenUDP | |||
490 | AssetThrottle.Throttle = tAsset; | 514 | AssetThrottle.Throttle = tAsset; |
491 | TotalThrottle.Throttle = tall; | 515 | TotalThrottle.Throttle = tall; |
492 | } | 516 | } |
493 | else if (tall < 1) | 517 | // else if (tall < 1) |
494 | { | 518 | // { |
495 | // client is stupid, penalize him by minning everything | 519 | // // client is stupid, penalize him by minning everything |
496 | ResendThrottle.Throttle = ResendThrottle.Min; | 520 | // ResendThrottle.Throttle = ResendThrottle.Min; |
497 | LandThrottle.Throttle = LandThrottle.Min; | 521 | // LandThrottle.Throttle = LandThrottle.Min; |
498 | WindThrottle.Throttle = WindThrottle.Min; | 522 | // WindThrottle.Throttle = WindThrottle.Min; |
499 | CloudThrottle.Throttle = CloudThrottle.Min; | 523 | // CloudThrottle.Throttle = CloudThrottle.Min; |
500 | TaskThrottle.Throttle = TaskThrottle.Min; | 524 | // TaskThrottle.Throttle = TaskThrottle.Min; |
501 | TextureThrottle.Throttle = TextureThrottle.Min; | 525 | // TextureThrottle.Throttle = TextureThrottle.Min; |
502 | AssetThrottle.Throttle = AssetThrottle.Min; | 526 | // AssetThrottle.Throttle = AssetThrottle.Min; |
503 | TotalThrottle.Throttle = TotalThrottle.Min; | 527 | // TotalThrottle.Throttle = TotalThrottle.Min; |
504 | } | 528 | // } |
505 | else | 529 | else |
506 | { | 530 | { |
507 | // we're over so figure out percentages and use those | 531 | // we're over so figure out percentages and use those |
@@ -516,7 +540,7 @@ namespace OpenSim.Region.ClientStack.LindenUDP | |||
516 | TotalThrottle.Throttle = TotalThrottle.Max; | 540 | TotalThrottle.Throttle = TotalThrottle.Max; |
517 | } | 541 | } |
518 | // effectively wiggling the slider causes things reset | 542 | // effectively wiggling the slider causes things reset |
519 | ResetCounters(); | 543 | // ResetCounters(); // DO NOT reset, better to send less for one period than more |
520 | } | 544 | } |
521 | 545 | ||
522 | // See IPullStatsProvider | 546 | // See IPullStatsProvider |
@@ -540,4 +564,4 @@ namespace OpenSim.Region.ClientStack.LindenUDP | |||
540 | return SendQueue.GetQueueArray(); | 564 | return SendQueue.GetQueueArray(); |
541 | } | 565 | } |
542 | } | 566 | } |
543 | } \ No newline at end of file | 567 | } |