mirror of
https://github.com/opensim/opensim.git
synced 2026-08-07 17:55:48 +08:00
avoid data references stuck in packet pools
This commit is contained in:
@@ -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);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user