From e9153e1d1aae50024d8cd05fe14a9bce34343a0e Mon Sep 17 00:00:00 2001
From: teravus
Date: Thu, 15 Nov 2012 10:05:16 -0500
Subject: Revert "Merge master into teravuswork", it should have been
avination, not master.
This reverts commit dfac269032300872c4d0dc507f4f9062d102b0f4, reversing
changes made to 619c39e5144f15aca129d6d999bcc5c34133ee64.
---
.../ClientStack/Linden/UDP/IncomingPacket.cs | 7 +-
.../Region/ClientStack/Linden/UDP/LLClientView.cs | 169 ++++-------
.../Region/ClientStack/Linden/UDP/LLUDPServer.cs | 338 +++------------------
.../ClientStack/Linden/UDP/OpenSimUDPBase.cs | 116 ++-----
.../Region/ClientStack/Linden/UDP/PacketPool.cs | 316 -------------------
.../Linden/UDP/Tests/BasicCircuitTests.cs | 7 +-
6 files changed, 143 insertions(+), 810 deletions(-)
delete mode 100644 OpenSim/Region/ClientStack/Linden/UDP/PacketPool.cs
(limited to 'OpenSim/Region/ClientStack/Linden/UDP')
diff --git a/OpenSim/Region/ClientStack/Linden/UDP/IncomingPacket.cs b/OpenSim/Region/ClientStack/Linden/UDP/IncomingPacket.cs
index e22670b..1b8535c 100644
--- a/OpenSim/Region/ClientStack/Linden/UDP/IncomingPacket.cs
+++ b/OpenSim/Region/ClientStack/Linden/UDP/IncomingPacket.cs
@@ -45,12 +45,7 @@ namespace OpenSim.Region.ClientStack.LindenUDP
public Packet Packet;
///
- /// No arg constructor.
- ///
- public IncomingPacket() {}
-
- ///
- /// Constructor
+ /// Default constructor
///
/// Reference to the client this packet came from
/// Packet data
diff --git a/OpenSim/Region/ClientStack/Linden/UDP/LLClientView.cs b/OpenSim/Region/ClientStack/Linden/UDP/LLClientView.cs
index c9aa4ca..ae9ed7f 100644
--- a/OpenSim/Region/ClientStack/Linden/UDP/LLClientView.cs
+++ b/OpenSim/Region/ClientStack/Linden/UDP/LLClientView.cs
@@ -47,7 +47,6 @@ using OpenSim.Region.Framework.Scenes;
using OpenSim.Services.Interfaces;
using Timer = System.Timers.Timer;
using AssetLandmark = OpenSim.Framework.AssetLandmark;
-using RegionFlags = OpenMetaverse.RegionFlags;
using Nini.Config;
using System.IO;
@@ -356,17 +355,7 @@ namespace OpenSim.Region.ClientStack.LindenUDP
private bool m_deliverPackets = true;
private int m_animationSequenceNumber = 1;
private bool m_SendLogoutPacketWhenClosing = true;
-
- ///
- /// We retain a single AgentUpdateArgs so that we can constantly reuse it rather than construct a new one for
- /// every single incoming AgentUpdate. Every client sends 10 AgentUpdate UDP messages per second, even if it
- /// is doing absolutely nothing.
- ///
- ///
- /// This does mean that agent updates must be processed synchronously, at least for each client, and called methods
- /// cannot retain a reference to it outside of that method.
- ///
- private AgentUpdateArgs m_lastAgentUpdateArgs;
+ private AgentUpdateArgs lastarg;
protected Dictionary m_packetHandlers = new Dictionary();
protected Dictionary m_genericPacketHandlers = new Dictionary(); //PauPaw:Local Generic Message handlers
@@ -521,18 +510,19 @@ namespace OpenSim.Region.ClientStack.LindenUDP
///
public void Close()
{
- Close(true, false);
+ Close(true);
}
- public void Close(bool sendStop, bool force)
+ ///
+ /// Shut down the client view
+ ///
+ public void Close(bool sendStop)
{
// We lock here to prevent race conditions between two threads calling close simultaneously (e.g.
// a simultaneous relog just as a client is being closed out due to no packet ack from the old connection.
lock (CloseSyncLock)
{
- // We still perform a force close inside the sync lock since this is intended to attempt close where
- // there is some unidentified connection problem, not where we have issues due to deadlock
- if (!IsActive && !force)
+ if (!IsActive)
return;
IsActive = false;
@@ -847,9 +837,8 @@ namespace OpenSim.Region.ClientStack.LindenUDP
OutPacket(mov, ThrottleOutPacketType.Unknown);
}
- public void SendChatMessage(
- string message, byte type, Vector3 fromPos, string fromName,
- UUID fromAgentID, UUID ownerID, byte source, byte audible)
+ public void SendChatMessage(string message, byte type, Vector3 fromPos, string fromName,
+ UUID fromAgentID, byte source, byte audible)
{
ChatFromSimulatorPacket reply = (ChatFromSimulatorPacket)PacketPool.Instance.GetPacket(PacketType.ChatFromSimulator);
reply.ChatData.Audible = audible;
@@ -858,7 +847,7 @@ namespace OpenSim.Region.ClientStack.LindenUDP
reply.ChatData.SourceType = source;
reply.ChatData.Position = fromPos;
reply.ChatData.FromName = Util.StringToBytes256(fromName);
- reply.ChatData.OwnerID = ownerID;
+ reply.ChatData.OwnerID = fromAgentID;
reply.ChatData.SourceID = fromAgentID;
OutPacket(reply, ThrottleOutPacketType.Unknown);
@@ -3996,8 +3985,7 @@ namespace OpenSim.Region.ClientStack.LindenUDP
{
List blocks = terseAgentUpdateBlocks.Value;
- ImprovedTerseObjectUpdatePacket packet
- = (ImprovedTerseObjectUpdatePacket)PacketPool.Instance.GetPacket(PacketType.ImprovedTerseObjectUpdate);
+ ImprovedTerseObjectUpdatePacket packet = new ImprovedTerseObjectUpdatePacket();
packet.RegionData.RegionHandle = m_scene.RegionInfo.RegionHandle;
packet.RegionData.TimeDilation = timeDilation;
packet.ObjectData = new ImprovedTerseObjectUpdatePacket.ObjectDataBlock[blocks.Count];
@@ -4042,9 +4030,7 @@ namespace OpenSim.Region.ClientStack.LindenUDP
{
List blocks = terseUpdateBlocks.Value;
- ImprovedTerseObjectUpdatePacket packet
- = (ImprovedTerseObjectUpdatePacket)PacketPool.Instance.GetPacket(
- PacketType.ImprovedTerseObjectUpdate);
+ ImprovedTerseObjectUpdatePacket packet = new ImprovedTerseObjectUpdatePacket();
packet.RegionData.RegionHandle = m_scene.RegionInfo.RegionHandle;
packet.RegionData.TimeDilation = timeDilation;
packet.ObjectData = new ImprovedTerseObjectUpdatePacket.ObjectDataBlock[blocks.Count];
@@ -4052,7 +4038,7 @@ namespace OpenSim.Region.ClientStack.LindenUDP
for (int i = 0; i < blocks.Count; i++)
packet.ObjectData[i] = blocks[i];
- OutPacket(packet, ThrottleOutPacketType.Task, true, delegate(OutgoingPacket oPacket) { ResendPrimUpdates(terseUpdates.Value, oPacket); });
+ OutPacket(packet, ThrottleOutPacketType.Task, true);
}
#endregion Packet Sending
@@ -4549,7 +4535,7 @@ namespace OpenSim.Region.ClientStack.LindenUDP
{
returnblock[j] = new EstateOwnerMessagePacket.ParamListBlock();
}
- j = 0;
+ j = 0;
returnblock[j].Parameter = Utils.StringToBytes(estateID.ToString()); j++;
returnblock[j].Parameter = Utils.StringToBytes(((int)Constants.EstateAccessCodex.EstateBans).ToString()); j++;
@@ -5053,9 +5039,7 @@ namespace OpenSim.Region.ClientStack.LindenUDP
Utils.UInt16ToBytes(Utils.FloatToUInt16(angularVelocity.Y, -64.0f, 64.0f), data, pos); pos += 2;
Utils.UInt16ToBytes(Utils.FloatToUInt16(angularVelocity.Z, -64.0f, 64.0f), data, pos); pos += 2;
- ImprovedTerseObjectUpdatePacket.ObjectDataBlock block
- = PacketPool.Instance.GetDataBlock();
-
+ ImprovedTerseObjectUpdatePacket.ObjectDataBlock block = new ImprovedTerseObjectUpdatePacket.ObjectDataBlock();
block.Data = data;
if (textureEntry != null && textureEntry.Length > 0)
@@ -5305,18 +5289,14 @@ namespace OpenSim.Region.ClientStack.LindenUDP
protected virtual void RegisterLocalPacketHandlers()
{
AddLocalPacketHandler(PacketType.LogoutRequest, HandleLogout);
-
- // If AgentUpdate is ever handled asynchronously, then we will also need to construct a new AgentUpdateArgs
- // for each AgentUpdate packet.
AddLocalPacketHandler(PacketType.AgentUpdate, HandleAgentUpdate, false);
-
AddLocalPacketHandler(PacketType.ViewerEffect, HandleViewerEffect, false);
AddLocalPacketHandler(PacketType.AgentCachedTexture, HandleAgentTextureCached, false);
AddLocalPacketHandler(PacketType.MultipleObjectUpdate, HandleMultipleObjUpdate, false);
AddLocalPacketHandler(PacketType.MoneyTransferRequest, HandleMoneyTransferRequest, false);
AddLocalPacketHandler(PacketType.ParcelBuy, HandleParcelBuyRequest, false);
- AddLocalPacketHandler(PacketType.UUIDGroupNameRequest, HandleUUIDGroupNameRequest);
- AddLocalPacketHandler(PacketType.ObjectGroup, HandleObjectGroupRequest);
+ AddLocalPacketHandler(PacketType.UUIDGroupNameRequest, HandleUUIDGroupNameRequest, false);
+ AddLocalPacketHandler(PacketType.ObjectGroup, HandleObjectGroupRequest, false);
AddLocalPacketHandler(PacketType.GenericMessage, HandleGenericMessage);
AddLocalPacketHandler(PacketType.AvatarPropertiesRequest, HandleAvatarPropertiesRequest);
AddLocalPacketHandler(PacketType.ChatFromViewer, HandleChatFromViewer);
@@ -5538,84 +5518,81 @@ namespace OpenSim.Region.ClientStack.LindenUDP
#region Scene/Avatar
- private bool HandleAgentUpdate(IClientAPI sener, Packet packet)
+ private bool HandleAgentUpdate(IClientAPI sener, Packet Pack)
{
if (OnAgentUpdate != null)
{
- AgentUpdatePacket agentUpdate = (AgentUpdatePacket)packet;
+ bool update = false;
+ AgentUpdatePacket agenUpdate = (AgentUpdatePacket)Pack;
#region Packet Session and User Check
- if (agentUpdate.AgentData.SessionID != SessionId || agentUpdate.AgentData.AgentID != AgentId)
- {
- PacketPool.Instance.ReturnPacket(packet);
+ if (agenUpdate.AgentData.SessionID != SessionId || agenUpdate.AgentData.AgentID != AgentId)
return false;
- }
#endregion
- bool update = false;
- AgentUpdatePacket.AgentDataBlock x = agentUpdate.AgentData;
+ AgentUpdatePacket.AgentDataBlock x = agenUpdate.AgentData;
+
+ // We can only check when we have something to check
+ // against.
- if (m_lastAgentUpdateArgs != null)
+ if (lastarg != null)
{
- // These should be ordered from most-likely to
- // least likely to change. I've made an initial
- // guess at that.
update =
(
- (x.BodyRotation != m_lastAgentUpdateArgs.BodyRotation) ||
- (x.CameraAtAxis != m_lastAgentUpdateArgs.CameraAtAxis) ||
- (x.CameraCenter != m_lastAgentUpdateArgs.CameraCenter) ||
- (x.CameraLeftAxis != m_lastAgentUpdateArgs.CameraLeftAxis) ||
- (x.CameraUpAxis != m_lastAgentUpdateArgs.CameraUpAxis) ||
- (x.ControlFlags != m_lastAgentUpdateArgs.ControlFlags) ||
+ (x.BodyRotation != lastarg.BodyRotation) ||
+ (x.CameraAtAxis != lastarg.CameraAtAxis) ||
+ (x.CameraCenter != lastarg.CameraCenter) ||
+ (x.CameraLeftAxis != lastarg.CameraLeftAxis) ||
+ (x.CameraUpAxis != lastarg.CameraUpAxis) ||
+ (x.ControlFlags != lastarg.ControlFlags) ||
(x.ControlFlags != 0) ||
- (x.Far != m_lastAgentUpdateArgs.Far) ||
- (x.Flags != m_lastAgentUpdateArgs.Flags) ||
- (x.State != m_lastAgentUpdateArgs.State) ||
- (x.HeadRotation != m_lastAgentUpdateArgs.HeadRotation) ||
- (x.SessionID != m_lastAgentUpdateArgs.SessionID) ||
- (x.AgentID != m_lastAgentUpdateArgs.AgentID)
+ (x.Far != lastarg.Far) ||
+ (x.Flags != lastarg.Flags) ||
+ (x.State != lastarg.State) ||
+ (x.HeadRotation != lastarg.HeadRotation) ||
+ (x.SessionID != lastarg.SessionID) ||
+ (x.AgentID != lastarg.AgentID)
);
}
else
{
- m_lastAgentUpdateArgs = new AgentUpdateArgs();
update = true;
}
+ // These should be ordered from most-likely to
+ // least likely to change. I've made an initial
+ // guess at that.
+
if (update)
{
// m_log.DebugFormat("[LLCLIENTVIEW]: Triggered AgentUpdate for {0}", sener.Name);
- m_lastAgentUpdateArgs.AgentID = x.AgentID;
- m_lastAgentUpdateArgs.BodyRotation = x.BodyRotation;
- m_lastAgentUpdateArgs.CameraAtAxis = x.CameraAtAxis;
- m_lastAgentUpdateArgs.CameraCenter = x.CameraCenter;
- m_lastAgentUpdateArgs.CameraLeftAxis = x.CameraLeftAxis;
- m_lastAgentUpdateArgs.CameraUpAxis = x.CameraUpAxis;
- m_lastAgentUpdateArgs.ControlFlags = x.ControlFlags;
- m_lastAgentUpdateArgs.Far = x.Far;
- m_lastAgentUpdateArgs.Flags = x.Flags;
- m_lastAgentUpdateArgs.HeadRotation = x.HeadRotation;
- m_lastAgentUpdateArgs.SessionID = x.SessionID;
- m_lastAgentUpdateArgs.State = x.State;
-
+ AgentUpdateArgs arg = new AgentUpdateArgs();
+ arg.AgentID = x.AgentID;
+ arg.BodyRotation = x.BodyRotation;
+ arg.CameraAtAxis = x.CameraAtAxis;
+ arg.CameraCenter = x.CameraCenter;
+ arg.CameraLeftAxis = x.CameraLeftAxis;
+ arg.CameraUpAxis = x.CameraUpAxis;
+ arg.ControlFlags = x.ControlFlags;
+ arg.Far = x.Far;
+ arg.Flags = x.Flags;
+ arg.HeadRotation = x.HeadRotation;
+ arg.SessionID = x.SessionID;
+ arg.State = x.State;
UpdateAgent handlerAgentUpdate = OnAgentUpdate;
UpdateAgent handlerPreAgentUpdate = OnPreAgentUpdate;
-
+ lastarg = arg; // save this set of arguments for nexttime
if (handlerPreAgentUpdate != null)
- OnPreAgentUpdate(this, m_lastAgentUpdateArgs);
-
+ OnPreAgentUpdate(this, arg);
if (handlerAgentUpdate != null)
- OnAgentUpdate(this, m_lastAgentUpdateArgs);
+ OnAgentUpdate(this, arg);
handlerAgentUpdate = null;
handlerPreAgentUpdate = null;
}
}
- PacketPool.Instance.ReturnPacket(packet);
-
return true;
}
@@ -5987,8 +5964,7 @@ namespace OpenSim.Region.ClientStack.LindenUDP
msgpack.MessageBlock.ID,
msgpack.MessageBlock.Offline != 0 ? true : false,
msgpack.MessageBlock.Position,
- msgpack.MessageBlock.BinaryBucket,
- true);
+ msgpack.MessageBlock.BinaryBucket);
handlerInstantMessage(this, im);
}
@@ -9275,9 +9251,7 @@ namespace OpenSim.Region.ClientStack.LindenUDP
}
#endregion
- string method = Utils.BytesToString(messagePacket.MethodData.Method);
-
- switch (method)
+ switch (Utils.BytesToString(messagePacket.MethodData.Method))
{
case "getinfo":
if (((Scene)m_scene).Permissions.CanIssueEstateCommand(AgentId, false))
@@ -9593,17 +9567,7 @@ namespace OpenSim.Region.ClientStack.LindenUDP
return true;
default:
- m_log.WarnFormat(
- "[LLCLIENTVIEW]: EstateOwnerMessage: Unknown method {0} requested for {1} in {2}",
- method, Name, Scene.Name);
-
- for (int i = 0; i < messagePacket.ParamList.Length; i++)
- {
- EstateOwnerMessagePacket.ParamListBlock block = messagePacket.ParamList[i];
- string data = (string)Utils.BytesToString(block.Parameter);
- m_log.DebugFormat("[LLCLIENTVIEW]: Param {0}={1}", i, data);
- }
-
+ m_log.Error("EstateOwnerMessage: Unknown method requested\n" + messagePacket);
return true;
}
@@ -11996,7 +11960,7 @@ namespace OpenSim.Region.ClientStack.LindenUDP
logPacket = false;
if (DebugPacketLevel <= 50
- && (packet.Type == PacketType.ImprovedTerseObjectUpdate || packet.Type == PacketType.ObjectUpdate))
+ & (packet.Type == PacketType.ImprovedTerseObjectUpdate || packet.Type == PacketType.ObjectUpdate))
logPacket = false;
if (DebugPacketLevel <= 25 && packet.Type == PacketType.ObjectPropertiesFamily)
@@ -12070,6 +12034,8 @@ namespace OpenSim.Region.ClientStack.LindenUDP
if (!ProcessPacketMethod(packet))
m_log.Warn("[CLIENT]: unhandled packet " + packet.Type);
+
+ PacketPool.Instance.ReturnPacket(packet);
}
private static PrimitiveBaseShape GetShapeFromAddPacket(ObjectAddPacket addPacket)
@@ -12238,7 +12204,7 @@ namespace OpenSim.Region.ClientStack.LindenUDP
{
Kick(reason);
Thread.Sleep(1000);
- Disconnect();
+ Close();
}
public void Disconnect()
@@ -12526,10 +12492,7 @@ namespace OpenSim.Region.ClientStack.LindenUDP
ushort timeDilation = Utils.FloatToUInt16(TIME_DILATION, 0.0f, 1.0f);
- ImprovedTerseObjectUpdatePacket packet
- = (ImprovedTerseObjectUpdatePacket)PacketPool.Instance.GetPacket(
- PacketType.ImprovedTerseObjectUpdate);
-
+ ImprovedTerseObjectUpdatePacket packet = new ImprovedTerseObjectUpdatePacket();
packet.RegionData.RegionHandle = m_scene.RegionInfo.RegionHandle;
packet.RegionData.TimeDilation = timeDilation;
packet.ObjectData = new ImprovedTerseObjectUpdatePacket.ObjectDataBlock[1];
diff --git a/OpenSim/Region/ClientStack/Linden/UDP/LLUDPServer.cs b/OpenSim/Region/ClientStack/Linden/UDP/LLUDPServer.cs
index b8951d9..d6513c5 100644
--- a/OpenSim/Region/ClientStack/Linden/UDP/LLUDPServer.cs
+++ b/OpenSim/Region/ClientStack/Linden/UDP/LLUDPServer.cs
@@ -37,7 +37,6 @@ using log4net;
using Nini.Config;
using OpenMetaverse.Packets;
using OpenSim.Framework;
-using OpenSim.Framework.Console;
using OpenSim.Framework.Monitoring;
using OpenSim.Region.Framework.Scenes;
using OpenMetaverse;
@@ -101,11 +100,9 @@ namespace OpenSim.Region.ClientStack.LindenUDP
/// The measured resolution of Environment.TickCount
public readonly float TickCountResolution;
-
/// Number of prim updates to put on the queue each time the
/// OnQueueEmpty event is triggered for updates
public readonly int PrimUpdatesPerCallback;
-
/// Number of texture packets to put on the queue each time the
/// OnQueueEmpty event is triggered for textures
public readonly int TextureSendLimit;
@@ -127,37 +124,28 @@ namespace OpenSim.Region.ClientStack.LindenUDP
/// Manages authentication for agent circuits
private AgentCircuitManager m_circuitManager;
-
/// Reference to the scene this UDP server is attached to
protected Scene m_scene;
-
/// The X/Y coordinates of the scene this UDP server is attached to
private Location m_location;
-
/// The size of the receive buffer for the UDP socket. This value
/// is passed up to the operating system and used in the system networking
/// stack. Use zero to leave this value as the default
private int m_recvBufferSize;
-
/// Flag to process packets asynchronously or synchronously
private bool m_asyncPacketHandling;
-
/// Tracks whether or not a packet was sent each round so we know
/// whether or not to sleep
private bool m_packetSent;
/// Environment.TickCount of the last time that packet stats were reported to the scene
private int m_elapsedMSSinceLastStatReport = 0;
-
/// Environment.TickCount of the last time the outgoing packet handler executed
private int m_tickLastOutgoingPacketHandler;
-
/// Keeps track of the number of elapsed milliseconds since the last time the outgoing packet handler looped
private int m_elapsedMSOutgoingPacketHandler;
-
/// Keeps track of the number of 100 millisecond periods elapsed in the outgoing packet handler executed
private int m_elapsed100MSOutgoingPacketHandler;
-
/// Keeps track of the number of 500 millisecond periods elapsed in the outgoing packet handler executed
private int m_elapsed500MSOutgoingPacketHandler;
@@ -171,9 +159,6 @@ namespace OpenSim.Region.ClientStack.LindenUDP
protected bool m_sendPing;
private ExpiringCache> m_pendingCache = new ExpiringCache>();
- private Pool m_incomingPacketPool;
-
- private Stat m_incomingPacketPoolStat;
private int m_defaultRTO = 0;
private int m_maxRTO = 0;
@@ -195,9 +180,7 @@ namespace OpenSim.Region.ClientStack.LindenUDP
///
private IClientAPI m_currentIncomingClient;
- public LLUDPServer(
- IPAddress listenIP, ref uint port, int proxyPortOffsetParm, bool allow_alternate_port,
- IConfigSource configSource, AgentCircuitManager circuitManager)
+ public LLUDPServer(IPAddress listenIP, ref uint port, int proxyPortOffsetParm, bool allow_alternate_port, IConfigSource configSource, AgentCircuitManager circuitManager)
: base(listenIP, (int)port)
{
#region Environment.TickCount Measurement
@@ -219,7 +202,6 @@ namespace OpenSim.Region.ClientStack.LindenUDP
m_circuitManager = circuitManager;
int sceneThrottleBps = 0;
- bool usePools = false;
IConfig config = configSource.Configs["ClientStack.LindenUDP"];
if (config != null)
@@ -245,16 +227,6 @@ namespace OpenSim.Region.ClientStack.LindenUDP
m_pausedAckTimeout = 1000 * 300; // 5 minutes
}
- // FIXME: This actually only needs to be done once since the PacketPool is shared across all servers.
- // However, there is no harm in temporarily doing it multiple times.
- IConfig packetConfig = configSource.Configs["PacketPool"];
- if (packetConfig != null)
- {
- PacketPool.Instance.RecyclePackets = packetConfig.GetBoolean("RecyclePackets", true);
- PacketPool.Instance.RecycleDataBlocks = packetConfig.GetBoolean("RecycleDataBlocks", true);
- usePools = packetConfig.GetBoolean("RecycleBaseUDPPackets", usePools);
- }
-
#region BinaryStats
config = configSource.Configs["Statistics.Binary"];
m_shouldCollectStats = false;
@@ -282,28 +254,20 @@ namespace OpenSim.Region.ClientStack.LindenUDP
m_throttle = new TokenBucket(null, sceneThrottleBps);
ThrottleRates = new ThrottleRates(configSource);
-
- if (usePools)
- EnablePools();
}
public void Start()
{
- StartInbound();
- StartOutbound();
+ if (m_scene == null)
+ throw new InvalidOperationException("[LLUDPSERVER]: Cannot LLUDPServer.Start() without an IScene reference");
- m_elapsedMSSinceLastStatReport = Environment.TickCount;
- }
-
- private void StartInbound()
- {
m_log.InfoFormat(
- "[LLUDPSERVER]: Starting inbound packet processing for the LLUDP server in {0} mode with UsePools = {1}",
- m_asyncPacketHandling ? "asynchronous" : "synchronous", UsePools);
+ "[LLUDPSERVER]: Starting the LLUDP server in {0} mode",
+ m_asyncPacketHandling ? "asynchronous" : "synchronous");
- base.StartInbound(m_recvBufferSize, m_asyncPacketHandling);
+ base.Start(m_recvBufferSize, m_asyncPacketHandling);
- // This thread will process the packets received that are placed on the packetInbox
+ // Start the packet processing threads
Watchdog.StartThread(
IncomingPacketHandler,
string.Format("Incoming Packets ({0})", m_scene.RegionInfo.RegionName),
@@ -312,13 +276,6 @@ namespace OpenSim.Region.ClientStack.LindenUDP
true,
GetWatchdogIncomingAlarmData,
Watchdog.DEFAULT_WATCHDOG_TIMEOUT_MS);
- }
-
- private new void StartOutbound()
- {
- m_log.Info("[LLUDPSERVER]: Starting outbound packet processing for the LLUDP server");
-
- base.StartOutbound();
Watchdog.StartThread(
OutgoingPacketHandler,
@@ -328,57 +285,8 @@ namespace OpenSim.Region.ClientStack.LindenUDP
true,
GetWatchdogOutgoingAlarmData,
Watchdog.DEFAULT_WATCHDOG_TIMEOUT_MS);
- }
-
- public void Stop()
- {
- m_log.Info("[LLUDPSERVER]: Shutting down the LLUDP server for " + m_scene.RegionInfo.RegionName);
- base.StopOutbound();
- base.StopInbound();
- }
- protected override bool EnablePools()
- {
- if (!UsePools)
- {
- base.EnablePools();
-
- m_incomingPacketPool = new Pool(() => new IncomingPacket(), 500);
-
- m_incomingPacketPoolStat
- = new Stat(
- "IncomingPacketPoolCount",
- "Objects within incoming packet pool",
- "The number of objects currently stored within the incoming packet pool",
- "",
- "clientstack",
- "packetpool",
- StatType.Pull,
- stat => stat.Value = m_incomingPacketPool.Count,
- StatVerbosity.Debug);
-
- StatsManager.RegisterStat(m_incomingPacketPoolStat);
-
- return true;
- }
-
- return false;
- }
-
- protected override bool DisablePools()
- {
- if (UsePools)
- {
- base.DisablePools();
-
- StatsManager.DeregisterStat(m_incomingPacketPoolStat);
-
- // We won't null out the pool to avoid a race condition with code that may be in the middle of using it.
-
- return true;
- }
-
- return false;
+ m_elapsedMSSinceLastStatReport = Environment.TickCount;
}
///
@@ -403,6 +311,12 @@ namespace OpenSim.Region.ClientStack.LindenUDP
m_currentOutgoingClient != null ? m_currentOutgoingClient.Name : "none");
}
+ public new void Stop()
+ {
+ m_log.Info("[LLUDPSERVER]: Shutting down the LLUDP server for " + m_scene.RegionInfo.RegionName);
+ base.Stop();
+ }
+
public void AddScene(IScene scene)
{
if (m_scene != null)
@@ -419,117 +333,6 @@ namespace OpenSim.Region.ClientStack.LindenUDP
m_scene = (Scene)scene;
m_location = new Location(m_scene.RegionInfo.RegionHandle);
-
- MainConsole.Instance.Commands.AddCommand(
- "Debug",
- false,
- "debug lludp start",
- "debug lludp start ",
- "Control LLUDP packet processing.",
- "No effect if packet processing has already started.\n"
- + "in - start inbound processing.\n"
- + "out - start outbound processing.\n"
- + "all - start in and outbound processing.\n",
- HandleStartCommand);
-
- MainConsole.Instance.Commands.AddCommand(
- "Debug",
- false,
- "debug lludp stop",
- "debug lludp stop ",
- "Stop LLUDP packet processing.",
- "No effect if packet processing has already stopped.\n"
- + "in - stop inbound processing.\n"
- + "out - stop outbound processing.\n"
- + "all - stop in and outbound processing.\n",
- HandleStopCommand);
-
- MainConsole.Instance.Commands.AddCommand(
- "Debug",
- false,
- "debug lludp pool",
- "debug lludp pool ",
- "Turn object pooling within the lludp component on or off.",
- HandlePoolCommand);
-
- MainConsole.Instance.Commands.AddCommand(
- "Debug",
- false,
- "debug lludp status",
- "debug lludp status",
- "Return status of LLUDP packet processing.",
- HandleStatusCommand);
- }
-
- private void HandleStartCommand(string module, string[] args)
- {
- if (args.Length != 4)
- {
- MainConsole.Instance.Output("Usage: debug lludp start ");
- return;
- }
-
- string subCommand = args[3];
-
- if (subCommand == "in" || subCommand == "all")
- StartInbound();
-
- if (subCommand == "out" || subCommand == "all")
- StartOutbound();
- }
-
- private void HandleStopCommand(string module, string[] args)
- {
- if (args.Length != 4)
- {
- MainConsole.Instance.Output("Usage: debug lludp stop ");
- return;
- }
-
- string subCommand = args[3];
-
- if (subCommand == "in" || subCommand == "all")
- StopInbound();
-
- if (subCommand == "out" || subCommand == "all")
- StopOutbound();
- }
-
- private void HandlePoolCommand(string module, string[] args)
- {
- if (args.Length != 4)
- {
- MainConsole.Instance.Output("Usage: debug lludp pool ");
- return;
- }
-
- string enabled = args[3];
-
- if (enabled == "on")
- {
- if (EnablePools())
- MainConsole.Instance.OutputFormat("Packet pools enabled on {0}", m_scene.Name);
- }
- else if (enabled == "off")
- {
- if (DisablePools())
- MainConsole.Instance.OutputFormat("Packet pools disabled on {0}", m_scene.Name);
- }
- else
- {
- MainConsole.Instance.Output("Usage: debug lludp pool ");
- }
- }
-
- private void HandleStatusCommand(string module, string[] args)
- {
- MainConsole.Instance.OutputFormat(
- "IN LLUDP packet processing for {0} is {1}", m_scene.Name, IsRunningInbound ? "enabled" : "disabled");
-
- MainConsole.Instance.OutputFormat(
- "OUT LLUDP packet processing for {0} is {1}", m_scene.Name, IsRunningOutbound ? "enabled" : "disabled");
-
- MainConsole.Instance.OutputFormat("LLUDP pools in {0} are {1}", m_scene.Name, UsePools ? "on" : "off");
}
public bool HandlesRegion(Location x)
@@ -613,8 +416,6 @@ namespace OpenSim.Region.ClientStack.LindenUDP
byte[] data = packet.ToBytes();
SendPacketData(udpClient, data, packet.Type, category, method);
}
-
- PacketPool.Instance.ReturnPacket(packet);
}
///
@@ -899,7 +700,7 @@ namespace OpenSim.Region.ClientStack.LindenUDP
LLUDPClient udpClient = null;
Packet packet = null;
int packetEnd = buffer.DataLength - 1;
- IPEndPoint endPoint = (IPEndPoint)buffer.RemoteEndPoint;
+ IPEndPoint address = (IPEndPoint)buffer.RemoteEndPoint;
#region Decoding
@@ -909,7 +710,7 @@ namespace OpenSim.Region.ClientStack.LindenUDP
// "[LLUDPSERVER]: Dropping undersized packet with {0} bytes received from {1} in {2}",
// buffer.DataLength, buffer.RemoteEndPoint, m_scene.RegionInfo.RegionName);
- return; // Drop undersized packet
+ return; // Drop undersizd packet
}
int headerLen = 7;
@@ -932,13 +733,7 @@ namespace OpenSim.Region.ClientStack.LindenUDP
try
{
-// packet = Packet.BuildPacket(buffer.Data, ref packetEnd,
-// // Only allocate a buffer for zerodecoding if the packet is zerocoded
-// ((buffer.Data[0] & Helpers.MSG_ZEROCODED) != 0) ? new byte[4096] : null);
- // If OpenSimUDPBase.UsePool == true (which is currently separate from the PacketPool) then we
- // assume that packet construction does not retain a reference to byte[] buffer.Data (instead, all
- // bytes are copied out).
- packet = PacketPool.Instance.GetPacket(buffer.Data, ref packetEnd,
+ packet = Packet.BuildPacket(buffer.Data, ref packetEnd,
// Only allocate a buffer for zerodecoding if the packet is zerocoded
((buffer.Data[0] & Helpers.MSG_ZEROCODED) != 0) ? new byte[4096] : null);
}
@@ -953,13 +748,11 @@ namespace OpenSim.Region.ClientStack.LindenUDP
return; // Drop short packet
}
- catch (Exception e)
+ catch(Exception e)
{
if (m_malformedCount < 100)
m_log.DebugFormat("[LLUDPSERVER]: Dropped malformed packet: " + e.ToString());
-
m_malformedCount++;
-
if ((m_malformedCount % 100000) == 0)
m_log.DebugFormat("[LLUDPSERVER]: Received {0} malformed packets so far, probable network attack.", m_malformedCount);
}
@@ -979,7 +772,7 @@ namespace OpenSim.Region.ClientStack.LindenUDP
// If there is already a client for this endpoint, don't process UseCircuitCode
IClientAPI client = null;
- if (!m_scene.TryGetClient(endPoint, out client) || !(client is LLClientView))
+ if (!m_scene.TryGetClient(address, out client))
{
// UseCircuitCode handling
if (packet.Type == PacketType.UseCircuitCode)
@@ -987,15 +780,13 @@ namespace OpenSim.Region.ClientStack.LindenUDP
// And if there is a UseCircuitCode pending, also drop it
lock (m_pendingCache)
{
- if (m_pendingCache.Contains(endPoint))
+ if (m_pendingCache.Contains(address))
return;
- m_pendingCache.AddOrUpdate(endPoint, new Queue(), 60);
+ m_pendingCache.AddOrUpdate(address, new Queue(), 60);
}
- // We need to copy the endpoint so that it doesn't get changed when another thread reuses the
- // buffer.
- object[] array = new object[] { new IPEndPoint(endPoint.Address, endPoint.Port), packet };
+ object[] array = new object[] { buffer, packet };
Util.FireAndForget(HandleUseCircuitCode, array);
@@ -1007,7 +798,7 @@ namespace OpenSim.Region.ClientStack.LindenUDP
lock (m_pendingCache)
{
Queue queue;
- if (m_pendingCache.TryGetValue(endPoint, out queue))
+ if (m_pendingCache.TryGetValue(address, out queue))
{
//m_log.DebugFormat("[LLUDPSERVER]: Enqueued a {0} packet into the pending queue", packet.Type);
queue.Enqueue(buffer);
@@ -1043,10 +834,6 @@ namespace OpenSim.Region.ClientStack.LindenUDP
// Handle appended ACKs
if (packet.Header.AppendedAcks && packet.Header.AckList != null)
{
-// m_log.DebugFormat(
-// "[LLUDPSERVER]: Handling {0} appended acks from {1} in {2}",
-// packet.Header.AckList.Length, client.Name, m_scene.Name);
-
for (int i = 0; i < packet.Header.AckList.Length; i++)
udpClient.NeedAcks.Acknowledge(packet.Header.AckList[i], now, packet.Header.Resent);
}
@@ -1056,10 +843,6 @@ namespace OpenSim.Region.ClientStack.LindenUDP
{
PacketAckPacket ackPacket = (PacketAckPacket)packet;
-// m_log.DebugFormat(
-// "[LLUDPSERVER]: Handling {0} packet acks for {1} in {2}",
-// ackPacket.Packets.Length, client.Name, m_scene.Name);
-
for (int i = 0; i < ackPacket.Packets.Length; i++)
udpClient.NeedAcks.Acknowledge(ackPacket.Packets[i].ID, now, packet.Header.Resent);
@@ -1073,10 +856,6 @@ namespace OpenSim.Region.ClientStack.LindenUDP
if (packet.Header.Reliable)
{
-// m_log.DebugFormat(
-// "[LLUDPSERVER]: Adding ack request for {0} {1} from {2} in {3}",
-// packet.Type, packet.Header.Sequence, client.Name, m_scene.Name);
-
udpClient.PendingAcks.Enqueue(packet.Header.Sequence);
// This is a somewhat odd sequence of steps to pull the client.BytesSinceLastACK value out,
@@ -1123,8 +902,6 @@ namespace OpenSim.Region.ClientStack.LindenUDP
if (packet.Type == PacketType.StartPingCheck)
{
-// m_log.DebugFormat("[LLUDPSERVER]: Handling ping from {0} in {1}", client.Name, m_scene.Name);
-
// We don't need to do anything else with ping checks
StartPingCheckPacket startPing = (StartPingCheckPacket)packet;
CompletePing(udpClient, startPing.PingID.PingID);
@@ -1144,25 +921,13 @@ namespace OpenSim.Region.ClientStack.LindenUDP
#endregion Ping Check Handling
- IncomingPacket incomingPacket;
-
// Inbox insertion
- if (UsePools)
- {
- incomingPacket = m_incomingPacketPool.GetObject();
- incomingPacket.Client = (LLClientView)client;
- incomingPacket.Packet = packet;
- }
- else
- {
- incomingPacket = new IncomingPacket((LLClientView)client, packet);
- }
-
- if (incomingPacket.Packet.Type == PacketType.AgentUpdate ||
- incomingPacket.Packet.Type == PacketType.ChatFromViewer)
- packetInbox.EnqueueHigh(incomingPacket);
+ if (packet.Type == PacketType.AgentUpdate ||
+ packet.Type == PacketType.ChatFromViewer)
+ packetInbox.EnqueueHigh(new IncomingPacket((LLClientView)client, packet));
else
- packetInbox.EnqueueLow(incomingPacket);
+ packetInbox.EnqueueLow(new IncomingPacket((LLClientView)client, packet));
+// packetInbox.Enqueue(new IncomingPacket((LLClientView)client, packet));
}
#region BinaryStats
@@ -1248,19 +1013,21 @@ namespace OpenSim.Region.ClientStack.LindenUDP
private void HandleUseCircuitCode(object o)
{
- IPEndPoint endPoint = null;
+ IPEndPoint remoteEndPoint = null;
IClientAPI client = null;
try
{
// DateTime startTime = DateTime.Now;
object[] array = (object[])o;
- endPoint = (IPEndPoint)array[0];
+ UDPPacketBuffer buffer = (UDPPacketBuffer)array[0];
UseCircuitCodePacket uccp = (UseCircuitCodePacket)array[1];
m_log.DebugFormat(
"[LLUDPSERVER]: Handling UseCircuitCode request for circuit {0} to {1} from IP {2}",
- uccp.CircuitCode.Code, m_scene.RegionInfo.RegionName, endPoint);
+ uccp.CircuitCode.Code, m_scene.RegionInfo.RegionName, buffer.RemoteEndPoint);
+
+ remoteEndPoint = (IPEndPoint)buffer.RemoteEndPoint;
AuthenticateResponse sessionInfo;
if (IsClientAuthorized(uccp, out sessionInfo))
@@ -1271,13 +1038,13 @@ namespace OpenSim.Region.ClientStack.LindenUDP
uccp.CircuitCode.Code,
uccp.CircuitCode.ID,
uccp.CircuitCode.SessionID,
- endPoint,
+ remoteEndPoint,
sessionInfo);
// Send ack straight away to let the viewer know that the connection is active.
// The client will be null if it already exists (e.g. if on a region crossing the client sends a use
// circuit code to the existing child agent. This is not particularly obvious.
- SendAckImmediate(endPoint, uccp.Header.Sequence);
+ SendAckImmediate(remoteEndPoint, uccp.Header.Sequence);
// We only want to send initial data to new clients, not ones which are being converted from child to root.
if (client != null)
@@ -1291,12 +1058,12 @@ namespace OpenSim.Region.ClientStack.LindenUDP
lock (m_pendingCache)
{
- if (!m_pendingCache.TryGetValue(endPoint, out queue))
+ if (!m_pendingCache.TryGetValue(remoteEndPoint, out queue))
{
m_log.DebugFormat("[LLUDPSERVER]: Client created but no pending queue present");
return;
}
- m_pendingCache.Remove(endPoint);
+ m_pendingCache.Remove(remoteEndPoint);
}
m_log.DebugFormat("[LLUDPSERVER]: Client created, processing pending queue, {0} entries", queue.Count);
@@ -1314,9 +1081,9 @@ namespace OpenSim.Region.ClientStack.LindenUDP
// Don't create clients for unauthorized requesters.
m_log.WarnFormat(
"[LLUDPSERVER]: Ignoring connection request for {0} to {1} with unknown circuit code {2} from IP {3}",
- uccp.CircuitCode.ID, m_scene.RegionInfo.RegionName, uccp.CircuitCode.Code, endPoint);
+ uccp.CircuitCode.ID, m_scene.RegionInfo.RegionName, uccp.CircuitCode.Code, remoteEndPoint);
lock (m_pendingCache)
- m_pendingCache.Remove(endPoint);
+ m_pendingCache.Remove(remoteEndPoint);
}
// m_log.DebugFormat(
@@ -1328,7 +1095,7 @@ namespace OpenSim.Region.ClientStack.LindenUDP
{
m_log.ErrorFormat(
"[LLUDPSERVER]: UseCircuitCode handling from endpoint {0}, client {1} {2} failed. Exception {3}{4}",
- endPoint != null ? endPoint.ToString() : "n/a",
+ remoteEndPoint != null ? remoteEndPoint.ToString() : "n/a",
client != null ? client.Name : "unknown",
client != null ? client.AgentId.ToString() : "unknown",
e.Message,
@@ -1393,20 +1160,20 @@ namespace OpenSim.Region.ClientStack.LindenUDP
{
IClientAPI client = null;
- // We currently synchronize this code across the whole scene to avoid issues such as
- // http://opensimulator.org/mantis/view.php?id=5365 However, once locking per agent circuit can be done
- // consistently, this lock could probably be removed.
- lock (this)
+ // In priciple there shouldn't be more than one thread here, ever.
+ // But in case that happens, we need to synchronize this piece of code
+ // because it's too important
+ lock (this)
{
if (!m_scene.TryGetClient(agentID, out client))
{
LLUDPClient udpClient = new LLUDPClient(this, ThrottleRates, m_throttle, circuitCode, agentID, remoteEndPoint, m_defaultRTO, m_maxRTO);
-
+
client = new LLClientView(m_scene, this, udpClient, sessionInfo, agentID, sessionID, circuitCode);
client.OnLogout += LogoutHandler;
-
+
((LLClientView)client).DisableFacelights = m_disableFacelights;
-
+
client.Start();
}
}
@@ -1445,7 +1212,7 @@ namespace OpenSim.Region.ClientStack.LindenUDP
// on to en-US to avoid number parsing issues
Culture.SetCurrentCulture();
- while (IsRunningInbound)
+ while (base.IsRunning)
{
m_scene.ThreadAlive(1);
try
@@ -1461,12 +1228,7 @@ namespace OpenSim.Region.ClientStack.LindenUDP
}
if (packetInbox.Dequeue(100, ref incomingPacket))
- {
ProcessInPacket(incomingPacket);//, incomingPacket); Util.FireAndForget(ProcessInPacket, incomingPacket);
-
- if (UsePools)
- m_incomingPacketPool.ReturnObject(incomingPacket);
- }
}
catch (Exception ex)
{
@@ -1493,7 +1255,7 @@ namespace OpenSim.Region.ClientStack.LindenUDP
// Action generic every round
Action clientPacketHandler = ClientOutgoingPacketHandler;
- while (base.IsRunningOutbound)
+ while (base.IsRunning)
{
m_scene.ThreadAlive(2);
try
@@ -1761,7 +1523,7 @@ namespace OpenSim.Region.ClientStack.LindenUDP
if (!client.IsLoggingOut)
{
client.IsLoggingOut = true;
- client.Close(false, false);
+ client.Close(false);
}
}
}
diff --git a/OpenSim/Region/ClientStack/Linden/UDP/OpenSimUDPBase.cs b/OpenSim/Region/ClientStack/Linden/UDP/OpenSimUDPBase.cs
index 8bd3461..cfe7c9d 100644
--- a/OpenSim/Region/ClientStack/Linden/UDP/OpenSimUDPBase.cs
+++ b/OpenSim/Region/ClientStack/Linden/UDP/OpenSimUDPBase.cs
@@ -30,8 +30,6 @@ using System.Net;
using System.Net.Sockets;
using System.Threading;
using log4net;
-using OpenSim.Framework;
-using OpenSim.Framework.Monitoring;
namespace OpenMetaverse
{
@@ -60,31 +58,17 @@ namespace OpenMetaverse
/// Flag to process packets asynchronously or synchronously
private bool m_asyncPacketHandling;
- ///
- /// Pool to use for handling data. May be null if UsePools = false;
- ///
- protected OpenSim.Framework.Pool m_pool;
-
- ///
- /// Are we to use object pool(s) to reduce memory churn when receiving data?
- ///
- public bool UsePools { get; protected set; }
-
- /// Returns true if the server is currently listening for inbound packets, otherwise false
- public bool IsRunningInbound { get; private set; }
+ /// The all important shutdown flag
+ private volatile bool m_shutdownFlag = true;
- /// Returns true if the server is currently sending outbound packets, otherwise false
- /// If IsRunningOut = false, then any request to send a packet is simply dropped.
- public bool IsRunningOutbound { get; private set; }
-
- private Stat m_poolCountStat;
+ /// Returns true if the server is currently listening, otherwise false
+ public bool IsRunning { get { return !m_shutdownFlag; } }
///
/// Default constructor
///
/// Local IP address to bind the server to
/// Port to listening for incoming UDP packets on
- /// /// Are we to use an object pool to get objects for handing inbound data?
public OpenSimUDPBase(IPAddress bindAddress, int port)
{
m_localBindAddress = bindAddress;
@@ -92,7 +76,7 @@ namespace OpenMetaverse
}
///
- /// Start inbound UDP packet handling.
+ /// Start the UDP server
///
/// The size of the receive buffer for
/// the UDP socket. This value is passed up to the operating system
@@ -107,11 +91,11 @@ namespace OpenMetaverse
/// manner (not throwing an exception when the remote side resets the
/// connection). This call is ignored on Mono where the flag is not
/// necessary
- public void StartInbound(int recvBufferSize, bool asyncPacketHandling)
+ public void Start(int recvBufferSize, bool asyncPacketHandling)
{
m_asyncPacketHandling = asyncPacketHandling;
- if (!IsRunningInbound)
+ if (m_shutdownFlag)
{
const int SIO_UDP_CONNRESET = -1744830452;
@@ -139,7 +123,8 @@ namespace OpenMetaverse
m_udpSocket.Bind(ipep);
- IsRunningInbound = true;
+ // we're not shutting down, we're starting up
+ m_shutdownFlag = false;
// kick off an async receive. The Start() method will return, the
// actual receives will occur asynchronously and will be caught in
@@ -149,84 +134,28 @@ namespace OpenMetaverse
}
///
- /// Start outbound UDP packet handling.
+ /// Stops the UDP server
///
- public void StartOutbound()
- {
- IsRunningOutbound = true;
- }
-
- public void StopInbound()
+ public void Stop()
{
- if (IsRunningInbound)
+ if (!m_shutdownFlag)
{
// wait indefinitely for a writer lock. Once this is called, the .NET runtime
// will deny any more reader locks, in effect blocking all other send/receive
- // threads. Once we have the lock, we set IsRunningInbound = false to inform the other
+ // threads. Once we have the lock, we set shutdownFlag to inform the other
// threads that the socket is closed.
- IsRunningInbound = false;
+ m_shutdownFlag = true;
m_udpSocket.Close();
}
}
- public void StopOutbound()
- {
- IsRunningOutbound = false;
- }
-
- protected virtual bool EnablePools()
- {
- if (!UsePools)
- {
- m_pool = new Pool(() => new UDPPacketBuffer(), 500);
-
- m_poolCountStat
- = new Stat(
- "UDPPacketBufferPoolCount",
- "Objects within the UDPPacketBuffer pool",
- "The number of objects currently stored within the UDPPacketBuffer pool",
- "",
- "clientstack",
- "packetpool",
- StatType.Pull,
- stat => stat.Value = m_pool.Count,
- StatVerbosity.Debug);
-
- StatsManager.RegisterStat(m_poolCountStat);
-
- UsePools = true;
-
- return true;
- }
-
- return false;
- }
-
- protected virtual bool DisablePools()
- {
- if (UsePools)
- {
- UsePools = false;
- StatsManager.DeregisterStat(m_poolCountStat);
-
- // We won't null out the pool to avoid a race condition with code that may be in the middle of using it.
-
- return true;
- }
-
- return false;
- }
-
private void AsyncBeginReceive()
{
- UDPPacketBuffer buf;
-
- if (UsePools)
- buf = m_pool.GetObject();
- else
- buf = new UDPPacketBuffer();
+ // allocate a packet buffer
+ //WrappedObject wrappedBuffer = Pool.CheckOut();
+ UDPPacketBuffer buf = new UDPPacketBuffer();
- if (IsRunningInbound)
+ if (!m_shutdownFlag)
{
try
{
@@ -279,7 +208,7 @@ namespace OpenMetaverse
{
// Asynchronous receive operations will complete here through the call
// to AsyncBeginReceive
- if (IsRunningInbound)
+ if (!m_shutdownFlag)
{
// Asynchronous mode will start another receive before the
// callback for this packet is even fired. Very parallel :-)
@@ -288,6 +217,8 @@ namespace OpenMetaverse
// get the buffer that was created in AsyncBeginReceive
// this is the received data
+ //WrappedObject wrappedBuffer = (WrappedObject)iar.AsyncState;
+ //UDPPacketBuffer buffer = wrappedBuffer.Instance;
UDPPacketBuffer buffer = (UDPPacketBuffer)iar.AsyncState;
try
@@ -304,8 +235,7 @@ namespace OpenMetaverse
catch (ObjectDisposedException) { }
finally
{
- if (UsePools)
- m_pool.ReturnObject(buffer);
+ //wrappedBuffer.Dispose();
// Synchronous mode waits until the packet callback completes
// before starting the receive to fetch another packet
@@ -318,7 +248,7 @@ namespace OpenMetaverse
public void AsyncBeginSend(UDPPacketBuffer buf)
{
- if (IsRunningOutbound)
+ if (!m_shutdownFlag)
{
try
{
diff --git a/OpenSim/Region/ClientStack/Linden/UDP/PacketPool.cs b/OpenSim/Region/ClientStack/Linden/UDP/PacketPool.cs
deleted file mode 100644
index 9f22fb4..0000000
--- a/OpenSim/Region/ClientStack/Linden/UDP/PacketPool.cs
+++ /dev/null
@@ -1,316 +0,0 @@
-/*
- * 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 OpenSimulator 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.Generic;
-using System.Reflection;
-using OpenMetaverse;
-using OpenMetaverse.Packets;
-using log4net;
-using OpenSim.Framework.Monitoring;
-
-namespace OpenSim.Region.ClientStack.LindenUDP
-{
- public sealed class PacketPool
- {
- private static readonly ILog m_log = LogManager.GetLogger(MethodBase.GetCurrentMethod().DeclaringType);
-
- private static readonly PacketPool instance = new PacketPool();
-
- private bool packetPoolEnabled = true;
- private bool dataBlockPoolEnabled = true;
-
- private PercentageStat m_packetsReusedStat = new PercentageStat(
- "PacketsReused",
- "Packets reused",
- "Number of packets reused out of all requests to the packet pool",
- "clientstack",
- "packetpool",
- StatType.Push,
- null,
- StatVerbosity.Debug);
-
- private PercentageStat m_blocksReusedStat = new PercentageStat(
- "PacketDataBlocksReused",
- "Packet data blocks reused",
- "Number of data blocks reused out of all requests to the packet pool",
- "clientstack",
- "packetpool",
- StatType.Push,
- null,
- StatVerbosity.Debug);
-
- ///
- /// Pool of packets available for reuse.
- ///
- private readonly Dictionary> pool = new Dictionary>();
-
- private static Dictionary> DataBlocks = new Dictionary>();
-
- public static PacketPool Instance
- {
- get { return instance; }
- }
-
- public bool RecyclePackets
- {
- set { packetPoolEnabled = value; }
- get { return packetPoolEnabled; }
- }
-
- public bool RecycleDataBlocks
- {
- set { dataBlockPoolEnabled = value; }
- get { return dataBlockPoolEnabled; }
- }
-
- private PacketPool()
- {
- StatsManager.RegisterStat(m_packetsReusedStat);
- StatsManager.RegisterStat(m_blocksReusedStat);
-
- StatsManager.RegisterStat(
- new Stat(
- "PacketsPoolCount",
- "Objects within the packet pool",
- "The number of objects currently stored within the packet pool",
- "",
- "clientstack",
- "packetpool",
- StatType.Pull,
- stat => { lock (pool) { stat.Value = pool.Count; } },
- StatVerbosity.Debug));
-
- StatsManager.RegisterStat(
- new Stat(
- "PacketDataBlocksPoolCount",
- "Objects within the packet data block pool",
- "The number of objects currently stored within the packet data block pool",
- "",
- "clientstack",
- "packetpool",
- StatType.Pull,
- stat => { lock (DataBlocks) { stat.Value = DataBlocks.Count; } },
- StatVerbosity.Debug));
- }
-
- ///
- /// Gets a packet of the given type.
- ///
- ///
- /// Guaranteed to always return a packet, whether from the pool or newly constructed.
- public Packet GetPacket(PacketType type)
- {
- m_packetsReusedStat.Consequent++;
-
- Packet packet;
-
- if (!packetPoolEnabled)
- return Packet.BuildPacket(type);
-
- lock (pool)
- {
- if (!pool.ContainsKey(type) || pool[type] == null || (pool[type]).Count == 0)
- {
-// m_log.DebugFormat("[PACKETPOOL]: Building {0} packet", type);
-
- // Creating a new packet if we cannot reuse an old package
- packet = Packet.BuildPacket(type);
- }
- else
- {
-// m_log.DebugFormat("[PACKETPOOL]: Pulling {0} packet", type);
-
- // Recycle old packages
- m_packetsReusedStat.Antecedent++;
-
- packet = pool[type].Pop();
- }
- }
-
- return packet;
- }
-
- // private byte[] decoded_header = new byte[10];
- private static PacketType GetType(byte[] bytes)
- {
- byte[] decoded_header = new byte[10 + 8];
- ushort id;
- PacketFrequency freq;
-
- if ((bytes[0] & Helpers.MSG_ZEROCODED) != 0)
- {
- Helpers.ZeroDecode(bytes, 16, decoded_header);
- }
- else
- {
- Buffer.BlockCopy(bytes, 0, decoded_header, 0, 10);
- }
-
- if (decoded_header[6] == 0xFF)
- {
- if (decoded_header[7] == 0xFF)
- {
- id = (ushort) ((decoded_header[8] << 8) + decoded_header[9]);
- freq = PacketFrequency.Low;
- }
- else
- {
- id = decoded_header[7];
- freq = PacketFrequency.Medium;
- }
- }
- else
- {
- id = decoded_header[6];
- freq = PacketFrequency.High;
- }
-
- return Packet.GetType(id, freq);
- }
-
- public Packet GetPacket(byte[] bytes, ref int packetEnd, byte[] zeroBuffer)
- {
- PacketType type = GetType(bytes);
-
-// Array.Clear(zeroBuffer, 0, zeroBuffer.Length);
-
- int i = 0;
- Packet packet = GetPacket(type);
- if (packet == null)
- m_log.WarnFormat("[PACKETPOOL]: Failed to get packet of type {0}", type);
- else
- packet.FromBytes(bytes, ref i, ref packetEnd, zeroBuffer);
-
- return packet;
- }
-
- ///
- /// Return a packet to the packet pool
- ///
- ///
- public void ReturnPacket(Packet packet)
- {
- if (dataBlockPoolEnabled)
- {
- switch (packet.Type)
- {
- case PacketType.ObjectUpdate:
- ObjectUpdatePacket oup = (ObjectUpdatePacket)packet;
-
- foreach (ObjectUpdatePacket.ObjectDataBlock oupod in oup.ObjectData)
- ReturnDataBlock(oupod);
-
- oup.ObjectData = null;
- break;
-
- case PacketType.ImprovedTerseObjectUpdate:
- ImprovedTerseObjectUpdatePacket itoup = (ImprovedTerseObjectUpdatePacket)packet;
-
- foreach (ImprovedTerseObjectUpdatePacket.ObjectDataBlock itoupod in itoup.ObjectData)
- ReturnDataBlock(itoupod);
-
- itoup.ObjectData = null;
- break;
- }
- }
-
- if (packetPoolEnabled)
- {
- switch (packet.Type)
- {
- // 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;
- }
- }
- }
-
- public T GetDataBlock() where T: new()
- {
- lock (DataBlocks)
- {
- m_blocksReusedStat.Consequent++;
-
- Stack
[TestFixture]
- public class BasicCircuitTests : OpenSimTestCase
+ public class BasicCircuitTests
{
private Scene m_scene;
private TestLLUDPServer m_udpServer;
@@ -65,9 +65,8 @@ namespace OpenSim.Region.ClientStack.LindenUDP.Tests
}
[SetUp]
- public override void SetUp()
+ public void SetUp()
{
- base.SetUp();
m_scene = new SceneHelpers().SetupScene();
}
@@ -144,7 +143,7 @@ namespace OpenSim.Region.ClientStack.LindenUDP.Tests
public void TestAddClient()
{
TestHelpers.InMethod();
-// TestHelpers.EnableLogging();
+// XmlConfigurator.Configure();
AddUdpServer();
--
cgit v1.1