From 79496381fc68cbd30ff5a95d1f05fcb18c6b1a93 Mon Sep 17 00:00:00 2001
From: Adam Johnson
Date: Fri, 28 Dec 2007 08:51:39 +0000
Subject: Patch from Johan: LibSL updated to the latest revision (1568) and all
packets are now recycled to improve performance and memory usage.
---
OpenSim/Framework/ClientManager.cs | 26 +--
OpenSim/Framework/PacketPool.cs | 131 +++++++++++++++
OpenSim/Region/ClientStack/ClientView.cs | 175 ++++++++++++---------
OpenSim/Region/ClientStack/UDPServer.cs | 100 +-----------
OpenSim/Region/Environment/LandManagement/Land.cs | 19 ++-
.../Environment/LandManagement/LandManager.cs | 5 +-
.../Environment/Scenes/Scene.PacketHandlers.cs | 8 +-
OpenSim/Region/Environment/Scenes/Scene.cs | 71 +++++----
.../Region/Environment/Scenes/SceneObjectGroup.cs | 13 +-
.../Region/Environment/Scenes/SimStatsReporter.cs | 6 +-
bin/libsecondlife.dll | Bin 1560576 -> 5317632 bytes
11 files changed, 310 insertions(+), 244 deletions(-)
create mode 100644 OpenSim/Framework/PacketPool.cs
diff --git a/OpenSim/Framework/ClientManager.cs b/OpenSim/Framework/ClientManager.cs
index da60ed7..181000c 100644
--- a/OpenSim/Framework/ClientManager.cs
+++ b/OpenSim/Framework/ClientManager.cs
@@ -26,11 +26,9 @@
*
*/
-using System;
using System.Collections.Generic;
using libsecondlife;
using libsecondlife.Packets;
-using OpenSim.Framework.Console;
namespace OpenSim.Framework
{
@@ -42,6 +40,7 @@ namespace OpenSim.Framework
public void ForEachClient(ForEachClientDelegate whatToDo)
{
+
// Wasteful, I know
IClientAPI[] LocalClients = new IClientAPI[0];
lock (m_clients)
@@ -56,11 +55,9 @@ namespace OpenSim.Framework
{
whatToDo(LocalClients[i]);
}
- catch (Exception e)
+ catch (System.Exception e)
{
- MainLog.Instance.Warn("CLIENT",
- "Unable to do ForEachClient for one of the clients" + "\n Reason: " +
- e.ToString());
+ OpenSim.Framework.Console.MainLog.Instance.Warn("CLIENT", "Unable to do ForEachClient for one of the clients" + "\n Reason: " + e.ToString());
}
}
}
@@ -110,19 +107,20 @@ namespace OpenSim.Framework
IClientAPI client;
try
{
+
if (m_clients.TryGetValue(circuits[i], out client))
{
Remove(client.CircuitCode);
client.Close(false);
}
}
- catch (Exception e)
+ catch (System.Exception e)
{
- MainLog.Instance.Error("CLIENT",
- "Unable to shutdown circuit for: " + agentId.ToString() + "\n Reason: " +
- e.ToString());
+ OpenSim.Framework.Console.MainLog.Instance.Error("CLIENT", "Unable to shutdown circuit for: " + agentId.ToString() + "\n Reason: " + e.ToString());
}
}
+
+
}
private uint[] GetAllCircuits(LLUUID agentId)
@@ -137,7 +135,7 @@ namespace OpenSim.Framework
}
- for (int i = 0; i < LocalClients.Length; i++)
+ for (int i = 0; i < LocalClients.Length; i++ )
{
if (LocalClients[i].AgentId == agentId)
{
@@ -150,7 +148,8 @@ namespace OpenSim.Framework
public void ViewerEffectHandler(IClientAPI sender, ViewerEffectPacket.EffectBlock[] effectBlock)
{
- ViewerEffectPacket packet = new ViewerEffectPacket();
+ ViewerEffectPacket packet = (ViewerEffectPacket) PacketPool.Instance.GetPacket(PacketType.ViewerEffect);
+ // TODO: don't create new blocks if recycling an old packet
packet.Effect = effectBlock;
// Wasteful, I know
@@ -170,6 +169,7 @@ namespace OpenSim.Framework
packet.AgentData.SessionID = LocalClients[i].SessionId;
LocalClients[i].OutPacket(packet, ThrottleOutPacketType.Task);
}
+
}
}
@@ -178,4 +178,4 @@ namespace OpenSim.Framework
return m_clients.TryGetValue(circuitId, out user);
}
}
-}
\ No newline at end of file
+}
diff --git a/OpenSim/Framework/PacketPool.cs b/OpenSim/Framework/PacketPool.cs
new file mode 100644
index 0000000..2b33d0b
--- /dev/null
+++ b/OpenSim/Framework/PacketPool.cs
@@ -0,0 +1,131 @@
+/*
+* Copyright (c) Contributors, http://opensimulator.org/
+* See CONTRIBUTORS.TXT for a full list of copyright holders.
+*
+* Redistribution and use in source and binary forms, with or without
+* modification, are permitted provided that the following conditions are met:
+* * Redistributions of source code must retain the above copyright
+* notice, this list of conditions and the following disclaimer.
+* * Redistributions in binary form must reproduce the above copyright
+* notice, this list of conditions and the following disclaimer in the
+* documentation and/or other materials provided with the distribution.
+* * Neither the name of the OpenSim Project nor the
+* names of its contributors may be used to endorse or promote products
+* derived from this software without specific prior written permission.
+*
+* THIS SOFTWARE IS PROVIDED BY THE DEVELOPERS ``AS IS'' AND ANY
+* EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
+* WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
+* DISCLAIMED. IN NO EVENT SHALL THE CONTRIBUTORS BE LIABLE FOR ANY
+* DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
+* (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
+* LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
+* ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+* (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
+* SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+*
+*/
+using System;
+using System.Collections;
+using libsecondlife.Packets;
+
+namespace OpenSim.Framework
+{
+ public sealed class PacketPool
+ {
+ // Set up a thread-safe singleton pattern
+ static PacketPool()
+ {
+ }
+
+ private static readonly PacketPool instance = new PacketPool();
+
+ public static PacketPool Instance
+ {
+ get { return instance; }
+ }
+
+ private Hashtable pool = new Hashtable();
+
+ public Packet GetPacket(PacketType type)
+ {
+ Packet packet = null;
+
+ lock (pool)
+ {
+ if (pool[type] == null || ((Stack) pool[type]).Count == 0)
+ {
+ // Creating a new packet if we cannot reuse an old package
+ packet = Packet.BuildPacket(type);
+ }
+ else
+ {
+ // Recycle old packages
+ packet = (Packet) ((Stack) pool[type]).Pop();
+ }
+ }
+
+ return packet;
+ }
+
+ private byte[] decoded_header = new byte[10];
+ private PacketType GetType(byte[] bytes)
+ {
+ ushort id;
+ libsecondlife.PacketFrequency freq;
+
+ Buffer.BlockCopy(bytes, 0, decoded_header, 0, 10);
+
+ if((bytes[0] & libsecondlife.Helpers.MSG_ZEROCODED)!=0)
+ {
+ libsecondlife.Helpers.ZeroDecodeCommand(bytes, decoded_header);
+ }
+
+ if (decoded_header[6] == 0xFF)
+ {
+ if (decoded_header[7] == 0xFF)
+ {
+ id = (ushort)((decoded_header[8] << 8) + decoded_header[9]);
+ freq = libsecondlife.PacketFrequency.Low;
+ }
+ else
+ {
+ id = (ushort)decoded_header[7];
+ freq = libsecondlife.PacketFrequency.Medium;
+ }
+ }
+ else
+ {
+ id = (ushort)decoded_header[6];
+ freq = libsecondlife.PacketFrequency.High;
+ }
+
+ return Packet.GetType(id, freq);
+ }
+
+ public Packet GetPacket(byte[] bytes, ref int packetEnd, byte[] zeroBuffer)
+ {
+ PacketType type = GetType(bytes);
+
+ int i = 0;
+ Packet packet = GetPacket(type);
+ packet.FromBytes(bytes, ref i, ref packetEnd, zeroBuffer);
+ return packet;
+ }
+
+ public void ReturnPacket(Packet packet)
+ {
+ lock (pool)
+ {
+ PacketType type = packet.Type;
+
+ if (pool[type] == null)
+ {
+ pool[type] = new Stack();
+ }
+
+ ((Stack) pool[type]).Push(packet);
+ }
+ }
+ }
+}
diff --git a/OpenSim/Region/ClientStack/ClientView.cs b/OpenSim/Region/ClientStack/ClientView.cs
index dcb1a47..aed2c29 100644
--- a/OpenSim/Region/ClientStack/ClientView.cs
+++ b/OpenSim/Region/ClientStack/ClientView.cs
@@ -66,6 +66,7 @@ namespace OpenSim.Region.ClientStack
private int m_packetsReceived = 0;
private int m_probesWithNoIngressPackets = 0;
private int m_lastPacketsReceived = 0;
+ private byte[] ZeroOutBuffer = new byte[4096];
private readonly Encoding m_encoding = Encoding.ASCII;
private readonly LLUUID m_agentId;
@@ -215,7 +216,7 @@ namespace OpenSim.Region.ClientStack
{
m_scene.RemoveClient(AgentId);
// Send the STOP packet
- DisableSimulatorPacket disable = new DisableSimulatorPacket();
+ DisableSimulatorPacket disable = (DisableSimulatorPacket) PacketPool.Instance.GetPacket(PacketType.DisableSimulator);
OutPacket(disable, ThrottleOutPacketType.Task);
@@ -256,7 +257,7 @@ namespace OpenSim.Region.ClientStack
public void Kick(string message)
{
- KickUserPacket kupack = new KickUserPacket();
+ KickUserPacket kupack = (KickUserPacket) PacketPool.Instance.GetPacket(PacketType.KickUser);
kupack.UserInfo.AgentID = AgentId;
kupack.UserInfo.SessionID = SessionId;
kupack.TargetBlock.TargetIP = (uint) 0;
@@ -558,8 +559,7 @@ namespace OpenSim.Region.ClientStack
///
public void SendRegionHandshake(RegionInfo regionInfo)
{
- RegionHandshakePacket handshake =
- (RegionHandshakePacket) PacketPool.Instance.GetPacket(PacketType.RegionHandshake);
+ RegionHandshakePacket handshake = (RegionHandshakePacket) PacketPool.Instance.GetPacket(PacketType.RegionHandshake);
handshake.RegionInfo.BillableFactor = regionInfo.EstateSettings.billableFactor;
handshake.RegionInfo.IsEstateManager = false;
@@ -596,7 +596,7 @@ namespace OpenSim.Region.ClientStack
///
public void MoveAgentIntoRegion(RegionInfo regInfo, LLVector3 pos, LLVector3 look)
{
- AgentMovementCompletePacket mov = new AgentMovementCompletePacket();
+ AgentMovementCompletePacket mov = (AgentMovementCompletePacket) PacketPool.Instance.GetPacket(PacketType.AgentMovementComplete);
mov.SimData.ChannelVersion = m_channelVersion;
mov.AgentData.SessionID = m_sessionId;
mov.AgentData.AgentID = AgentId;
@@ -631,7 +631,7 @@ namespace OpenSim.Region.ClientStack
public void SendChatMessage(byte[] message, byte type, LLVector3 fromPos, string fromName, LLUUID fromAgentID)
{
- ChatFromSimulatorPacket reply = new ChatFromSimulatorPacket();
+ ChatFromSimulatorPacket reply = (ChatFromSimulatorPacket) PacketPool.Instance.GetPacket(PacketType.ChatFromSimulator);
reply.ChatData.Audible = 1;
reply.ChatData.Message = message;
reply.ChatData.ChatType = type;
@@ -652,7 +652,7 @@ namespace OpenSim.Region.ClientStack
public void SendInstantMessage(LLUUID fromAgent, LLUUID fromAgentSession, string message, LLUUID toAgent,
LLUUID imSessionID, string fromName, byte dialog, uint timeStamp)
{
- ImprovedInstantMessagePacket msg = new ImprovedInstantMessagePacket();
+ ImprovedInstantMessagePacket msg = (ImprovedInstantMessagePacket) PacketPool.Instance.GetPacket(PacketType.ImprovedInstantMessage);
msg.AgentData.AgentID = fromAgent;
msg.AgentData.SessionID = fromAgentSession;
msg.MessageBlock.FromAgentName = Helpers.StringToField(fromName);
@@ -740,7 +740,8 @@ namespace OpenSim.Region.ClientStack
IPAddress neighbourIP = neighbourEndPoint.Address;
ushort neighbourPort = (ushort) neighbourEndPoint.Port;
- EnableSimulatorPacket enablesimpacket = new EnableSimulatorPacket();
+ EnableSimulatorPacket enablesimpacket = (EnableSimulatorPacket) PacketPool.Instance.GetPacket(PacketType.EnableSimulator);
+ // TODO: don't create new blocks if recycling an old packet
enablesimpacket.SimulatorInfo = new EnableSimulatorPacket.SimulatorInfoBlock();
enablesimpacket.SimulatorInfo.Handle = neighbourHandle;
@@ -776,7 +777,8 @@ namespace OpenSim.Region.ClientStack
{
LLVector3 look = new LLVector3(lookAt.X*10, lookAt.Y*10, lookAt.Z*10);
- CrossedRegionPacket newSimPack = new CrossedRegionPacket();
+ CrossedRegionPacket newSimPack = (CrossedRegionPacket) PacketPool.Instance.GetPacket(PacketType.CrossedRegion);
+ // TODO: don't create new blocks if recycling an old packet
newSimPack.AgentData = new CrossedRegionPacket.AgentDataBlock();
newSimPack.AgentData.AgentID = AgentId;
newSimPack.AgentData.SessionID = m_sessionId;
@@ -798,7 +800,8 @@ namespace OpenSim.Region.ClientStack
public void SendMapBlock(List mapBlocks)
{
- MapBlockReplyPacket mapReply = new MapBlockReplyPacket();
+ MapBlockReplyPacket mapReply = (MapBlockReplyPacket) PacketPool.Instance.GetPacket(PacketType.MapBlockReply);
+ // TODO: don't create new blocks if recycling an old packet
mapReply.AgentData.AgentID = AgentId;
mapReply.Data = new MapBlockReplyPacket.DataBlock[mapBlocks.Count];
mapReply.AgentData.Flags = 0;
@@ -820,7 +823,7 @@ namespace OpenSim.Region.ClientStack
public void SendLocalTeleport(LLVector3 position, LLVector3 lookAt, uint flags)
{
- TeleportLocalPacket tpLocal = new TeleportLocalPacket();
+ TeleportLocalPacket tpLocal = (TeleportLocalPacket) PacketPool.Instance.GetPacket(PacketType.TeleportLocal);
tpLocal.Info.AgentID = AgentId;
tpLocal.Info.TeleportFlags = flags;
tpLocal.Info.LocationID = 2;
@@ -832,7 +835,7 @@ namespace OpenSim.Region.ClientStack
public void SendRegionTeleport(ulong regionHandle, byte simAccess, IPEndPoint newRegionEndPoint, uint locationID,
uint flags, string capsURL)
{
- TeleportFinishPacket teleport = new TeleportFinishPacket();
+ TeleportFinishPacket teleport = (TeleportFinishPacket) PacketPool.Instance.GetPacket(PacketType.TeleportFinish);
teleport.Info.AgentID = AgentId;
teleport.Info.RegionHandle = regionHandle;
teleport.Info.SimAccess = simAccess;
@@ -858,7 +861,7 @@ namespace OpenSim.Region.ClientStack
///
public void SendTeleportFailed()
{
- TeleportFailedPacket tpFailed = new TeleportFailedPacket();
+ TeleportFailedPacket tpFailed = (TeleportFailedPacket) PacketPool.Instance.GetPacket(PacketType.TeleportFailed);
tpFailed.Info.AgentID = AgentId;
tpFailed.Info.Reason = Helpers.StringToField("unknown failure of teleport");
OutPacket(tpFailed, ThrottleOutPacketType.Task);
@@ -869,14 +872,14 @@ namespace OpenSim.Region.ClientStack
///
public void SendTeleportLocationStart()
{
- TeleportStartPacket tpStart = new TeleportStartPacket();
+ TeleportStartPacket tpStart = (TeleportStartPacket) PacketPool.Instance.GetPacket(PacketType.TeleportStart);
tpStart.Info.TeleportFlags = 16; // Teleport via location
OutPacket(tpStart, ThrottleOutPacketType.Task);
}
public void SendMoneyBalance(LLUUID transaction, bool success, byte[] description, int balance)
{
- MoneyBalanceReplyPacket money = new MoneyBalanceReplyPacket();
+ MoneyBalanceReplyPacket money = (MoneyBalanceReplyPacket) PacketPool.Instance.GetPacket(PacketType.MoneyBalanceReply);
money.MoneyData.AgentID = AgentId;
money.MoneyData.TransactionID = transaction;
money.MoneyData.TransactionSuccess = success;
@@ -887,7 +890,7 @@ namespace OpenSim.Region.ClientStack
public void SendStartPingCheck(byte seq)
{
- StartPingCheckPacket pc = new StartPingCheckPacket();
+ StartPingCheckPacket pc = (StartPingCheckPacket) PacketPool.Instance.GetPacket(PacketType.StartPingCheck);
pc.PingID.PingID = seq;
pc.Header.Reliable = false;
OutPacket(pc, ThrottleOutPacketType.Task);
@@ -895,7 +898,8 @@ namespace OpenSim.Region.ClientStack
public void SendKillObject(ulong regionHandle, uint localID)
{
- KillObjectPacket kill = new KillObjectPacket();
+ KillObjectPacket kill = (KillObjectPacket) PacketPool.Instance.GetPacket(PacketType.KillObject);
+ // TODO: don't create new blocks if recycling an old packet
kill.ObjectData = new KillObjectPacket.ObjectDataBlock[1];
kill.ObjectData[0] = new KillObjectPacket.ObjectDataBlock();
kill.ObjectData[0].ID = localID;
@@ -1088,7 +1092,7 @@ namespace OpenSim.Region.ClientStack
private InventoryDescendentsPacket CreateInventoryDescendentsPacket(LLUUID ownerID, LLUUID folderID)
{
- InventoryDescendentsPacket descend = new InventoryDescendentsPacket();
+ InventoryDescendentsPacket descend = (InventoryDescendentsPacket) PacketPool.Instance.GetPacket(PacketType.InventoryDescendents);
descend.AgentData.AgentID = AgentId;
descend.AgentData.OwnerID = ownerID;
descend.AgentData.FolderID = folderID;
@@ -1101,7 +1105,8 @@ namespace OpenSim.Region.ClientStack
{
Encoding enc = Encoding.ASCII;
uint FULL_MASK_PERMISSIONS = 2147483647;
- FetchInventoryReplyPacket inventoryReply = new FetchInventoryReplyPacket();
+ FetchInventoryReplyPacket inventoryReply = (FetchInventoryReplyPacket) PacketPool.Instance.GetPacket(PacketType.FetchInventoryReply);
+ // TODO: don't create new blocks if recycling an old packet
inventoryReply.AgentData.AgentID = AgentId;
inventoryReply.InventoryData = new FetchInventoryReplyPacket.InventoryDataBlock[1];
inventoryReply.InventoryData[0] = new FetchInventoryReplyPacket.InventoryDataBlock();
@@ -1142,7 +1147,8 @@ namespace OpenSim.Region.ClientStack
{
Encoding enc = Encoding.ASCII;
uint FULL_MASK_PERMISSIONS = 2147483647;
- UpdateCreateInventoryItemPacket InventoryReply = new UpdateCreateInventoryItemPacket();
+ UpdateCreateInventoryItemPacket InventoryReply = (UpdateCreateInventoryItemPacket) PacketPool.Instance.GetPacket(PacketType.UpdateCreateInventoryItem);
+ // TODO: don't create new blocks if recycling an old packet
InventoryReply.AgentData.AgentID = AgentId;
InventoryReply.AgentData.SimApproved = true;
InventoryReply.InventoryData = new UpdateCreateInventoryItemPacket.InventoryDataBlock[1];
@@ -1180,7 +1186,8 @@ namespace OpenSim.Region.ClientStack
public void SendRemoveInventoryItem(LLUUID itemID)
{
- RemoveInventoryItemPacket remove = new RemoveInventoryItemPacket();
+ RemoveInventoryItemPacket remove = (RemoveInventoryItemPacket) PacketPool.Instance.GetPacket(PacketType.RemoveInventoryItem);
+ // TODO: don't create new blocks if recycling an old packet
remove.AgentData.AgentID = AgentId;
remove.AgentData.SessionID = m_sessionId;
remove.InventoryData = new RemoveInventoryItemPacket.InventoryDataBlock[1];
@@ -1192,7 +1199,7 @@ namespace OpenSim.Region.ClientStack
public void SendTaskInventory(LLUUID taskID, short serial, byte[] fileName)
{
- ReplyTaskInventoryPacket replytask = new ReplyTaskInventoryPacket();
+ ReplyTaskInventoryPacket replytask = (ReplyTaskInventoryPacket) PacketPool.Instance.GetPacket(PacketType.ReplyTaskInventory);
replytask.InventoryData.TaskID = taskID;
replytask.InventoryData.Serial = serial;
replytask.InventoryData.Filename = fileName;
@@ -1201,7 +1208,7 @@ namespace OpenSim.Region.ClientStack
public void SendXferPacket(ulong xferID, uint packet, byte[] data)
{
- SendXferPacketPacket sendXfer = new SendXferPacketPacket();
+ SendXferPacketPacket sendXfer = (SendXferPacketPacket) PacketPool.Instance.GetPacket(PacketType.SendXferPacket);
sendXfer.XferID.ID = xferID;
sendXfer.XferID.Packet = packet;
sendXfer.DataPacket.Data = data;
@@ -1219,7 +1226,7 @@ namespace OpenSim.Region.ClientStack
///
public void SendAlertMessage(string message)
{
- AlertMessagePacket alertPack = new AlertMessagePacket();
+ AlertMessagePacket alertPack = (AlertMessagePacket) PacketPool.Instance.GetPacket(PacketType.AlertMessage);
alertPack.AlertData.Message = Helpers.StringToField(message);
OutPacket(alertPack, ThrottleOutPacketType.Task);
}
@@ -1231,7 +1238,7 @@ namespace OpenSim.Region.ClientStack
///
public void SendAgentAlertMessage(string message, bool modal)
{
- AgentAlertMessagePacket alertPack = new AgentAlertMessagePacket();
+ AgentAlertMessagePacket alertPack = (AgentAlertMessagePacket) PacketPool.Instance.GetPacket(PacketType.AgentAlertMessage);
alertPack.AgentData.AgentID = AgentId;
alertPack.AlertData.Message = Helpers.StringToField(message);
alertPack.AlertData.Modal = modal;
@@ -1241,7 +1248,7 @@ namespace OpenSim.Region.ClientStack
public void SendLoadURL(string objectname, LLUUID objectID, LLUUID ownerID, bool groupOwned, string message,
string url)
{
- LoadURLPacket loadURL = new LoadURLPacket();
+ LoadURLPacket loadURL = (LoadURLPacket) PacketPool.Instance.GetPacket(PacketType.LoadURL);
loadURL.Data.ObjectName = Helpers.StringToField(objectname);
loadURL.Data.ObjectID = objectID;
loadURL.Data.OwnerID = ownerID;
@@ -1255,7 +1262,8 @@ namespace OpenSim.Region.ClientStack
public void SendPreLoadSound(LLUUID objectID, LLUUID ownerID, LLUUID soundID)
{
- PreloadSoundPacket preSound = new PreloadSoundPacket();
+ PreloadSoundPacket preSound = (PreloadSoundPacket) PacketPool.Instance.GetPacket(PacketType.PreloadSound);
+ // TODO: don't create new blocks if recycling an old packet
preSound.DataBlock = new PreloadSoundPacket.DataBlockBlock[1];
preSound.DataBlock[0] = new PreloadSoundPacket.DataBlockBlock();
preSound.DataBlock[0].ObjectID = objectID;
@@ -1266,7 +1274,7 @@ namespace OpenSim.Region.ClientStack
public void SendPlayAttachedSound(LLUUID soundID, LLUUID objectID, LLUUID ownerID, float gain, byte flags)
{
- AttachedSoundPacket sound = new AttachedSoundPacket();
+ AttachedSoundPacket sound = (AttachedSoundPacket) PacketPool.Instance.GetPacket(PacketType.AttachedSound);
sound.DataBlock.SoundID = soundID;
sound.DataBlock.ObjectID = objectID;
sound.DataBlock.OwnerID = ownerID;
@@ -1278,7 +1286,7 @@ namespace OpenSim.Region.ClientStack
public void SendSunPos(LLVector3 sunPos, LLVector3 sunVel)
{
- SimulatorViewerTimeMessagePacket viewertime = new SimulatorViewerTimeMessagePacket();
+ SimulatorViewerTimeMessagePacket viewertime = (SimulatorViewerTimeMessagePacket) PacketPool.Instance.GetPacket(PacketType.SimulatorViewerTimeMessage);
viewertime.TimeInfo.SunDirection = sunPos;
viewertime.TimeInfo.SunAngVelocity = sunVel;
viewertime.TimeInfo.UsecSinceStart = (ulong) Util.UnixTimeSinceEpoch();
@@ -1288,7 +1296,7 @@ namespace OpenSim.Region.ClientStack
public void SendViewerTime(int phase)
{
Console.WriteLine("SunPhase: {0}", phase);
- SimulatorViewerTimeMessagePacket viewertime = new SimulatorViewerTimeMessagePacket();
+ SimulatorViewerTimeMessagePacket viewertime = (SimulatorViewerTimeMessagePacket) PacketPool.Instance.GetPacket(PacketType.SimulatorViewerTimeMessage);
//viewertime.TimeInfo.SecPerDay = 86400;
//viewertime.TimeInfo.SecPerYear = 31536000;
viewertime.TimeInfo.SecPerDay = 1000;
@@ -1337,7 +1345,7 @@ namespace OpenSim.Region.ClientStack
string flAbout, uint flags, LLUUID flImageID, LLUUID imageID, string profileURL,
LLUUID partnerID)
{
- AvatarPropertiesReplyPacket avatarReply = new AvatarPropertiesReplyPacket();
+ AvatarPropertiesReplyPacket avatarReply = (AvatarPropertiesReplyPacket) PacketPool.Instance.GetPacket(PacketType.AvatarPropertiesReply);
avatarReply.AgentData.AgentID = AgentId;
avatarReply.AgentData.AvatarID = avatarID;
avatarReply.PropertiesData.AboutText = Helpers.StringToField(aboutText);
@@ -1362,11 +1370,12 @@ namespace OpenSim.Region.ClientStack
///
public void SendWearables(AvatarWearable[] wearables, int serial)
{
- AgentWearablesUpdatePacket aw = new AgentWearablesUpdatePacket();
+ AgentWearablesUpdatePacket aw = (AgentWearablesUpdatePacket) PacketPool.Instance.GetPacket(PacketType.AgentWearablesUpdate);
aw.AgentData.AgentID = AgentId;
aw.AgentData.SerialNum = (uint) serial;
aw.AgentData.SessionID = m_sessionId;
+ // TODO: don't create new blocks if recycling an old packet
aw.WearableData = new AgentWearablesUpdatePacket.WearableDataBlock[13];
AgentWearablesUpdatePacket.WearableDataBlock awb;
for (int i = 0; i < wearables.Length; i++)
@@ -1389,7 +1398,8 @@ namespace OpenSim.Region.ClientStack
///
public void SendAppearance(LLUUID agentID, byte[] visualParams, byte[] textureEntry)
{
- AvatarAppearancePacket avp = new AvatarAppearancePacket();
+ AvatarAppearancePacket avp = (AvatarAppearancePacket) PacketPool.Instance.GetPacket(PacketType.AvatarAppearance);
+ // TODO: don't create new blocks if recycling an old packet
avp.VisualParam = new AvatarAppearancePacket.VisualParamBlock[218];
avp.ObjectData.TextureEntry = textureEntry;
@@ -1408,7 +1418,8 @@ namespace OpenSim.Region.ClientStack
public void SendAnimations(LLUUID[] animations, int[] seqs, LLUUID sourceAgentId)
{
- AvatarAnimationPacket ani = new AvatarAnimationPacket();
+ AvatarAnimationPacket ani = (AvatarAnimationPacket) PacketPool.Instance.GetPacket(PacketType.AvatarAnimation);
+ // TODO: don't create new blocks if recycling an old packet
ani.AnimationSourceList = new AvatarAnimationPacket.AnimationSourceListBlock[1];
ani.AnimationSourceList[0] = new AvatarAnimationPacket.AnimationSourceListBlock();
ani.AnimationSourceList[0].ObjectID = sourceAgentId;
@@ -1442,7 +1453,8 @@ namespace OpenSim.Region.ClientStack
public void SendAvatarData(ulong regionHandle, string firstName, string lastName, LLUUID avatarID,
uint avatarLocalID, LLVector3 Pos, byte[] textureEntry, uint parentID)
{
- ObjectUpdatePacket objupdate = new ObjectUpdatePacket();
+ ObjectUpdatePacket objupdate = (ObjectUpdatePacket) PacketPool.Instance.GetPacket(PacketType.ObjectUpdate);
+ // TODO: don't create new blocks if recycling an old packet
objupdate.RegionData.RegionHandle = regionHandle;
objupdate.RegionData.TimeDilation = 64096;
objupdate.ObjectData = new ObjectUpdatePacket.ObjectDataBlock[1];
@@ -1474,7 +1486,8 @@ namespace OpenSim.Region.ClientStack
{
ImprovedTerseObjectUpdatePacket.ObjectDataBlock terseBlock =
CreateAvatarImprovedBlock(localID, position, velocity, rotation);
- ImprovedTerseObjectUpdatePacket terse = new ImprovedTerseObjectUpdatePacket();
+ ImprovedTerseObjectUpdatePacket terse = (ImprovedTerseObjectUpdatePacket) PacketPool.Instance.GetPacket(PacketType.ImprovedTerseObjectUpdate);
+ // TODO: don't create new blocks if recycling an old packet
terse.RegionData.RegionHandle = regionHandle;
terse.RegionData.TimeDilation = timeDilation;
terse.ObjectData = new ImprovedTerseObjectUpdatePacket.ObjectDataBlock[1];
@@ -1485,7 +1498,8 @@ namespace OpenSim.Region.ClientStack
public void SendCoarseLocationUpdate(List CoarseLocations)
{
- CoarseLocationUpdatePacket loc = new CoarseLocationUpdatePacket();
+ CoarseLocationUpdatePacket loc = (CoarseLocationUpdatePacket) PacketPool.Instance.GetPacket(PacketType.CoarseLocationUpdate);
+ // TODO: don't create new blocks if recycling an old packet
int total = CoarseLocations.Count;
CoarseLocationUpdatePacket.IndexBlock ib =
new CoarseLocationUpdatePacket.IndexBlock();
@@ -1517,7 +1531,8 @@ namespace OpenSim.Region.ClientStack
///
public void AttachObject(uint localID, LLQuaternion rotation, byte attachPoint)
{
- ObjectAttachPacket attach = new ObjectAttachPacket();
+ ObjectAttachPacket attach = (ObjectAttachPacket) PacketPool.Instance.GetPacket(PacketType.ObjectAttach);
+ // TODO: don't create new blocks if recycling an old packet
attach.AgentData.AgentID = AgentId;
attach.AgentData.SessionID = m_sessionId;
attach.AgentData.AttachmentPoint = attachPoint;
@@ -1536,7 +1551,8 @@ namespace OpenSim.Region.ClientStack
LLUUID objectID, LLUUID ownerID, string text, byte[] color, uint parentID, byte[] particleSystem,
LLQuaternion rotation, byte clickAction)
{
- ObjectUpdatePacket outPacket = new ObjectUpdatePacket();
+ ObjectUpdatePacket outPacket = (ObjectUpdatePacket) PacketPool.Instance.GetPacket(PacketType.ObjectUpdate);
+ // TODO: don't create new blocks if recycling an old packet
outPacket.RegionData.RegionHandle = regionHandle;
outPacket.RegionData.TimeDilation = timeDilation;
outPacket.ObjectData = new ObjectUpdatePacket.ObjectDataBlock[1];
@@ -1579,7 +1595,8 @@ namespace OpenSim.Region.ClientStack
{
LLVector3 velocity = new LLVector3(0f, 0f, 0f);
LLVector3 rotationalvelocity = new LLVector3(0f, 0f, 0f);
- ImprovedTerseObjectUpdatePacket terse = new ImprovedTerseObjectUpdatePacket();
+ ImprovedTerseObjectUpdatePacket terse = (ImprovedTerseObjectUpdatePacket) PacketPool.Instance.GetPacket(PacketType.ImprovedTerseObjectUpdate);
+ // TODO: don't create new blocks if recycling an old packet
terse.RegionData.RegionHandle = regionHandle;
terse.RegionData.TimeDilation = timeDilation;
terse.ObjectData = new ImprovedTerseObjectUpdatePacket.ObjectDataBlock[1];
@@ -1591,7 +1608,8 @@ namespace OpenSim.Region.ClientStack
public void SendPrimTerseUpdate(ulong regionHandle, ushort timeDilation, uint localID, LLVector3 position,
LLQuaternion rotation, LLVector3 velocity, LLVector3 rotationalvelocity)
{
- ImprovedTerseObjectUpdatePacket terse = new ImprovedTerseObjectUpdatePacket();
+ ImprovedTerseObjectUpdatePacket terse = (ImprovedTerseObjectUpdatePacket) PacketPool.Instance.GetPacket(PacketType.ImprovedTerseObjectUpdate);
+ // TODO: don't create new blocks if recycling an old packet
terse.RegionData.RegionHandle = regionHandle;
terse.RegionData.TimeDilation = timeDilation;
terse.ObjectData = new ImprovedTerseObjectUpdatePacket.ObjectDataBlock[1];
@@ -1928,8 +1946,8 @@ namespace OpenSim.Region.ClientStack
public void SendNameReply(LLUUID profileId, string firstname, string lastname)
{
- UUIDNameReplyPacket packet = new UUIDNameReplyPacket();
-
+ UUIDNameReplyPacket packet = (UUIDNameReplyPacket) PacketPool.Instance.GetPacket(PacketType.UUIDNameReply);
+ // TODO: don't create new blocks if recycling an old packet
packet.UUIDNameBlock = new UUIDNameReplyPacket.UUIDNameBlockBlock[1];
packet.UUIDNameBlock[0] = new UUIDNameReplyPacket.UUIDNameBlockBlock();
packet.UUIDNameBlock[0].ID = profileId;
@@ -1977,7 +1995,8 @@ namespace OpenSim.Region.ClientStack
{
//System.Console.WriteLine("texture cached: " + packet.ToString());
AgentCachedTexturePacket chechedtex = (AgentCachedTexturePacket) packet;
- AgentCachedTextureResponsePacket cachedresp = new AgentCachedTextureResponsePacket();
+ AgentCachedTextureResponsePacket cachedresp = (AgentCachedTextureResponsePacket) PacketPool.Instance.GetPacket(PacketType.AgentCachedTextureResponse);
+ // TODO: don't create new blocks if recycling an old packet
cachedresp.AgentData.AgentID = AgentId;
cachedresp.AgentData.SessionID = m_sessionId;
cachedresp.AgentData.SerialNum = m_cachedTextureSerial;
@@ -2137,7 +2156,8 @@ namespace OpenSim.Region.ClientStack
{
//should be getting the map layer from the grid server
//send a layer covering the 800,800 - 1200,1200 area (should be covering the requested area)
- MapLayerReplyPacket mapReply = new MapLayerReplyPacket();
+ MapLayerReplyPacket mapReply = (MapLayerReplyPacket) PacketPool.Instance.GetPacket(PacketType.MapLayerReply);
+ // TODO: don't create new blocks if recycling an old packet
mapReply.AgentData.AgentID = AgentId;
mapReply.AgentData.Flags = 0;
mapReply.LayerData = new MapLayerReplyPacket.LayerDataBlock[1];
@@ -2281,22 +2301,18 @@ namespace OpenSim.Region.ClientStack
// Actually make the byte array and send it
try
{
- byte[] sendbuffer = Pack.ToBytes();
- if (Pack is RegionHandshakePacket)
- {
- PacketPool.Instance.ReturnPacket(Pack);
- }
-
- if (Pack.Header.Zerocoded)
- {
- byte[] ZeroOutBuffer = new byte[4096];
- int packetsize = Helpers.ZeroEncode(sendbuffer, sendbuffer.Length, ZeroOutBuffer);
- m_networkServer.SendPacketTo(ZeroOutBuffer, packetsize, SocketFlags.None, m_circuitCode);
- }
- else
- {
- m_networkServer.SendPacketTo(sendbuffer, sendbuffer.Length, SocketFlags.None, m_circuitCode);
- }
+ byte[] sendbuffer = Pack.ToBytes();
+ PacketPool.Instance.ReturnPacket(Pack);
+
+ if (Pack.Header.Zerocoded)
+ {
+ int packetsize = Helpers.ZeroEncode(sendbuffer, sendbuffer.Length, ZeroOutBuffer);
+ m_networkServer.SendPacketTo(ZeroOutBuffer, packetsize, SocketFlags.None, m_circuitCode);
+ }
+ else
+ {
+ m_networkServer.SendPacketTo(sendbuffer, sendbuffer.Length, SocketFlags.None, m_circuitCode);
+ }
}
catch (Exception e)
{
@@ -2342,7 +2358,7 @@ namespace OpenSim.Region.ClientStack
{
//reply to pingcheck
StartPingCheckPacket startPing = (StartPingCheckPacket) NewPack;
- CompletePingCheckPacket endPing = new CompletePingCheckPacket();
+ CompletePingCheckPacket endPing = (CompletePingCheckPacket) PacketPool.Instance.GetPacket(PacketType.CompletePingCheck);
endPing.PingID.PingID = startPing.PingID.PingID;
OutPacket(endPing, ThrottleOutPacketType.Task);
}
@@ -2371,7 +2387,8 @@ namespace OpenSim.Region.ClientStack
{
if (Pack.Header.Reliable)
{
- PacketAckPacket ack_it = new PacketAckPacket();
+ PacketAckPacket ack_it = (PacketAckPacket) PacketPool.Instance.GetPacket(PacketType.PacketAck);
+ // TODO: don't create new blocks if recycling an old packet
ack_it.Packets = new PacketAckPacket.PacketsBlock[1];
ack_it.Packets[0] = new PacketAckPacket.PacketsBlock();
ack_it.Packets[0].ID = Pack.Header.Sequence;
@@ -2426,7 +2443,8 @@ namespace OpenSim.Region.ClientStack
//MainLog.Instance.Verbose("NETWORK", "Sending PacketAck");
int i = 0;
- PacketAckPacket acks = new PacketAckPacket();
+ PacketAckPacket acks = (PacketAckPacket) PacketPool.Instance.GetPacket(PacketType.PacketAck);
+ // TODO: don't create new blocks if recycling an old packet
acks.Packets = new PacketAckPacket.PacketsBlock[m_pendingAcks.Count];
foreach (uint ack in m_pendingAcks.Values)
@@ -2850,10 +2868,9 @@ namespace OpenSim.Region.ClientStack
break;
case PacketType.ObjectPermissions:
MainLog.Instance.Warn("CLIENT", "unhandled packet " + PacketType.ObjectPermissions.ToString());
- ObjectPermissionsPacket newobjPerms = (ObjectPermissionsPacket) Pack;
+ ObjectPermissionsPacket newobjPerms = (ObjectPermissionsPacket)Pack;
- List permChanges =
- new List();
+ List permChanges = new List();
for (int i = 0; i < newobjPerms.ObjectData.Length; i++)
{
@@ -2883,7 +2900,7 @@ namespace OpenSim.Region.ClientStack
case PacketType.RequestObjectPropertiesFamily:
//This powers the little tooltip that appears when you move your mouse over an object
- RequestObjectPropertiesFamilyPacket packToolTip = (RequestObjectPropertiesFamilyPacket) Pack;
+ RequestObjectPropertiesFamilyPacket packToolTip = (RequestObjectPropertiesFamilyPacket)Pack;
RequestObjectPropertiesFamilyPacket.ObjectDataBlock packObjBlock = packToolTip.ObjectData;
@@ -2987,7 +3004,7 @@ namespace OpenSim.Region.ClientStack
case PacketType.MoveInventoryFolder:
if (OnMoveInventoryFolder != null)
{
- MoveInventoryFolderPacket invFolder = (MoveInventoryFolderPacket) Pack;
+ MoveInventoryFolderPacket invFolder = (MoveInventoryFolderPacket)Pack;
for (int i = 0; i < invFolder.InventoryData.Length; i++)
{
OnMoveInventoryFolder(this, invFolder.InventoryData[i].FolderID,
@@ -3094,7 +3111,7 @@ namespace OpenSim.Region.ClientStack
}
break;
case PacketType.MoveInventoryItem:
- MoveInventoryItemPacket moveitem = (MoveInventoryItemPacket) Pack;
+ MoveInventoryItemPacket moveitem = (MoveInventoryItemPacket)Pack;
if (OnMoveInventoryItem != null)
{
foreach (MoveInventoryItemPacket.InventoryDataBlock datablock in moveitem.InventoryData)
@@ -3163,11 +3180,11 @@ namespace OpenSim.Region.ClientStack
case PacketType.TeleportLandmarkRequest:
TeleportLandmarkRequestPacket tpReq = (TeleportLandmarkRequestPacket) Pack;
- TeleportStartPacket tpStart = new TeleportStartPacket();
+ TeleportStartPacket tpStart = (TeleportStartPacket) PacketPool.Instance.GetPacket(PacketType.TeleportStart);
tpStart.Info.TeleportFlags = 8; // tp via lm
OutPacket(tpStart, ThrottleOutPacketType.Task);
- TeleportProgressPacket tpProgress = new TeleportProgressPacket();
+ TeleportProgressPacket tpProgress = (TeleportProgressPacket) PacketPool.Instance.GetPacket(PacketType.TeleportProgress);
tpProgress.Info.Message = (new ASCIIEncoding()).GetBytes("sending_landmark");
tpProgress.Info.TeleportFlags = 8;
tpProgress.AgentData.AgentID = tpReq.Info.AgentID;
@@ -3182,7 +3199,7 @@ namespace OpenSim.Region.ClientStack
if (lm.RegionID == m_scene.RegionInfo.RegionID)
{
- TeleportLocalPacket tpLocal = new TeleportLocalPacket();
+ TeleportLocalPacket tpLocal = (TeleportLocalPacket) PacketPool.Instance.GetPacket(PacketType.TeleportLocal);
tpLocal.Info.AgentID = tpReq.Info.AgentID;
tpLocal.Info.TeleportFlags = 8; // Teleport via landmark
@@ -3192,7 +3209,7 @@ namespace OpenSim.Region.ClientStack
}
else
{
- TeleportCancelPacket tpCancel = new TeleportCancelPacket();
+ TeleportCancelPacket tpCancel = (TeleportCancelPacket) PacketPool.Instance.GetPacket(PacketType.TeleportCancel);
tpCancel.Info.AgentID = tpReq.Info.AgentID;
tpCancel.Info.SessionID = tpReq.Info.SessionID;
OutPacket(tpCancel, ThrottleOutPacketType.Task);
@@ -3202,7 +3219,7 @@ namespace OpenSim.Region.ClientStack
{
Console.WriteLine("Cancelling Teleport - fetch asset not yet implemented");
- TeleportCancelPacket tpCancel = new TeleportCancelPacket();
+ TeleportCancelPacket tpCancel = (TeleportCancelPacket) PacketPool.Instance.GetPacket(PacketType.TeleportCancel);
tpCancel.Info.AgentID = tpReq.Info.AgentID;
tpCancel.Info.SessionID = tpReq.Info.SessionID;
OutPacket(tpCancel, ThrottleOutPacketType.Task);
@@ -3220,7 +3237,7 @@ namespace OpenSim.Region.ClientStack
else
{
//no event handler so cancel request
- TeleportCancelPacket tpCancel = new TeleportCancelPacket();
+ TeleportCancelPacket tpCancel = (TeleportCancelPacket) PacketPool.Instance.GetPacket(PacketType.TeleportCancel);
tpCancel.Info.SessionID = tpLocReq.AgentData.SessionID;
tpCancel.Info.AgentID = tpLocReq.AgentData.AgentID;
OutPacket(tpCancel, ThrottleOutPacketType.Task);
@@ -3521,13 +3538,15 @@ namespace OpenSim.Region.ClientStack
shape.PathTwist = addPacket.ObjectData.PathTwist;
shape.PathTwistBegin = addPacket.ObjectData.PathTwistBegin;
LLObject.TextureEntry ntex = new LLObject.TextureEntry(new LLUUID("89556747-24cb-43ed-920b-47caed15465f"));
- shape.Textures = ntex;
+ shape.TextureEntry = ntex.ToBytes();
+ //shape.Textures = ntex;
return shape;
}
public void SendLogoutPacket()
{
- LogoutReplyPacket logReply = new LogoutReplyPacket();
+ LogoutReplyPacket logReply = (LogoutReplyPacket) PacketPool.Instance.GetPacket(PacketType.LogoutReply);
+ // TODO: don't create new blocks if recycling an old packet
logReply.AgentData.AgentID = AgentId;
logReply.AgentData.SessionID = SessionId;
logReply.InventoryData = new LogoutReplyPacket.InventoryDataBlock[1];
diff --git a/OpenSim/Region/ClientStack/UDPServer.cs b/OpenSim/Region/ClientStack/UDPServer.cs
index 10435bf..bcbd81a 100644
--- a/OpenSim/Region/ClientStack/UDPServer.cs
+++ b/OpenSim/Region/ClientStack/UDPServer.cs
@@ -30,7 +30,6 @@ using System.Collections;
using System.Collections.Generic;
using System.Net;
using System.Net.Sockets;
-using libsecondlife;
using libsecondlife.Packets;
using OpenSim.Framework;
using OpenSim.Framework.Communications.Cache;
@@ -38,103 +37,6 @@ using OpenSim.Framework.Console;
namespace OpenSim.Region.ClientStack
{
- public sealed class PacketPool
- {
- // Set up a thread-safe singleton pattern
- static PacketPool()
- {
- }
-
- private static readonly PacketPool instance = new PacketPool();
-
- public static PacketPool Instance
- {
- get { return instance; }
- }
-
- private Hashtable pool = new Hashtable();
-
- public Packet GetPacket(PacketType type)
- {
- Packet packet = null;
-
- lock (pool)
- {
- if (pool[type] == null || ((Stack) pool[type]).Count == 0)
- {
- // Creating a new packet if we cannot reuse an old package
- packet = Packet.BuildPacket(type);
- }
- else
- {
- // Recycle old packages
- packet = (Packet) ((Stack) pool[type]).Pop();
- }
- }
-
- return packet;
- }
-
- public Packet GetPacket(byte[] bytes, ref int packetEnd, byte[] zeroBuffer)
- {
- Packet packet = GetPacket(GetType(bytes, packetEnd, zeroBuffer));
-
- int i = 0;
- packet.FromBytes(bytes, ref i, ref packetEnd, zeroBuffer);
- return packet;
- }
-
- public PacketType GetType(byte[] bytes, int packetEnd, byte[] zeroBuffer)
- {
- //Function removed from LibSL revision 1540
- // We're using it.. so Built it into UDP server for now..
- ushort id;
- PacketFrequency freq;
- int i = 0, end = packetEnd;
- Header header = Header.BuildHeader(bytes, ref i, ref end);
- if (header.Zerocoded)
- {
- end = Helpers.ZeroDecode(bytes, end + 1, zeroBuffer) - 1;
- bytes = zeroBuffer;
- }
-
- if (bytes[6] == 0xFF)
- {
- if (bytes[7] == 0xFF)
- {
- id = (ushort) ((bytes[8] << 8) + bytes[9]);
- freq = PacketFrequency.Low;
- }
- else
- {
- id = (ushort) bytes[7];
- freq = PacketFrequency.Medium;
- }
- }
- else
- {
- id = (ushort) bytes[6];
- freq = PacketFrequency.High;
- }
- return Packet.GetType(id, freq);
- }
-
- public void ReturnPacket(Packet packet)
- {
- lock (pool)
- {
- PacketType type = packet.Type;
-
- if (pool[type] == null)
- {
- pool[type] = new Stack();
- }
-
- ((Stack) pool[type]).Push(packet);
- }
- }
- }
-
public class UDPServer : ClientStackNetworkHandler
{
protected Dictionary clientCircuits = new Dictionary();
@@ -386,4 +288,4 @@ namespace OpenSim.Region.ClientStack
}
}
}
-}
\ No newline at end of file
+}
diff --git a/OpenSim/Region/Environment/LandManagement/Land.cs b/OpenSim/Region/Environment/LandManagement/Land.cs
index ff16319..5c99ffd 100644
--- a/OpenSim/Region/Environment/LandManagement/Land.cs
+++ b/OpenSim/Region/Environment/LandManagement/Land.cs
@@ -32,6 +32,7 @@ using libsecondlife;
using libsecondlife.Packets;
using OpenSim.Framework;
using OpenSim.Region.Environment.Scenes;
+using OpenSim.Region.Environment.Interfaces;
namespace OpenSim.Region.Environment.LandManagement
{
@@ -110,7 +111,9 @@ namespace OpenSim.Region.Environment.LandManagement
public void sendLandProperties(int sequence_id, bool snap_selection, int request_result,
IClientAPI remote_client)
{
- ParcelPropertiesPacket updatePacket = new ParcelPropertiesPacket();
+ ParcelPropertiesPacket updatePacket = (ParcelPropertiesPacket) PacketPool.Instance.GetPacket(PacketType.ParcelProperties);
+ // TODO: don't create new blocks if recycling an old packet
+
updatePacket.ParcelData.AABBMax = landData.AABBMax;
updatePacket.ParcelData.AABBMin = landData.AABBMin;
updatePacket.ParcelData.Area = landData.area;
@@ -334,7 +337,7 @@ namespace OpenSim.Region.Environment.LandManagement
if (flags == (uint) ParcelManager.AccessList.Access || flags == (uint) ParcelManager.AccessList.Both)
{
- replyPacket = new ParcelAccessListReplyPacket();
+ replyPacket = (ParcelAccessListReplyPacket) PacketPool.Instance.GetPacket(PacketType.ParcelAccessListReply);
replyPacket.Data.AgentID = agentID;
replyPacket.Data.Flags = (uint) ParcelManager.AccessList.Access;
replyPacket.Data.LocalID = landData.localID;
@@ -346,7 +349,7 @@ namespace OpenSim.Region.Environment.LandManagement
if (flags == (uint) ParcelManager.AccessList.Ban || flags == (uint) ParcelManager.AccessList.Both)
{
- replyPacket = new ParcelAccessListReplyPacket();
+ replyPacket = (ParcelAccessListReplyPacket) PacketPool.Instance.GetPacket(PacketType.ParcelAccessListReply);
replyPacket.Data.AgentID = agentID;
replyPacket.Data.Flags = (uint) ParcelManager.AccessList.Ban;
replyPacket.Data.LocalID = landData.localID;
@@ -657,7 +660,8 @@ namespace OpenSim.Region.Environment.LandManagement
bool firstCall = true;
int MAX_OBJECTS_PER_PACKET = 251;
- ForceObjectSelectPacket pack = new ForceObjectSelectPacket();
+ ForceObjectSelectPacket pack = (ForceObjectSelectPacket) PacketPool.Instance.GetPacket(PacketType.ForceObjectSelect);
+ // TODO: don't create new blocks if recycling an old packet
ForceObjectSelectPacket.DataBlock[] data;
while (resultLocalIDs.Count > 0)
{
@@ -695,7 +699,9 @@ namespace OpenSim.Region.Environment.LandManagement
public void sendLandObjectOwners(IClientAPI remote_client)
{
Dictionary ownersAndCount = new Dictionary();
- ParcelObjectOwnersReplyPacket pack = new ParcelObjectOwnersReplyPacket();
+ ParcelObjectOwnersReplyPacket pack = (ParcelObjectOwnersReplyPacket) PacketPool.Instance.GetPacket(PacketType.ParcelObjectOwnersReply);
+ // TODO: don't create new blocks if recycling an old packet
+
foreach (SceneObjectGroup obj in primsOverMe)
{
if (!ownersAndCount.ContainsKey(obj.OwnerID))
@@ -725,7 +731,6 @@ namespace OpenSim.Region.Environment.LandManagement
num++;
}
-
pack.Data = dataBlock;
}
remote_client.OutPacket(pack, ThrottleOutPacketType.Task);
@@ -810,4 +815,4 @@ namespace OpenSim.Region.Environment.LandManagement
}
#endregion
-}
\ No newline at end of file
+}
diff --git a/OpenSim/Region/Environment/LandManagement/LandManager.cs b/OpenSim/Region/Environment/LandManagement/LandManager.cs
index 772fe2e..22e7fc9 100644
--- a/OpenSim/Region/Environment/LandManagement/LandManager.cs
+++ b/OpenSim/Region/Environment/LandManagement/LandManager.cs
@@ -33,6 +33,7 @@ using libsecondlife.Packets;
using OpenSim.Framework;
using OpenSim.Framework.Console;
using OpenSim.Region.Environment.Scenes;
+using OpenSim.Region.Environment.Interfaces;
using OpenSim.Region.Physics.Manager;
namespace OpenSim.Region.Environment.LandManagement
@@ -493,7 +494,7 @@ namespace OpenSim.Region.Environment.LandManagement
if (byteArrayCount >= LAND_BLOCKS_PER_PACKET)
{
byteArrayCount = 0;
- packet = new ParcelOverlayPacket();
+ packet = (ParcelOverlayPacket) PacketPool.Instance.GetPacket(PacketType.ParcelOverlay);
packet.ParcelData.Data = byteArray;
packet.ParcelData.SequenceID = sequenceID;
remote_client.OutPacket((Packet) packet, ThrottleOutPacketType.Task);
@@ -856,4 +857,4 @@ namespace OpenSim.Region.Environment.LandManagement
}
#endregion
-}
\ No newline at end of file
+}
diff --git a/OpenSim/Region/Environment/Scenes/Scene.PacketHandlers.cs b/OpenSim/Region/Environment/Scenes/Scene.PacketHandlers.cs
index 999b70f..647fbf4 100644
--- a/OpenSim/Region/Environment/Scenes/Scene.PacketHandlers.cs
+++ b/OpenSim/Region/Environment/Scenes/Scene.PacketHandlers.cs
@@ -29,6 +29,8 @@ using System.Collections.Generic;
using libsecondlife;
using libsecondlife.Packets;
using OpenSim.Framework;
+using OpenSim.Framework.UserManagement;
+using OpenSim.Framework.Console;
namespace OpenSim.Region.Environment.Scenes
{
@@ -164,7 +166,9 @@ namespace OpenSim.Region.Environment.Scenes
List AvatarResponses = new List();
AvatarResponses = CommsManager.GenerateAgentPickerRequestResponse(RequestID, query);
- AvatarPickerReplyPacket replyPacket = new AvatarPickerReplyPacket();
+ AvatarPickerReplyPacket replyPacket = (AvatarPickerReplyPacket) PacketPool.Instance.GetPacket(PacketType.AvatarPickerReply);
+ // TODO: don't create new blocks if recycling an old packet
+
AvatarPickerReplyPacket.DataBlock[] searchData =
new AvatarPickerReplyPacket.DataBlock[AvatarResponses.Count];
AvatarPickerReplyPacket.AgentDataBlock agentData = new AvatarPickerReplyPacket.AgentDataBlock();
@@ -192,4 +196,4 @@ namespace OpenSim.Region.Environment.Scenes
client.SendAvatarPickerReply(replyPacket);
}
}
-}
\ No newline at end of file
+}
diff --git a/OpenSim/Region/Environment/Scenes/Scene.cs b/OpenSim/Region/Environment/Scenes/Scene.cs
index d8c5255..4657264 100644
--- a/OpenSim/Region/Environment/Scenes/Scene.cs
+++ b/OpenSim/Region/Environment/Scenes/Scene.cs
@@ -474,7 +474,7 @@ namespace OpenSim.Region.Environment.Scenes
if (!avatar.IsChildAgent)
avatar.ControllingClient.Kick("The simulator is going down.");
- avatar.ControllingClient.OutPacket(new DisableSimulatorPacket(),
+ avatar.ControllingClient.OutPacket(PacketPool.Instance.GetPacket(libsecondlife.Packets.PacketType.DisableSimulator),
ThrottleOutPacketType.Task);
});
@@ -1016,43 +1016,42 @@ namespace OpenSim.Region.Environment.Scenes
// It's wrong many times though.
LLVector3 pos = GetNewRezLocation(RayStart, RayEnd, RayTargetID, rot, bypassRaycast, RayEndIsIntersection);
+
+
+
if (PermissionsMngr.CanRezObject(ownerID, pos))
{
- // rez ON the ground, not IN the ground
- pos.Z += 0.25F;
-
- AddNewPrim(ownerID, pos, rot, shape);
- }
- }
- public virtual void AddNewPrim(LLUUID ownerID, LLVector3 pos, LLQuaternion rot, PrimitiveBaseShape shape)
- {
- SceneObjectGroup sceneOb =
- new SceneObjectGroup(this, m_regionHandle, ownerID, PrimIDAllocate(), pos, rot, shape);
-
- AddEntity(sceneOb);
- SceneObjectPart rootPart = sceneOb.GetChildPart(sceneOb.UUID);
- // if grass or tree, make phantom
- //rootPart.ApplySanePermissions();
- if ((rootPart.Shape.PCode == 95) || (rootPart.Shape.PCode == 255) || (rootPart.Shape.PCode == 111))
- {
- rootPart.AddFlag(LLObject.ObjectFlags.Phantom);
- //rootPart.ObjectFlags += (uint)LLObject.ObjectFlags.Phantom;
- }
- // if not phantom, add to physics
- bool UsePhysics = (((rootPart.ObjectFlags & (uint) LLObject.ObjectFlags.Physics) > 0) && m_physicalPrim);
- if ((rootPart.ObjectFlags & (uint) LLObject.ObjectFlags.Phantom) == 0)
- {
- rootPart.PhysActor =
- PhysicsScene.AddPrimShape(
- rootPart.Name,
- rootPart.Shape,
- new PhysicsVector(pos.X, pos.Y, pos.Z),
- new PhysicsVector(shape.Scale.X, shape.Scale.Y, shape.Scale.Z),
- new Quaternion(), UsePhysics);
- // subscribe to physics events.
- rootPart.DoPhysicsPropertyUpdate(UsePhysics, true);
+ // rez ON the ground, not IN the ground
+ pos.Z += 0.25F;
+
+
+ SceneObjectGroup sceneOb =
+ new SceneObjectGroup(this, m_regionHandle, ownerID, PrimIDAllocate(), pos, rot, shape);
+ AddEntity(sceneOb);
+ SceneObjectPart rootPart = sceneOb.GetChildPart(sceneOb.UUID);
+ // if grass or tree, make phantom
+ //rootPart.ApplySanePermissions();
+ if ((rootPart.Shape.PCode == 95) || (rootPart.Shape.PCode == 255) || (rootPart.Shape.PCode == 111))
+ {
+ rootPart.AddFlag(LLObject.ObjectFlags.Phantom);
+ //rootPart.ObjectFlags += (uint)LLObject.ObjectFlags.Phantom;
+ }
+ // if not phantom, add to physics
+ bool UsePhysics = (((rootPart.ObjectFlags & (uint) LLObject.ObjectFlags.Physics) > 0) && m_physicalPrim);
+ if ((rootPart.ObjectFlags & (uint) LLObject.ObjectFlags.Phantom) == 0)
+ {
+ rootPart.PhysActor =
+ PhysicsScene.AddPrimShape(
+ rootPart.Name,
+ rootPart.Shape,
+ new PhysicsVector(pos.X, pos.Y, pos.Z),
+ new PhysicsVector(shape.Scale.X, shape.Scale.Y, shape.Scale.Z),
+ new Quaternion(), UsePhysics);
+ // subscribe to physics events.
+ rootPart.DoPhysicsPropertyUpdate(UsePhysics, true);
+ }
}
}
@@ -1499,7 +1498,7 @@ namespace OpenSim.Region.Environment.Scenes
m_innerScene.removeUserCount(true);
}
// Tell a single agent to disconnect from the region.
- DisableSimulatorPacket disable = new DisableSimulatorPacket();
+ libsecondlife.Packets.DisableSimulatorPacket disable = (libsecondlife.Packets.DisableSimulatorPacket) PacketPool.Instance.GetPacket(libsecondlife.Packets.PacketType.DisableSimulator);
presence.ControllingClient.OutPacket(disable, ThrottleOutPacketType.Task);
}
}
@@ -2246,4 +2245,4 @@ namespace OpenSim.Region.Environment.Scenes
#endregion
}
-}
\ No newline at end of file
+}
diff --git a/OpenSim/Region/Environment/Scenes/SceneObjectGroup.cs b/OpenSim/Region/Environment/Scenes/SceneObjectGroup.cs
index 5b74c9b..94b6797 100644
--- a/OpenSim/Region/Environment/Scenes/SceneObjectGroup.cs
+++ b/OpenSim/Region/Environment/Scenes/SceneObjectGroup.cs
@@ -74,13 +74,11 @@ namespace OpenSim.Region.Environment.Scenes
{
get { return m_rootPart.RotationOffset; }
}
-
public LLUUID GroupID
{
get { return m_rootPart.GroupID; }
set { m_rootPart.GroupID = value; }
}
-
///
///
///
@@ -638,7 +636,9 @@ namespace OpenSim.Region.Environment.Scenes
public void ServiceObjectPropertiesFamilyRequest(IClientAPI remoteClient, LLUUID AgentID, uint RequestFlags)
{
//RootPart.ServiceObjectPropertiesFamilyRequest(remoteClient, AgentID, RequestFlags);
- ObjectPropertiesFamilyPacket objPropFamilyPack = new ObjectPropertiesFamilyPacket();
+ ObjectPropertiesFamilyPacket objPropFamilyPack = (ObjectPropertiesFamilyPacket) PacketPool.Instance.GetPacket(PacketType.ObjectPropertiesFamily);
+ // TODO: don't create new blocks if recycling an old packet
+
ObjectPropertiesFamilyPacket.ObjectDataBlock objPropDB = new ObjectPropertiesFamilyPacket.ObjectDataBlock();
objPropDB.RequestFlags = RequestFlags;
objPropDB.ObjectID = RootPart.UUID;
@@ -1045,7 +1045,9 @@ namespace OpenSim.Region.Environment.Scenes
///
public void GetProperites(IClientAPI client)
{
- ObjectPropertiesPacket proper = new ObjectPropertiesPacket();
+ ObjectPropertiesPacket proper = (ObjectPropertiesPacket) PacketPool.Instance.GetPacket(PacketType.ObjectProperties);
+ // TODO: don't create new blocks if recycling an old packet
+
proper.ObjectData = new ObjectPropertiesPacket.ObjectDataBlock[1];
proper.ObjectData[0] = new ObjectPropertiesPacket.ObjectDataBlock();
proper.ObjectData[0].ItemID = LLUUID.Zero;
@@ -1297,6 +1299,7 @@ namespace OpenSim.Region.Environment.Scenes
m_rootPart.PhysActor.IsPhysical);
bool UsePhysics = ((m_rootPart.ObjectFlags & (uint) LLObject.ObjectFlags.Physics) != 0);
m_rootPart.DoPhysicsPropertyUpdate(UsePhysics, true);
+
}
}
@@ -1737,4 +1740,4 @@ namespace OpenSim.Region.Environment.Scenes
m_rootPart.ApplyPhysics();
}
}
-}
\ No newline at end of file
+}
diff --git a/OpenSim/Region/Environment/Scenes/SimStatsReporter.cs b/OpenSim/Region/Environment/Scenes/SimStatsReporter.cs
index b183c04..5033965 100644
--- a/OpenSim/Region/Environment/Scenes/SimStatsReporter.cs
+++ b/OpenSim/Region/Environment/Scenes/SimStatsReporter.cs
@@ -83,7 +83,9 @@ namespace OpenSim.Region.Environment.Scenes
private void statsHeartBeat(object sender, EventArgs e)
{
m_report.Enabled = false;
- SimStatsPacket statpack = new SimStatsPacket();
+ SimStatsPacket statpack = (SimStatsPacket) PacketPool.Instance.GetPacket(PacketType.SimStats);
+ // TODO: don't create new blocks if recycling an old packet
+
SimStatsPacket.StatBlock[] sb = new SimStatsPacket.StatBlock[11];
statpack.Region = new SimStatsPacket.RegionBlock();
statpack.Region.RegionX = ReportingRegion.RegionLocX;
@@ -241,4 +243,4 @@ namespace OpenSim.Region.Environment.Scenes
m_unAckedBytes += numBytes;
}
}
-}
\ No newline at end of file
+}
diff --git a/bin/libsecondlife.dll b/bin/libsecondlife.dll
index 6c20c19..1427824 100644
Binary files a/bin/libsecondlife.dll and b/bin/libsecondlife.dll differ
--
cgit v1.1