diff options
Diffstat (limited to 'OpenSim/Region/ClientStack/Linden/UDP/LLUDPServer.cs')
-rw-r--r-- | OpenSim/Region/ClientStack/Linden/UDP/LLUDPServer.cs | 103 |
1 files changed, 86 insertions, 17 deletions
diff --git a/OpenSim/Region/ClientStack/Linden/UDP/LLUDPServer.cs b/OpenSim/Region/ClientStack/Linden/UDP/LLUDPServer.cs index bcfd392..14cc863 100644 --- a/OpenSim/Region/ClientStack/Linden/UDP/LLUDPServer.cs +++ b/OpenSim/Region/ClientStack/Linden/UDP/LLUDPServer.cs | |||
@@ -170,6 +170,8 @@ namespace OpenSim.Region.ClientStack.LindenUDP | |||
170 | 170 | ||
171 | private Pool<IncomingPacket> m_incomingPacketPool; | 171 | private Pool<IncomingPacket> m_incomingPacketPool; |
172 | 172 | ||
173 | private Stat m_incomingPacketPoolStat; | ||
174 | |||
173 | private int m_defaultRTO = 0; | 175 | private int m_defaultRTO = 0; |
174 | private int m_maxRTO = 0; | 176 | private int m_maxRTO = 0; |
175 | private int m_ackTimeout = 0; | 177 | private int m_ackTimeout = 0; |
@@ -214,6 +216,7 @@ namespace OpenSim.Region.ClientStack.LindenUDP | |||
214 | 216 | ||
215 | m_circuitManager = circuitManager; | 217 | m_circuitManager = circuitManager; |
216 | int sceneThrottleBps = 0; | 218 | int sceneThrottleBps = 0; |
219 | bool usePools = false; | ||
217 | 220 | ||
218 | IConfig config = configSource.Configs["ClientStack.LindenUDP"]; | 221 | IConfig config = configSource.Configs["ClientStack.LindenUDP"]; |
219 | if (config != null) | 222 | if (config != null) |
@@ -246,7 +249,7 @@ namespace OpenSim.Region.ClientStack.LindenUDP | |||
246 | { | 249 | { |
247 | PacketPool.Instance.RecyclePackets = packetConfig.GetBoolean("RecyclePackets", true); | 250 | PacketPool.Instance.RecyclePackets = packetConfig.GetBoolean("RecyclePackets", true); |
248 | PacketPool.Instance.RecycleDataBlocks = packetConfig.GetBoolean("RecycleDataBlocks", true); | 251 | PacketPool.Instance.RecycleDataBlocks = packetConfig.GetBoolean("RecycleDataBlocks", true); |
249 | UsePools = packetConfig.GetBoolean("RecycleBaseUDPPackets", false); | 252 | usePools = packetConfig.GetBoolean("RecycleBaseUDPPackets", usePools); |
250 | } | 253 | } |
251 | 254 | ||
252 | #region BinaryStats | 255 | #region BinaryStats |
@@ -277,22 +280,8 @@ namespace OpenSim.Region.ClientStack.LindenUDP | |||
277 | m_throttle = new TokenBucket(null, sceneThrottleBps); | 280 | m_throttle = new TokenBucket(null, sceneThrottleBps); |
278 | ThrottleRates = new ThrottleRates(configSource); | 281 | ThrottleRates = new ThrottleRates(configSource); |
279 | 282 | ||
280 | if (UsePools) | 283 | if (usePools) |
281 | { | 284 | EnablePools(); |
282 | m_incomingPacketPool = new Pool<IncomingPacket>(() => new IncomingPacket(), 500); | ||
283 | |||
284 | StatsManager.RegisterStat( | ||
285 | new Stat( | ||
286 | "IncomingPacketPoolCount", | ||
287 | "Objects within incoming packet pool", | ||
288 | "The number of objects currently stored within the incoming packet pool", | ||
289 | "", | ||
290 | "clientstack", | ||
291 | "packetpool", | ||
292 | StatType.Pull, | ||
293 | stat => stat.Value = m_incomingPacketPool.Count, | ||
294 | StatVerbosity.Debug)); | ||
295 | } | ||
296 | } | 285 | } |
297 | 286 | ||
298 | public void Start() | 287 | public void Start() |
@@ -345,6 +334,50 @@ namespace OpenSim.Region.ClientStack.LindenUDP | |||
345 | base.StopInbound(); | 334 | base.StopInbound(); |
346 | } | 335 | } |
347 | 336 | ||
337 | protected override bool EnablePools() | ||
338 | { | ||
339 | if (!UsePools) | ||
340 | { | ||
341 | base.EnablePools(); | ||
342 | |||
343 | m_incomingPacketPool = new Pool<IncomingPacket>(() => new IncomingPacket(), 500); | ||
344 | |||
345 | m_incomingPacketPoolStat | ||
346 | = new Stat( | ||
347 | "IncomingPacketPoolCount", | ||
348 | "Objects within incoming packet pool", | ||
349 | "The number of objects currently stored within the incoming packet pool", | ||
350 | "", | ||
351 | "clientstack", | ||
352 | "packetpool", | ||
353 | StatType.Pull, | ||
354 | stat => stat.Value = m_incomingPacketPool.Count, | ||
355 | StatVerbosity.Debug); | ||
356 | |||
357 | StatsManager.RegisterStat(m_incomingPacketPoolStat); | ||
358 | |||
359 | return true; | ||
360 | } | ||
361 | |||
362 | return false; | ||
363 | } | ||
364 | |||
365 | protected override bool DisablePools() | ||
366 | { | ||
367 | if (UsePools) | ||
368 | { | ||
369 | base.DisablePools(); | ||
370 | |||
371 | StatsManager.DeregisterStat(m_incomingPacketPoolStat); | ||
372 | |||
373 | // We won't null out the pool to avoid a race condition with code that may be in the middle of using it. | ||
374 | |||
375 | return true; | ||
376 | } | ||
377 | |||
378 | return false; | ||
379 | } | ||
380 | |||
348 | /// <summary> | 381 | /// <summary> |
349 | /// If the outgoing UDP thread times out, then return client that was being processed to help with debugging. | 382 | /// If the outgoing UDP thread times out, then return client that was being processed to help with debugging. |
350 | /// </summary> | 383 | /// </summary> |
@@ -411,6 +444,14 @@ namespace OpenSim.Region.ClientStack.LindenUDP | |||
411 | MainConsole.Instance.Commands.AddCommand( | 444 | MainConsole.Instance.Commands.AddCommand( |
412 | "Debug", | 445 | "Debug", |
413 | false, | 446 | false, |
447 | "debug lludp pool", | ||
448 | "debug lludp pool <on|off>", | ||
449 | "Turn object pooling within the lludp component on or off.", | ||
450 | HandlePoolCommand); | ||
451 | |||
452 | MainConsole.Instance.Commands.AddCommand( | ||
453 | "Debug", | ||
454 | false, | ||
414 | "debug lludp status", | 455 | "debug lludp status", |
415 | "debug lludp status", | 456 | "debug lludp status", |
416 | "Return status of LLUDP packet processing.", | 457 | "Return status of LLUDP packet processing.", |
@@ -451,6 +492,32 @@ namespace OpenSim.Region.ClientStack.LindenUDP | |||
451 | StopOutbound(); | 492 | StopOutbound(); |
452 | } | 493 | } |
453 | 494 | ||
495 | private void HandlePoolCommand(string module, string[] args) | ||
496 | { | ||
497 | if (args.Length != 4) | ||
498 | { | ||
499 | MainConsole.Instance.Output("Usage: debug lludp pool <on|off>"); | ||
500 | return; | ||
501 | } | ||
502 | |||
503 | string enabled = args[3]; | ||
504 | |||
505 | if (enabled == "on") | ||
506 | { | ||
507 | if (EnablePools()) | ||
508 | MainConsole.Instance.OutputFormat("Packet pools enabled on {0}", m_scene.Name); | ||
509 | } | ||
510 | else if (enabled == "off") | ||
511 | { | ||
512 | if (DisablePools()) | ||
513 | MainConsole.Instance.OutputFormat("Packet pools disabled on {0}", m_scene.Name); | ||
514 | } | ||
515 | else | ||
516 | { | ||
517 | MainConsole.Instance.Output("Usage: debug lludp pool <on|off>"); | ||
518 | } | ||
519 | } | ||
520 | |||
454 | private void HandleStatusCommand(string module, string[] args) | 521 | private void HandleStatusCommand(string module, string[] args) |
455 | { | 522 | { |
456 | MainConsole.Instance.OutputFormat( | 523 | MainConsole.Instance.OutputFormat( |
@@ -458,6 +525,8 @@ namespace OpenSim.Region.ClientStack.LindenUDP | |||
458 | 525 | ||
459 | MainConsole.Instance.OutputFormat( | 526 | MainConsole.Instance.OutputFormat( |
460 | "OUT LLUDP packet processing for {0} is {1}", m_scene.Name, IsRunningOutbound ? "enabled" : "disabled"); | 527 | "OUT LLUDP packet processing for {0} is {1}", m_scene.Name, IsRunningOutbound ? "enabled" : "disabled"); |
528 | |||
529 | MainConsole.Instance.OutputFormat("LLUDP pools in {0} are {1}", m_scene.Name, UsePools ? "on" : "off"); | ||
461 | } | 530 | } |
462 | 531 | ||
463 | public bool HandlesRegion(Location x) | 532 | public bool HandlesRegion(Location x) |