avoid data references stuck in packet pools

This commit is contained in:
UbitUmarov
2018-11-25 18:38:37 +00:00
parent 91986445a6
commit d179b2dda1
3 changed files with 48 additions and 48 deletions

View File

@@ -105,7 +105,8 @@ namespace OpenSim.Region.ClientStack.LindenUDP
{
// defaults
RecyclePackets = true;
RecycleDataBlocks = true;
// RecycleDataBlocks = true;
RecycleDataBlocks = false;
}
/// <summary>
@@ -198,60 +199,62 @@ namespace OpenSim.Region.ClientStack.LindenUDP
/// <param name="packet"></param>
public void ReturnPacket(Packet packet)
{
if (RecycleDataBlocks)
{
switch (packet.Type)
{
case PacketType.ObjectUpdate:
ObjectUpdatePacket oup = (ObjectUpdatePacket)packet;
if (!RecyclePackets)
return;
bool trypool = false;
PacketType type = packet.Type;
switch (type)
{
case PacketType.ObjectUpdate:
ObjectUpdatePacket oup = (ObjectUpdatePacket)packet;
if (RecycleDataBlocks)
{
foreach (ObjectUpdatePacket.ObjectDataBlock oupod in oup.ObjectData)
ReturnDataBlock<ObjectUpdatePacket.ObjectDataBlock>(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<ImprovedTerseObjectUpdatePacket.ObjectDataBlock>(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))
{
// List pooling packets here
case PacketType.AgentUpdate:
case PacketType.PacketAck:
case PacketType.ObjectUpdate:
case PacketType.ImprovedTerseObjectUpdate:
lock (pool)
{
PacketType type = packet.Type;
pool[type] = new Stack<Packet>();
}
if (!pool.ContainsKey(type))
{
pool[type] = new Stack<Packet>();
}
if ((pool[type]).Count < 50)
{
// m_log.DebugFormat("[PACKETPOOL]: Pushing {0} packet", type);
pool[type].Push(packet);
}
}
break;
// Other packets wont pool
default:
return;
if ((pool[type]).Count < 50)
{
// m_log.DebugFormat("[PACKETPOOL]: Pushing {0} packet", type);
pool[type].Push(packet);
}
}
}