From d179b2dda1b4a378c18c431d2f51d437c443ce6b Mon Sep 17 00:00:00 2001 From: UbitUmarov Date: Sun, 25 Nov 2018 18:38:37 +0000 Subject: avoid data references stuck in packet pools --- .../Region/ClientStack/Linden/UDP/PacketPool.cs | 85 +++++++++++----------- 1 file changed, 44 insertions(+), 41 deletions(-) (limited to 'OpenSim/Region/ClientStack/Linden/UDP/PacketPool.cs') diff --git a/OpenSim/Region/ClientStack/Linden/UDP/PacketPool.cs b/OpenSim/Region/ClientStack/Linden/UDP/PacketPool.cs index f585bea..9b94a29 100644 --- a/OpenSim/Region/ClientStack/Linden/UDP/PacketPool.cs +++ b/OpenSim/Region/ClientStack/Linden/UDP/PacketPool.cs @@ -105,7 +105,8 @@ namespace OpenSim.Region.ClientStack.LindenUDP { // defaults RecyclePackets = true; - RecycleDataBlocks = true; + // RecycleDataBlocks = true; + RecycleDataBlocks = false; } /// @@ -198,60 +199,62 @@ namespace OpenSim.Region.ClientStack.LindenUDP /// public void ReturnPacket(Packet packet) { - if (RecycleDataBlocks) + if (!RecyclePackets) + return; + + bool trypool = false; + PacketType type = packet.Type; + + switch (type) { - switch (packet.Type) - { - case PacketType.ObjectUpdate: - ObjectUpdatePacket oup = (ObjectUpdatePacket)packet; + case PacketType.ObjectUpdate: + ObjectUpdatePacket oup = (ObjectUpdatePacket)packet; + if (RecycleDataBlocks) + { foreach (ObjectUpdatePacket.ObjectDataBlock oupod in oup.ObjectData) ReturnDataBlock(oupod); + } - oup.ObjectData = null; - break; + oup.ObjectData = null; + trypool = true; + break; - case PacketType.ImprovedTerseObjectUpdate: - ImprovedTerseObjectUpdatePacket itoup = (ImprovedTerseObjectUpdatePacket)packet; + case PacketType.ImprovedTerseObjectUpdate: + ImprovedTerseObjectUpdatePacket itoup = (ImprovedTerseObjectUpdatePacket)packet; + if (RecycleDataBlocks) + { foreach (ImprovedTerseObjectUpdatePacket.ObjectDataBlock itoupod in itoup.ObjectData) ReturnDataBlock(itoupod); + } - itoup.ObjectData = null; - break; - } + itoup.ObjectData = null; + trypool = true; + break; + + case PacketType.AgentUpdate: + case PacketType.PacketAck: + trypool = true; + break; + default: + return; } - if (RecyclePackets) + if(!trypool) + return; + + lock (pool) { - switch (packet.Type) + if (!pool.ContainsKey(type)) + { + pool[type] = new Stack(); + } + + if ((pool[type]).Count < 50) { - // List pooling packets here - case PacketType.AgentUpdate: - case PacketType.PacketAck: - case PacketType.ObjectUpdate: - case PacketType.ImprovedTerseObjectUpdate: - lock (pool) - { - PacketType type = packet.Type; - - if (!pool.ContainsKey(type)) - { - pool[type] = new Stack(); - } - - if ((pool[type]).Count < 50) - { -// m_log.DebugFormat("[PACKETPOOL]: Pushing {0} packet", type); - - pool[type].Push(packet); - } - } - break; - - // Other packets wont pool - default: - return; +// m_log.DebugFormat("[PACKETPOOL]: Pushing {0} packet", type); + pool[type].Push(packet); } } } -- cgit v1.1