Fix the issue that stopped the packet pool from working. Add a mechanism

to recycley data blocs within a packet. Recycle the ObjectUpdate* data
blocks. Speeds up loading even more.
This may mean that the packet pool is now viable.
This commit is contained in:
Melanie Thielker
2009-05-02 00:14:04 +00:00
parent 0f721da5f1
commit ac944def3f
4 changed files with 77 additions and 10 deletions

View File

@@ -34,6 +34,7 @@ using log4net;
namespace OpenSim.Framework
{
public sealed class PacketPool
{
private static readonly ILog m_log = LogManager.GetLogger(MethodBase.GetCurrentMethod().DeclaringType);
@@ -44,6 +45,9 @@ namespace OpenSim.Framework
private readonly Dictionary<PacketType, Stack<Packet>> pool = new Dictionary<PacketType, Stack<Packet>>();
private static Dictionary<Type, List<Object>> DataBlocks =
new Dictionary<Type, List<Object>>();
static PacketPool()
{
}
@@ -136,6 +140,28 @@ namespace OpenSim.Framework
/// <param name="packet"></param>
public void ReturnPacket(Packet packet)
{
switch (packet.Type)
{
case PacketType.ObjectUpdate:
ObjectUpdatePacket oup = (ObjectUpdatePacket)packet;
foreach (ObjectUpdatePacket.ObjectDataBlock oupod in
oup.ObjectData)
ReturnDataBlock<ObjectUpdatePacket.ObjectDataBlock>(oupod);
oup.ObjectData = null;
break;
case PacketType.ImprovedTerseObjectUpdate:
ImprovedTerseObjectUpdatePacket itoup =
(ImprovedTerseObjectUpdatePacket)packet;
foreach (ImprovedTerseObjectUpdatePacket.ObjectDataBlock
itoupod in itoup.ObjectData)
ReturnDataBlock<ImprovedTerseObjectUpdatePacket.ObjectDataBlock>(itoupod);
itoup.ObjectData = null;
break;
}
if (!packetPoolEnabled)
return;
@@ -163,5 +189,45 @@ namespace OpenSim.Framework
return;
}
}
public static T GetDataBlock<T>() where T: new()
{
lock(DataBlocks)
{
if (DataBlocks.ContainsKey(typeof(T)) && DataBlocks[typeof(T)].Count > 0)
{
T block = (T)DataBlocks[typeof(T)][0];
DataBlocks[typeof(T)].RemoveAt(0);
if (block == null)
return new T();
return block;
}
else
{
return new T();
}
}
}
public static void ReturnDataBlock<T>(T block) where T: new()
{
if (block == null)
return;
lock (DataBlocks)
{
if (!DataBlocks.ContainsKey(typeof(T)))
{
List<Object> l = new List<Object>();
l.Add(block);
DataBlocks.Add(typeof(T), l);
}
else
{
if (DataBlocks[typeof(T)].Count < 500)
DataBlocks[typeof(T)].Add(block);
}
}
}
}
}