Make it possible to turn the base UDP object packet pools on and off whilst running via the "debug lludp pool <on|off>" console command. For debug purposes.
This does not currently apply to the higher LLUDP packetpool.integration
							parent
							
								
									4578ff74fe
								
							
						
					
					
						commit
						319ebaca06
					
				| 
						 | 
				
			
			@ -207,7 +207,7 @@ namespace OpenSim.Framework.Monitoring
 | 
			
		|||
                    return false;
 | 
			
		||||
 | 
			
		||||
                newContainer = new Dictionary<string, Stat>(container);
 | 
			
		||||
                newContainer.Remove(stat.UniqueName);
 | 
			
		||||
                newContainer.Remove(stat.ShortName);
 | 
			
		||||
 | 
			
		||||
                newCategory = new Dictionary<string, Dictionary<string, Stat>>(category);
 | 
			
		||||
                newCategory.Remove(stat.Container);
 | 
			
		||||
| 
						 | 
				
			
			@ -278,11 +278,6 @@ namespace OpenSim.Framework.Monitoring
 | 
			
		|||
    /// </summary>
 | 
			
		||||
    public class Stat
 | 
			
		||||
    {
 | 
			
		||||
        /// <summary>
 | 
			
		||||
        /// Unique stat name used for indexing.  Each ShortName in a Category must be unique.
 | 
			
		||||
        /// </summary>
 | 
			
		||||
        public string UniqueName { get; private set; }
 | 
			
		||||
 | 
			
		||||
        /// <summary>
 | 
			
		||||
        /// Category of this stat (e.g. cache, scene, etc).
 | 
			
		||||
        /// </summary>
 | 
			
		||||
| 
						 | 
				
			
			@ -376,13 +371,6 @@ namespace OpenSim.Framework.Monitoring
 | 
			
		|||
                PullAction = pullAction;
 | 
			
		||||
 | 
			
		||||
            Verbosity = verbosity;
 | 
			
		||||
 | 
			
		||||
            UniqueName = GenUniqueName(Container, Category, ShortName);
 | 
			
		||||
        }
 | 
			
		||||
 | 
			
		||||
        public static string GenUniqueName(string container, string category, string shortName)
 | 
			
		||||
        {
 | 
			
		||||
            return string.Format("{0}+{1}+{2}", container, category, shortName);
 | 
			
		||||
        }
 | 
			
		||||
 | 
			
		||||
        public virtual string ToConsoleString()
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -170,6 +170,8 @@ namespace OpenSim.Region.ClientStack.LindenUDP
 | 
			
		|||
 | 
			
		||||
        private Pool<IncomingPacket> m_incomingPacketPool;
 | 
			
		||||
 | 
			
		||||
        private Stat m_incomingPacketPoolStat;
 | 
			
		||||
 | 
			
		||||
        private int m_defaultRTO = 0;
 | 
			
		||||
        private int m_maxRTO = 0;
 | 
			
		||||
        private int m_ackTimeout = 0;
 | 
			
		||||
| 
						 | 
				
			
			@ -214,6 +216,7 @@ namespace OpenSim.Region.ClientStack.LindenUDP
 | 
			
		|||
 | 
			
		||||
            m_circuitManager = circuitManager;
 | 
			
		||||
            int sceneThrottleBps = 0;
 | 
			
		||||
            bool usePools = false;
 | 
			
		||||
 | 
			
		||||
            IConfig config = configSource.Configs["ClientStack.LindenUDP"];
 | 
			
		||||
            if (config != null)
 | 
			
		||||
| 
						 | 
				
			
			@ -246,7 +249,7 @@ namespace OpenSim.Region.ClientStack.LindenUDP
 | 
			
		|||
            {
 | 
			
		||||
                PacketPool.Instance.RecyclePackets = packetConfig.GetBoolean("RecyclePackets", true);
 | 
			
		||||
                PacketPool.Instance.RecycleDataBlocks = packetConfig.GetBoolean("RecycleDataBlocks", true);
 | 
			
		||||
                UsePools = packetConfig.GetBoolean("RecycleBaseUDPPackets", false);
 | 
			
		||||
                usePools = packetConfig.GetBoolean("RecycleBaseUDPPackets", usePools);
 | 
			
		||||
            }
 | 
			
		||||
 | 
			
		||||
            #region BinaryStats
 | 
			
		||||
| 
						 | 
				
			
			@ -277,22 +280,8 @@ namespace OpenSim.Region.ClientStack.LindenUDP
 | 
			
		|||
            m_throttle = new TokenBucket(null, sceneThrottleBps);
 | 
			
		||||
            ThrottleRates = new ThrottleRates(configSource);
 | 
			
		||||
 | 
			
		||||
            if (UsePools)
 | 
			
		||||
            {
 | 
			
		||||
                m_incomingPacketPool = new Pool<IncomingPacket>(() => new IncomingPacket(), 500);
 | 
			
		||||
 | 
			
		||||
                StatsManager.RegisterStat(
 | 
			
		||||
                    new Stat(
 | 
			
		||||
                        "IncomingPacketPoolCount",
 | 
			
		||||
                        "Objects within incoming packet pool",
 | 
			
		||||
                        "The number of objects currently stored within the incoming packet pool",
 | 
			
		||||
                        "",
 | 
			
		||||
                        "clientstack",
 | 
			
		||||
                        "packetpool",
 | 
			
		||||
                        StatType.Pull,
 | 
			
		||||
                        stat => stat.Value = m_incomingPacketPool.Count,
 | 
			
		||||
                        StatVerbosity.Debug));
 | 
			
		||||
            }
 | 
			
		||||
            if (usePools)
 | 
			
		||||
                EnablePools();
 | 
			
		||||
        }
 | 
			
		||||
 | 
			
		||||
        public void Start()
 | 
			
		||||
| 
						 | 
				
			
			@ -345,6 +334,50 @@ namespace OpenSim.Region.ClientStack.LindenUDP
 | 
			
		|||
            base.StopInbound();
 | 
			
		||||
        }
 | 
			
		||||
 | 
			
		||||
        protected override bool EnablePools()
 | 
			
		||||
        {
 | 
			
		||||
            if (!UsePools)
 | 
			
		||||
            {
 | 
			
		||||
                base.EnablePools();
 | 
			
		||||
 | 
			
		||||
                m_incomingPacketPool = new Pool<IncomingPacket>(() => new IncomingPacket(), 500);
 | 
			
		||||
 | 
			
		||||
                m_incomingPacketPoolStat
 | 
			
		||||
                    = new Stat(
 | 
			
		||||
                        "IncomingPacketPoolCount",
 | 
			
		||||
                        "Objects within incoming packet pool",
 | 
			
		||||
                        "The number of objects currently stored within the incoming packet pool",
 | 
			
		||||
                        "",
 | 
			
		||||
                        "clientstack",
 | 
			
		||||
                        "packetpool",
 | 
			
		||||
                        StatType.Pull,
 | 
			
		||||
                        stat => stat.Value = m_incomingPacketPool.Count,
 | 
			
		||||
                        StatVerbosity.Debug);
 | 
			
		||||
 | 
			
		||||
                StatsManager.RegisterStat(m_incomingPacketPoolStat);
 | 
			
		||||
 | 
			
		||||
                return true;
 | 
			
		||||
            }
 | 
			
		||||
 | 
			
		||||
            return false;
 | 
			
		||||
        }
 | 
			
		||||
 | 
			
		||||
        protected override bool DisablePools()
 | 
			
		||||
        {
 | 
			
		||||
            if (UsePools)
 | 
			
		||||
            {
 | 
			
		||||
                base.DisablePools();
 | 
			
		||||
 | 
			
		||||
                StatsManager.DeregisterStat(m_incomingPacketPoolStat);
 | 
			
		||||
 | 
			
		||||
                // We won't null out the pool to avoid a race condition with code that may be in the middle of using it.
 | 
			
		||||
 | 
			
		||||
                return true;
 | 
			
		||||
            }
 | 
			
		||||
 | 
			
		||||
            return false;
 | 
			
		||||
        }
 | 
			
		||||
 | 
			
		||||
        /// <summary>
 | 
			
		||||
        /// If the outgoing UDP thread times out, then return client that was being processed to help with debugging.
 | 
			
		||||
        /// </summary>
 | 
			
		||||
| 
						 | 
				
			
			@ -408,6 +441,14 @@ namespace OpenSim.Region.ClientStack.LindenUDP
 | 
			
		|||
                    + "all - stop in and outbound processing.\n",
 | 
			
		||||
                HandleStopCommand);
 | 
			
		||||
 | 
			
		||||
            MainConsole.Instance.Commands.AddCommand(
 | 
			
		||||
                "Debug",
 | 
			
		||||
                false,
 | 
			
		||||
                "debug lludp pool",
 | 
			
		||||
                "debug lludp pool <on|off>",
 | 
			
		||||
                "Turn object pooling within the lludp component on or off.",
 | 
			
		||||
                HandlePoolCommand);
 | 
			
		||||
 | 
			
		||||
            MainConsole.Instance.Commands.AddCommand(
 | 
			
		||||
                "Debug",
 | 
			
		||||
                false,
 | 
			
		||||
| 
						 | 
				
			
			@ -451,6 +492,32 @@ namespace OpenSim.Region.ClientStack.LindenUDP
 | 
			
		|||
                StopOutbound();
 | 
			
		||||
        }
 | 
			
		||||
 | 
			
		||||
        private void HandlePoolCommand(string module, string[] args)
 | 
			
		||||
        {
 | 
			
		||||
            if (args.Length != 4)
 | 
			
		||||
            {
 | 
			
		||||
                MainConsole.Instance.Output("Usage: debug lludp pool <on|off>");
 | 
			
		||||
                return;
 | 
			
		||||
            }
 | 
			
		||||
 | 
			
		||||
            string enabled = args[3];
 | 
			
		||||
 | 
			
		||||
            if (enabled == "on")
 | 
			
		||||
            {
 | 
			
		||||
                if (EnablePools())
 | 
			
		||||
                    MainConsole.Instance.OutputFormat("Packet pools enabled on {0}", m_scene.Name);
 | 
			
		||||
            }
 | 
			
		||||
            else if (enabled == "off")
 | 
			
		||||
            {
 | 
			
		||||
                if (DisablePools())
 | 
			
		||||
                    MainConsole.Instance.OutputFormat("Packet pools disabled on {0}", m_scene.Name);
 | 
			
		||||
            }
 | 
			
		||||
            else
 | 
			
		||||
            {
 | 
			
		||||
                MainConsole.Instance.Output("Usage: debug lludp pool <on|off>");
 | 
			
		||||
            }
 | 
			
		||||
        }
 | 
			
		||||
 | 
			
		||||
        private void HandleStatusCommand(string module, string[] args)
 | 
			
		||||
        {
 | 
			
		||||
            MainConsole.Instance.OutputFormat(
 | 
			
		||||
| 
						 | 
				
			
			@ -458,6 +525,8 @@ namespace OpenSim.Region.ClientStack.LindenUDP
 | 
			
		|||
 | 
			
		||||
            MainConsole.Instance.OutputFormat(
 | 
			
		||||
                "OUT LLUDP packet processing for {0} is {1}", m_scene.Name, IsRunningOutbound ? "enabled" : "disabled");
 | 
			
		||||
 | 
			
		||||
            MainConsole.Instance.OutputFormat("LLUDP pools in {0} are {1}", m_scene.Name, UsePools ? "on" : "off");
 | 
			
		||||
        }
 | 
			
		||||
 | 
			
		||||
        public bool HandlesRegion(Location x)
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -77,6 +77,8 @@ namespace OpenMetaverse
 | 
			
		|||
        /// <remarks>If IsRunningOut = false, then any request to send a packet is simply dropped.</remarks>
 | 
			
		||||
        public bool IsRunningOutbound { get; private set; }
 | 
			
		||||
 | 
			
		||||
        private Stat m_poolCountStat;
 | 
			
		||||
 | 
			
		||||
        /// <summary>
 | 
			
		||||
        /// Default constructor
 | 
			
		||||
        /// </summary>
 | 
			
		||||
| 
						 | 
				
			
			@ -107,27 +109,6 @@ namespace OpenMetaverse
 | 
			
		|||
        /// necessary</remarks>
 | 
			
		||||
        public void StartInbound(int recvBufferSize, bool asyncPacketHandling)
 | 
			
		||||
        {
 | 
			
		||||
            if (UsePools)
 | 
			
		||||
            {
 | 
			
		||||
                m_pool = new Pool<UDPPacketBuffer>(() => new UDPPacketBuffer(), 500);
 | 
			
		||||
 | 
			
		||||
                StatsManager.RegisterStat(
 | 
			
		||||
                    new Stat(
 | 
			
		||||
                        "UDPPacketBufferPoolCount",
 | 
			
		||||
                        "Objects within the UDPPacketBuffer pool",
 | 
			
		||||
                        "The number of objects currently stored within the UDPPacketBuffer pool",
 | 
			
		||||
                        "",
 | 
			
		||||
                        "clientstack",
 | 
			
		||||
                        "packetpool",
 | 
			
		||||
                        StatType.Pull,
 | 
			
		||||
                        stat => stat.Value = m_pool.Count,
 | 
			
		||||
                        StatVerbosity.Debug));
 | 
			
		||||
            }
 | 
			
		||||
            else
 | 
			
		||||
            {
 | 
			
		||||
                m_pool = null;
 | 
			
		||||
            }
 | 
			
		||||
 | 
			
		||||
            m_asyncPacketHandling = asyncPacketHandling;
 | 
			
		||||
 | 
			
		||||
            if (!IsRunningInbound)
 | 
			
		||||
| 
						 | 
				
			
			@ -197,6 +178,49 @@ namespace OpenMetaverse
 | 
			
		|||
            IsRunningOutbound = false;
 | 
			
		||||
        }
 | 
			
		||||
 | 
			
		||||
        protected virtual bool EnablePools()
 | 
			
		||||
        {
 | 
			
		||||
            if (!UsePools)
 | 
			
		||||
            {
 | 
			
		||||
                m_pool = new Pool<UDPPacketBuffer>(() => new UDPPacketBuffer(), 500);
 | 
			
		||||
 | 
			
		||||
                m_poolCountStat
 | 
			
		||||
                    = new Stat(
 | 
			
		||||
                        "UDPPacketBufferPoolCount",
 | 
			
		||||
                        "Objects within the UDPPacketBuffer pool",
 | 
			
		||||
                        "The number of objects currently stored within the UDPPacketBuffer pool",
 | 
			
		||||
                        "",
 | 
			
		||||
                        "clientstack",
 | 
			
		||||
                        "packetpool",
 | 
			
		||||
                        StatType.Pull,
 | 
			
		||||
                        stat => stat.Value = m_pool.Count,
 | 
			
		||||
                        StatVerbosity.Debug);
 | 
			
		||||
 | 
			
		||||
                StatsManager.RegisterStat(m_poolCountStat);
 | 
			
		||||
 | 
			
		||||
                UsePools = true;
 | 
			
		||||
 | 
			
		||||
                return true;
 | 
			
		||||
            }
 | 
			
		||||
 | 
			
		||||
            return false;
 | 
			
		||||
        }
 | 
			
		||||
 | 
			
		||||
        protected virtual bool DisablePools()
 | 
			
		||||
        {
 | 
			
		||||
            if (UsePools)
 | 
			
		||||
            {
 | 
			
		||||
                UsePools = false;
 | 
			
		||||
                StatsManager.DeregisterStat(m_poolCountStat);
 | 
			
		||||
 | 
			
		||||
                // We won't null out the pool to avoid a race condition with code that may be in the middle of using it.
 | 
			
		||||
 | 
			
		||||
                return true;
 | 
			
		||||
            }
 | 
			
		||||
 | 
			
		||||
            return false;
 | 
			
		||||
        }
 | 
			
		||||
 | 
			
		||||
        private void AsyncBeginReceive()
 | 
			
		||||
        {
 | 
			
		||||
            UDPPacketBuffer buf;
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
		Loading…
	
		Reference in New Issue