diff --git a/OpenSim/Region/ClientStack/Linden/UDP/LLUDPServer.cs b/OpenSim/Region/ClientStack/Linden/UDP/LLUDPServer.cs
index 7b1aa2cf90..1e22fcc395 100644
--- a/OpenSim/Region/ClientStack/Linden/UDP/LLUDPServer.cs
+++ b/OpenSim/Region/ClientStack/Linden/UDP/LLUDPServer.cs
@@ -903,47 +903,64 @@ namespace OpenSim.Region.ClientStack.LindenUDP
private void HandleUseCircuitCode(object o)
{
-// DateTime startTime = DateTime.Now;
- object[] array = (object[])o;
- UDPPacketBuffer buffer = (UDPPacketBuffer)array[0];
- UseCircuitCodePacket uccp = (UseCircuitCodePacket)array[1];
+ IPEndPoint remoteEndPoint = null;
+ IClientAPI client = null;
+
+ try
+ {
+ // DateTime startTime = DateTime.Now;
+ object[] array = (object[])o;
+ UDPPacketBuffer buffer = (UDPPacketBuffer)array[0];
+ UseCircuitCodePacket uccp = (UseCircuitCodePacket)array[1];
+
+ m_log.DebugFormat("[LLUDPSERVER]: Handling UseCircuitCode request from {0}", buffer.RemoteEndPoint);
+
+ remoteEndPoint = (IPEndPoint)buffer.RemoteEndPoint;
+
+ AuthenticateResponse sessionInfo;
+ if (IsClientAuthorized(uccp, out sessionInfo))
+ {
+ // Begin the process of adding the client to the simulator
+ client
+ = AddClient(
+ uccp.CircuitCode.Code,
+ uccp.CircuitCode.ID,
+ uccp.CircuitCode.SessionID,
+ remoteEndPoint,
+ sessionInfo);
- m_log.DebugFormat("[LLUDPSERVER]: Handling UseCircuitCode request from {0}", buffer.RemoteEndPoint);
+ // 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(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)
+ client.SceneAgent.SendInitialDataToMe();
+ }
+ else
+ {
+ // Don't create clients for unauthorized requesters.
+ m_log.WarnFormat(
+ "[LLUDPSERVER]: Connection request for client {0} connecting with unnotified circuit code {1} from {2}",
+ uccp.CircuitCode.ID, uccp.CircuitCode.Code, remoteEndPoint);
+ }
+
+ // m_log.DebugFormat(
+ // "[LLUDPSERVER]: Handling UseCircuitCode request from {0} took {1}ms",
+ // buffer.RemoteEndPoint, (DateTime.Now - startTime).Milliseconds);
- IPEndPoint remoteEndPoint = (IPEndPoint)buffer.RemoteEndPoint;
-
- AuthenticateResponse sessionInfo;
- if (IsClientAuthorized(uccp, out sessionInfo))
- {
- // Begin the process of adding the client to the simulator
- IClientAPI client
- = AddClient(
- uccp.CircuitCode.Code,
- uccp.CircuitCode.ID,
- uccp.CircuitCode.SessionID,
- 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(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)
- client.SceneAgent.SendInitialDataToMe();
}
- else
+ catch (Exception e)
{
- // Don't create clients for unauthorized requesters.
- m_log.WarnFormat(
- "[LLUDPSERVER]: Connection request for client {0} connecting with unnotified circuit code {1} from {2}",
- uccp.CircuitCode.ID, uccp.CircuitCode.Code, remoteEndPoint);
+ m_log.ErrorFormat(
+ "[LLUDPSERVER]: UseCircuitCode handling from endpoint {0}, client {1} {2} failed. Exception {3}{4}",
+ remoteEndPoint != null ? remoteEndPoint.ToString() : "n/a",
+ client != null ? client.Name : "unknown",
+ client != null ? client.AgentId.ToString() : "unknown",
+ e.Message,
+ e.StackTrace);
}
-
- // m_log.DebugFormat(
-// "[LLUDPSERVER]: Handling UseCircuitCode request from {0} took {1}ms",
-// buffer.RemoteEndPoint, (DateTime.Now - startTime).Milliseconds);
}
///
diff --git a/OpenSim/Region/CoreModules/Framework/InventoryAccess/InventoryAccessModule.cs b/OpenSim/Region/CoreModules/Framework/InventoryAccess/InventoryAccessModule.cs
index 63ba3d39b8..d320af4b81 100644
--- a/OpenSim/Region/CoreModules/Framework/InventoryAccess/InventoryAccessModule.cs
+++ b/OpenSim/Region/CoreModules/Framework/InventoryAccess/InventoryAccessModule.cs
@@ -551,9 +551,14 @@ namespace OpenSim.Region.CoreModules.Framework.InventoryAccess
// "[INVENTORY ACCESS MODULE]: Target of {0} in CreateItemForObject() is {1} {2}",
// action, remoteClient.Name, userID);
}
+ else if (so.RootPart.OwnerID == so.RootPart.GroupID)
+ {
+ // Group owned objects go to the last owner before the object was transferred.
+ userID = so.RootPart.LastOwnerID;
+ }
else
{
- // All returns / deletes go to the object owner
+ // Other returns / deletes go to the object owner
//
userID = so.RootPart.OwnerID;
diff --git a/OpenSim/Region/CoreModules/World/Serialiser/Tests/SerialiserTests.cs b/OpenSim/Region/CoreModules/World/Serialiser/Tests/SerialiserTests.cs
index d5b585a716..d1d2020587 100644
--- a/OpenSim/Region/CoreModules/World/Serialiser/Tests/SerialiserTests.cs
+++ b/OpenSim/Region/CoreModules/World/Serialiser/Tests/SerialiserTests.cs
@@ -148,6 +148,113 @@ namespace OpenSim.Region.CoreModules.World.Serialiser.Tests
";
+ private string badFloatsXml = @"
+
+
+
+ false
+ a6dacf01-4636-4bb9-8a97-30609438af9d
+ e6a5a05e-e8cc-4816-8701-04165e335790
+ 1
+
+ 0
+ e6a5a05e-e8cc-4816-8701-04165e335790
+ 2698615125
+ NaughtyPrim
+ 0
+ false
+ 1099511628032000
+ 0
+ 147.2392.69822.78084
+ 000
+ -4.371139E-08-1-4.371139E-080
+ 000
+ 000
+ 000
+ 000
+
+
+
+
+
+ 0
+ 0
+
+ 1
+ AAAAAAAAERGZmQAAAAAABQCVlZUAAAAAQEAAAABAQAAAAAAAAAAAAAAAAAAAAA==
+ AA==
+ 0
+ 16
+ 0
+ 0
+ 0
+ 100
+ 100
+ 0
+ 0
+ 0
+ 0
+ 0
+ 0
+ 0
+ 9
+ 0
+ 0
+ 0
+ 10100.5
+ 0
+ Square
+ Same
+ 00000000-0000-0000-0000-000000000000
+ 0
+ 0
+ 0,5
+ yo mamma
+ 0
+ 0
+ 0
+ 0
+ 0
+ 0
+ 0
+ 0
+ 1
+ 0
+ 0
+ 0
+ 1
+ false
+ false
+ false
+
+ 10100.5
+ 0
+ 0001
+ 000
+ 000
+ 0001
+ 0
+ 1211330445
+ 0
+ 0
+ 0
+ 0
+ 00000000-0000-0000-0000-000000000000
+ a6dacf01-4636-4bb9-8a97-30609438af9d
+ a6dacf01-4636-4bb9-8a97-30609438af9d
+ 2147483647
+ 2147483647
+ 0
+ 0
+ 2147483647
+ None
+ 00000000-0000-0000-0000-000000000000
+ 0
+
+
+
+ ";
+
private string xml2 = @"
@@ -256,6 +363,32 @@ namespace OpenSim.Region.CoreModules.World.Serialiser.Tests
// TODO: Check other properties
}
+ [Test]
+ public void TestDeserializeBadFloatsXml()
+ {
+ TestHelpers.InMethod();
+// log4net.Config.XmlConfigurator.Configure();
+
+ SceneObjectGroup so = SceneObjectSerializer.FromOriginalXmlFormat(badFloatsXml);
+ SceneObjectPart rootPart = so.RootPart;
+
+ Assert.That(rootPart.UUID, Is.EqualTo(new UUID("e6a5a05e-e8cc-4816-8701-04165e335790")));
+ Assert.That(rootPart.CreatorID, Is.EqualTo(new UUID("a6dacf01-4636-4bb9-8a97-30609438af9d")));
+ Assert.That(rootPart.Name, Is.EqualTo("NaughtyPrim"));
+
+ // This terminates the deserialization earlier if couldn't be parsed.
+ // TODO: Need to address this
+ Assert.That(rootPart.GroupPosition.X, Is.EqualTo(147.23f));
+
+ Assert.That(rootPart.Shape.PathCurve, Is.EqualTo(16));
+
+ // Defaults for bad parses
+ Assert.That(rootPart.Shape.FlexiTension, Is.EqualTo(0));
+ Assert.That(rootPart.Shape.FlexiDrag, Is.EqualTo(0));
+
+ // TODO: Check other properties
+ }
+
[Test]
public void TestSerializeXml()
{
diff --git a/OpenSim/Region/Framework/Scenes/EventManager.cs b/OpenSim/Region/Framework/Scenes/EventManager.cs
index 6586437ad0..569c235a1b 100644
--- a/OpenSim/Region/Framework/Scenes/EventManager.cs
+++ b/OpenSim/Region/Framework/Scenes/EventManager.cs
@@ -187,10 +187,62 @@ namespace OpenSim.Region.Framework.Scenes
public event ClientClosed OnClientClosed;
+ // Fired when a script is created
+ // The indication that a new script exists in this region.
+ public delegate void NewScript(UUID clientID, SceneObjectPart part, UUID itemID);
+ public event NewScript OnNewScript;
+ public virtual void TriggerNewScript(UUID clientID, SceneObjectPart part, UUID itemID)
+ {
+ NewScript handlerNewScript = OnNewScript;
+ if (handlerNewScript != null)
+ {
+ foreach (NewScript d in handlerNewScript.GetInvocationList())
+ {
+ try
+ {
+ d(clientID, part, itemID);
+ }
+ catch (Exception e)
+ {
+ m_log.ErrorFormat(
+ "[EVENT MANAGER]: Delegate for TriggerNewScript failed - continuing. {0} {1}",
+ e.Message, e.StackTrace);
+ }
+ }
+ }
+ }
+
+ //TriggerUpdateScript: triggered after Scene receives client's upload of updated script and stores it as asset
+ // An indication that the script has changed.
+ public delegate void UpdateScript(UUID clientID, UUID itemId, UUID primId, bool isScriptRunning, UUID newAssetID);
+ public event UpdateScript OnUpdateScript;
+ public virtual void TriggerUpdateScript(UUID clientId, UUID itemId, UUID primId, bool isScriptRunning, UUID newAssetID)
+ {
+ UpdateScript handlerUpdateScript = OnUpdateScript;
+ if (handlerUpdateScript != null)
+ {
+ foreach (UpdateScript d in handlerUpdateScript.GetInvocationList())
+ {
+ try
+ {
+ d(clientId, itemId, primId, isScriptRunning, newAssetID);
+ }
+ catch (Exception e)
+ {
+ m_log.ErrorFormat(
+ "[EVENT MANAGER]: Delegate for TriggerUpdateScript failed - continuing. {0} {1}",
+ e.Message, e.StackTrace);
+ }
+ }
+ }
+ }
+
///
- /// This is fired when a scene object property that a script might be interested in (such as color, scale or
- /// inventory) changes. Only enough information is sent for the LSL changed event
- /// (see http://lslwiki.net/lslwiki/wakka.php?wakka=changed)
+ /// ScriptChangedEvent is fired when a scene object property that a script might be interested
+ /// in (such as color, scale or inventory) changes. Only enough information sent is for the LSL changed event.
+ /// This is not an indication that the script has changed (see OnUpdateScript for that).
+ /// This event is sent to a script to tell it that some property changed on
+ /// the object the script is in. See http://lslwiki.net/lslwiki/wakka.php?wakka=changed .
///
public event ScriptChangedEvent OnScriptChangedEvent;
public delegate void ScriptChangedEvent(uint localID, uint change);
diff --git a/OpenSim/Region/Framework/Scenes/Scene.Inventory.cs b/OpenSim/Region/Framework/Scenes/Scene.Inventory.cs
index 5a5307c471..6cc78b84b8 100644
--- a/OpenSim/Region/Framework/Scenes/Scene.Inventory.cs
+++ b/OpenSim/Region/Framework/Scenes/Scene.Inventory.cs
@@ -283,6 +283,10 @@ namespace OpenSim.Region.Framework.Scenes
{
remoteClient.SendAgentAlertMessage("Script saved", false);
}
+
+ // Tell anyone managing scripts that a script has been reloaded/changed
+ EventManager.TriggerUpdateScript(remoteClient.AgentId, itemId, primId, isScriptRunning, item.AssetID);
+
part.ParentGroup.ResumeScripts();
return errors;
}
@@ -1624,9 +1628,13 @@ namespace OpenSim.Region.Framework.Scenes
// have state in inventory
part.Inventory.CreateScriptInstance(copyID, 0, false, DefaultScriptEngine, 0);
+ // tell anyone watching that there is a new script in town
+ EventManager.TriggerNewScript(agentID, part, copyID);
+
// m_log.InfoFormat("[PRIMINVENTORY]: " +
// "Rezzed script {0} into prim local ID {1} for user {2}",
// item.inventoryName, localID, remoteClient.Name);
+
part.ParentGroup.ResumeScripts();
return part;
@@ -1707,6 +1715,10 @@ namespace OpenSim.Region.Framework.Scenes
part.Inventory.AddInventoryItem(taskItem, false);
part.Inventory.CreateScriptInstance(taskItem, 0, false, DefaultScriptEngine, 0);
+
+ // tell anyone managing scripts that a new script exists
+ EventManager.TriggerNewScript(agentID, part, taskItem.ItemID);
+
part.ParentGroup.ResumeScripts();
return part;
@@ -1926,7 +1938,7 @@ namespace OpenSim.Region.Framework.Scenes
foreach (SceneObjectGroup g in deleteGroups)
{
- AddReturn(g.OwnerID, g.Name, g.AbsolutePosition, "parcel owner return");
+ AddReturn(g.OwnerID == g.GroupID ? g.LastOwnerID : g.OwnerID, g.Name, g.AbsolutePosition, "parcel owner return");
}
}
}
diff --git a/OpenSim/Region/Framework/Scenes/Scene.cs b/OpenSim/Region/Framework/Scenes/Scene.cs
index 4c8e2d2e6a..ecc553d529 100644
--- a/OpenSim/Region/Framework/Scenes/Scene.cs
+++ b/OpenSim/Region/Framework/Scenes/Scene.cs
@@ -3427,6 +3427,27 @@ namespace OpenSim.Region.Framework.Scenes
agent.startpos.Z = 720;
}
}
+
+ // Honor Estate teleport routing via Telehubs
+ if (RegionInfo.RegionSettings.TelehubObject != UUID.Zero && RegionInfo.EstateSettings.AllowDirectTeleport == false)
+ {
+ SceneObjectGroup telehub = GetSceneObjectGroup(RegionInfo.RegionSettings.TelehubObject);
+ // Can have multiple SpawnPoints
+ List spawnpoints = RegionInfo.RegionSettings.SpawnPoints();
+ if ( spawnpoints.Count > 1)
+ {
+ // We have multiple SpawnPoints, Route the agent to a random one
+ agent.startpos = spawnpoints[Util.RandomClass.Next(spawnpoints.Count)].GetLocation(telehub.AbsolutePosition, telehub.GroupRotation);
+ }
+ else
+ {
+ // We have a single SpawnPoint and will route the agent to it
+ agent.startpos = spawnpoints[0].GetLocation(telehub.AbsolutePosition, telehub.GroupRotation);
+ }
+
+ return true;
+ }
+
// Honor parcel landing type and position.
if (land != null)
{
diff --git a/OpenSim/Region/Framework/Scenes/SceneGraph.cs b/OpenSim/Region/Framework/Scenes/SceneGraph.cs
index 693a79e5df..e66678afb2 100644
--- a/OpenSim/Region/Framework/Scenes/SceneGraph.cs
+++ b/OpenSim/Region/Framework/Scenes/SceneGraph.cs
@@ -359,7 +359,7 @@ namespace OpenSim.Region.Framework.Scenes
m_log.ErrorFormat(
"[SCENEGRAPH]: Tried to add scene object {0} to {1} with illegal UUID of {2}",
sceneObject.Name, m_parentScene.RegionInfo.RegionName, UUID.Zero);
-
+
return false;
}
@@ -368,12 +368,12 @@ namespace OpenSim.Region.Framework.Scenes
// m_log.DebugFormat(
// "[SCENEGRAPH]: Scene graph for {0} already contains object {1} in AddSceneObject()",
// m_parentScene.RegionInfo.RegionName, sceneObject.UUID);
-
+
return false;
}
-
+
// m_log.DebugFormat(
-// "[SCENEGRAPH]: Adding scene object {0} {1}, with {2} parts on {3}",
+// "[SCENEGRAPH]: Adding scene object {0} {1}, with {2} parts on {3}",
// sceneObject.Name, sceneObject.UUID, sceneObject.Parts.Length, m_parentScene.RegionInfo.RegionName);
SceneObjectPart[] parts = sceneObject.Parts;
@@ -409,7 +409,7 @@ namespace OpenSim.Region.Framework.Scenes
lock (SceneObjectGroupsByFullID)
SceneObjectGroupsByFullID[sceneObject.UUID] = sceneObject;
-
+
lock (SceneObjectGroupsByFullPartID)
{
foreach (SceneObjectPart part in parts)
diff --git a/OpenSim/Region/Framework/Scenes/SceneObjectGroup.cs b/OpenSim/Region/Framework/Scenes/SceneObjectGroup.cs
index 5b838f8377..878476e5c9 100644
--- a/OpenSim/Region/Framework/Scenes/SceneObjectGroup.cs
+++ b/OpenSim/Region/Framework/Scenes/SceneObjectGroup.cs
@@ -1330,7 +1330,7 @@ namespace OpenSim.Region.Framework.Scenes
m_log.DebugFormat(
"[SCENE OBJECT GROUP]: Returning object {0} due to parcel autoreturn",
RootPart.UUID);
- m_scene.AddReturn(OwnerID, Name, AbsolutePosition, "parcel autoreturn");
+ m_scene.AddReturn(OwnerID == GroupID ? LastOwnerID : OwnerID, Name, AbsolutePosition, "parcel autoreturn");
m_scene.DeRezObjects(null, new List() { RootPart.LocalId }, UUID.Zero,
DeRezAction.Return, UUID.Zero);
diff --git a/OpenSim/Region/Framework/Scenes/SceneObjectPart.cs b/OpenSim/Region/Framework/Scenes/SceneObjectPart.cs
index 4c339d9c8b..b130bf70dc 100644
--- a/OpenSim/Region/Framework/Scenes/SceneObjectPart.cs
+++ b/OpenSim/Region/Framework/Scenes/SceneObjectPart.cs
@@ -303,6 +303,9 @@ namespace OpenSim.Region.Framework.Scenes
// ~SceneObjectPart()
// {
+// Console.WriteLine(
+// "[SCENE OBJECT PART]: Destructor called for {0}, local id {1}, parent {2} {3}",
+// Name, LocalId, ParentGroup.Name, ParentGroup.LocalId);
// m_log.DebugFormat(
// "[SCENE OBJECT PART]: Destructor called for {0}, local id {1}, parent {2} {3}",
// Name, LocalId, ParentGroup.Name, ParentGroup.LocalId);
diff --git a/OpenSim/Region/Framework/Scenes/Serialization/SceneObjectSerializer.cs b/OpenSim/Region/Framework/Scenes/Serialization/SceneObjectSerializer.cs
index 0a32214661..e6b88a35c5 100644
--- a/OpenSim/Region/Framework/Scenes/Serialization/SceneObjectSerializer.cs
+++ b/OpenSim/Region/Framework/Scenes/Serialization/SceneObjectSerializer.cs
@@ -29,6 +29,7 @@ using System;
using System.Collections.Generic;
using System.Drawing;
using System.IO;
+using System.Linq;
using System.Reflection;
using System.Xml;
using log4net;
@@ -570,13 +571,15 @@ namespace OpenSim.Region.Framework.Scenes.Serialization
private static void ProcessShape(SceneObjectPart obj, XmlTextReader reader)
{
- bool errors = false;
- obj.Shape = ReadShape(reader, "Shape", out errors);
+ List errorNodeNames;
+ obj.Shape = ReadShape(reader, "Shape", out errorNodeNames);
- if (errors)
+ if (errorNodeNames != null)
+ {
m_log.DebugFormat(
- "[SceneObjectSerializer]: Parsing PrimitiveBaseShape for object part {0} {1} encountered errors. Please see earlier log entries.",
- obj.Name, obj.UUID);
+ "[SceneObjectSerializer]: Parsing PrimitiveBaseShape for object part {0} {1} encountered errors in properties {2}.",
+ obj.Name, obj.UUID, string.Join(", ", errorNodeNames.ToArray()));
+ }
}
private static void ProcessScale(SceneObjectPart obj, XmlTextReader reader)
@@ -1519,37 +1522,44 @@ namespace OpenSim.Region.Framework.Scenes.Serialization
///
///
/// The name of the xml element containing the shape
- /// true if any errors were encountered during parsing, false otherwise
+ /// a list containing the failing node names. If no failures then null.
/// The shape parsed
- public static PrimitiveBaseShape ReadShape(XmlTextReader reader, string name, out bool errors)
+ public static PrimitiveBaseShape ReadShape(XmlTextReader reader, string name, out List errorNodeNames)
{
- errors = false;
+ List internalErrorNodeNames = null;
PrimitiveBaseShape shape = new PrimitiveBaseShape();
if (reader.IsEmptyElement)
{
reader.Read();
+ errorNodeNames = null;
return shape;
}
reader.ReadStartElement(name, String.Empty); // Shape
- errors = ExternalRepresentationUtils.ExecuteReadProcessors(
+ ExternalRepresentationUtils.ExecuteReadProcessors(
shape,
m_ShapeXmlProcessors,
reader,
(o, nodeName, e)
=>
{
- m_log.DebugFormat(
- "[SceneObjectSerializer]: Exception while parsing Shape property {0}: {1}{2}",
- nodeName, e.Message, e.StackTrace);
+// m_log.DebugFormat(
+// "[SceneObjectSerializer]: Exception while parsing Shape property {0}: {1}{2}",
+// nodeName, e.Message, e.StackTrace);
+ if (internalErrorNodeNames == null)
+ internalErrorNodeNames = new List();
+
+ internalErrorNodeNames.Add(nodeName);
}
);
reader.ReadEndElement(); // Shape
+ errorNodeNames = internalErrorNodeNames;
+
return shape;
}
diff --git a/OpenSim/Region/Framework/Scenes/Tests/SceneObjectBasicTests.cs b/OpenSim/Region/Framework/Scenes/Tests/SceneObjectBasicTests.cs
index 80f198d2d6..7737d8ea83 100644
--- a/OpenSim/Region/Framework/Scenes/Tests/SceneObjectBasicTests.cs
+++ b/OpenSim/Region/Framework/Scenes/Tests/SceneObjectBasicTests.cs
@@ -27,6 +27,7 @@
using System;
using System.Reflection;
+using System.Threading;
using NUnit.Framework;
using OpenMetaverse;
using OpenSim.Framework;
@@ -43,6 +44,42 @@ namespace OpenSim.Region.Framework.Scenes.Tests
[TestFixture]
public class SceneObjectBasicTests
{
+// [TearDown]
+// public void TearDown()
+// {
+// Console.WriteLine("TearDown");
+// GC.Collect();
+// Thread.Sleep(3000);
+// }
+
+// public class GcNotify
+// {
+// public static AutoResetEvent gcEvent = new AutoResetEvent(false);
+// private static bool _initialized = false;
+//
+// public static void Initialize()
+// {
+// if (!_initialized)
+// {
+// _initialized = true;
+// new GcNotify();
+// }
+// }
+//
+// private GcNotify(){}
+//
+// ~GcNotify()
+// {
+// if (!Environment.HasShutdownStarted &&
+// !AppDomain.CurrentDomain.IsFinalizingForUnload())
+// {
+// Console.WriteLine("GcNotify called");
+// gcEvent.Set();
+// new GcNotify();
+// }
+// }
+// }
+
///
/// Test adding an object to a scene.
///
@@ -147,11 +184,11 @@ namespace OpenSim.Region.Framework.Scenes.Tests
public void TestDeleteSceneObject()
{
TestHelpers.InMethod();
-
+
TestScene scene = SceneHelpers.SetupScene();
SceneObjectPart part = SceneHelpers.AddSceneObject(scene);
scene.DeleteSceneObject(part.ParentGroup, false);
-
+
SceneObjectPart retrievedPart = scene.GetSceneObjectPart(part.LocalId);
Assert.That(retrievedPart, Is.Null);
}
diff --git a/OpenSim/Region/OptionalModules/Scripting/RegionReadyModule/RegionReadyModule.cs b/OpenSim/Region/OptionalModules/Scripting/RegionReadyModule/RegionReadyModule.cs
index d2810bec71..d0142a40e3 100644
--- a/OpenSim/Region/OptionalModules/Scripting/RegionReadyModule/RegionReadyModule.cs
+++ b/OpenSim/Region/OptionalModules/Scripting/RegionReadyModule/RegionReadyModule.cs
@@ -230,8 +230,10 @@ namespace OpenSim.Region.OptionalModules.Scripting.RegionReady
m_scene.EventManager.OnEmptyScriptCompileQueue -= OnEmptyScriptCompileQueue;
- m_log.InfoFormat("[RegionReady]: Logins enabled for {0}, Oar {1}",
- m_scene.RegionInfo.RegionName, m_oarFileLoading.ToString());
+ // m_log.InfoFormat("[RegionReady]: Logins enabled for {0}, Oar {1}",
+ // m_scene.RegionInfo.RegionName, m_oarFileLoading.ToString());
+
+ m_log.InfoFormat("[RegionReady]: Logins enabled for {0}", m_scene.RegionInfo.RegionName);
if ( m_uri != string.Empty )
{
diff --git a/OpenSim/Region/OptionalModules/World/NPC/NPCModule.cs b/OpenSim/Region/OptionalModules/World/NPC/NPCModule.cs
index 53593545ef..2052cdb6f4 100644
--- a/OpenSim/Region/OptionalModules/World/NPC/NPCModule.cs
+++ b/OpenSim/Region/OptionalModules/World/NPC/NPCModule.cs
@@ -121,8 +121,8 @@ namespace OpenSim.Region.OptionalModules.World.NPC
npcAvatar.CircuitCode = (uint)Util.RandomClass.Next(0, int.MaxValue);
m_log.DebugFormat(
- "[NPC MODULE]: Creating NPC {0} {1} {2} at {3} in {4}",
- firstname, lastname, npcAvatar.AgentId, position, scene.RegionInfo.RegionName);
+ "[NPC MODULE]: Creating NPC {0} {1} {2}, owner={3}, senseAsAgent={4} at {5} in {6}",
+ firstname, lastname, npcAvatar.AgentId, owner, senseAsAgent, position, scene.RegionInfo.RegionName);
AgentCircuitData acd = new AgentCircuitData();
acd.AgentID = npcAvatar.AgentId;
diff --git a/OpenSim/Region/Physics/Meshing/Meshmerizer.cs b/OpenSim/Region/Physics/Meshing/Meshmerizer.cs
index f15e81ba8e..6f6ed7f1fc 100644
--- a/OpenSim/Region/Physics/Meshing/Meshmerizer.cs
+++ b/OpenSim/Region/Physics/Meshing/Meshmerizer.cs
@@ -313,7 +313,7 @@ namespace OpenSim.Region.Physics.Meshing
private bool GenerateCoordsAndFacesFromPrimMeshData(
string primName, PrimitiveBaseShape primShape, Vector3 size, out List coords, out List faces)
{
- m_log.DebugFormat("[MESH]: experimental mesh proxy generation for {0}", primName);
+// m_log.DebugFormat("[MESH]: experimental mesh proxy generation for {0}", primName);
coords = new List();
faces = new List();
@@ -321,7 +321,7 @@ namespace OpenSim.Region.Physics.Meshing
if (primShape.SculptData.Length <= 0)
{
- m_log.Error("[MESH]: asset data is zero length");
+ m_log.ErrorFormat("[MESH]: asset data for {0} is zero length", primName);
return false;
}
diff --git a/OpenSim/Region/ScriptEngine/Shared/Api/Implementation/OSSL_Api.cs b/OpenSim/Region/ScriptEngine/Shared/Api/Implementation/OSSL_Api.cs
index b1583ebb1e..c55e2ae4e7 100644
--- a/OpenSim/Region/ScriptEngine/Shared/Api/Implementation/OSSL_Api.cs
+++ b/OpenSim/Region/ScriptEngine/Shared/Api/Implementation/OSSL_Api.cs
@@ -2233,7 +2233,7 @@ namespace OpenSim.Region.ScriptEngine.Shared.Api
CheckThreatLevel(ThreatLevel.High, "osNpcCreate");
m_host.AddScriptLPS(1);
- return NpcCreate(firstname, lastname, position, notecard, false, true);
+ return NpcCreate(firstname, lastname, position, notecard, false, false);
}
public LSL_Key osNpcCreate(string firstname, string lastname, LSL_Vector position, string notecard, int options)
@@ -2244,7 +2244,7 @@ namespace OpenSim.Region.ScriptEngine.Shared.Api
return NpcCreate(
firstname, lastname, position, notecard,
(options & ScriptBaseClass.OS_NPC_NOT_OWNED) == 0,
- (options & ScriptBaseClass.OS_NPC_SENSE_AS_AGENT) == 0);
+ (options & ScriptBaseClass.OS_NPC_SENSE_AS_AGENT) != 0);
}
private LSL_Key NpcCreate(
@@ -2595,7 +2595,7 @@ namespace OpenSim.Region.ScriptEngine.Shared.Api
UUID npcID = new UUID(npc.m_string);
if (module.CheckPermissions(npcID, m_host.OwnerID))
- AvatarPlayAnimation(npcID.ToString(), animation);
+ AvatarStopAnimation(npcID.ToString(), animation);
}
}
diff --git a/OpenSim/Region/ScriptEngine/Shared/Api/Implementation/Plugins/SensorRepeat.cs b/OpenSim/Region/ScriptEngine/Shared/Api/Implementation/Plugins/SensorRepeat.cs
index 850f50b13d..5c1bdff9db 100644
--- a/OpenSim/Region/ScriptEngine/Shared/Api/Implementation/Plugins/SensorRepeat.cs
+++ b/OpenSim/Region/ScriptEngine/Shared/Api/Implementation/Plugins/SensorRepeat.cs
@@ -31,7 +31,6 @@ using System.Collections.Generic;
using OpenMetaverse;
using OpenSim.Framework;
using log4net;
-
using OpenSim.Region.Framework.Interfaces;
using OpenSim.Region.Framework.Scenes;
using OpenSim.Region.ScriptEngine.Shared;
@@ -41,6 +40,8 @@ namespace OpenSim.Region.ScriptEngine.Shared.Api.Plugins
{
public class SensorRepeat
{
+// private static readonly ILog m_log = LogManager.GetLogger(MethodBase.GetCurrentMethod().DeclaringType);
+
public AsyncCommandManager m_CmdManager;
public SensorRepeat(AsyncCommandManager CmdManager)
@@ -447,11 +448,20 @@ namespace OpenSim.Region.ScriptEngine.Shared.Api.Plugins
Action senseEntity = new Action(presence =>
{
+// m_log.DebugFormat(
+// "[SENSOR REPEAT]: Inspecting scene presence {0}, type {1} on sensor sweep for {2}, type {3}",
+// presence.Name, presence.PresenceType, ts.name, ts.type);
+
if ((ts.type & NPC) == 0 && presence.PresenceType == PresenceType.Npc)
{
INPC npcData = npcModule.GetNPC(presence.UUID, presence.Scene);
if (npcData == null || !npcData.SenseAsAgent)
+ {
+// m_log.DebugFormat(
+// "[SENSOR REPEAT]: Discarding NPC {0} from agent sense sweep for script item id {1}",
+// presence.Name, ts.itemID);
return;
+ }
}
if ((ts.type & AGENT) == 0)
@@ -464,7 +474,12 @@ namespace OpenSim.Region.ScriptEngine.Shared.Api.Plugins
{
INPC npcData = npcModule.GetNPC(presence.UUID, presence.Scene);
if (npcData != null && npcData.SenseAsAgent)
+ {
+// m_log.DebugFormat(
+// "[SENSOR REPEAT]: Discarding NPC {0} from non-agent sense sweep for script item id {1}",
+// presence.Name, ts.itemID);
return;
+ }
}
}
diff --git a/OpenSim/Services/Connectors/Friends/FriendsServiceConnector.cs b/OpenSim/Services/Connectors/Friends/FriendsServiceConnector.cs
index 44138c9fd1..b1dd84e887 100644
--- a/OpenSim/Services/Connectors/Friends/FriendsServiceConnector.cs
+++ b/OpenSim/Services/Connectors/Friends/FriendsServiceConnector.cs
@@ -220,7 +220,7 @@ namespace OpenSim.Services.Connectors.Friends
public bool Delete(Dictionary sendData, string PrincipalID, string Friend)
{
string reply = string.Empty;
- string uri = m_ServerURI = "/friends";
+ string uri = m_ServerURI + "/friends";
try
{
reply = SynchronousRestFormsRequester.MakeRequest("POST", uri, ServerUtils.BuildQueryString(sendData));
diff --git a/OpenSim/Tests/Common/Mock/TestScene.cs b/OpenSim/Tests/Common/Mock/TestScene.cs
index 328cd2b4e5..eea68c3b40 100644
--- a/OpenSim/Tests/Common/Mock/TestScene.cs
+++ b/OpenSim/Tests/Common/Mock/TestScene.cs
@@ -50,7 +50,8 @@ namespace OpenSim.Tests.Common.Mock
~TestScene()
{
- Console.WriteLine("TestScene destructor called for {0}", RegionInfo.RegionName);
+ //Console.WriteLine("TestScene destructor called for {0}", RegionInfo.RegionName);
+ Console.WriteLine("TestScene destructor called");
}
///
diff --git a/OpenSim/Tests/Torture/ObjectTortureTests.cs b/OpenSim/Tests/Torture/ObjectTortureTests.cs
index 74b336eeb9..e83186a929 100644
--- a/OpenSim/Tests/Torture/ObjectTortureTests.cs
+++ b/OpenSim/Tests/Torture/ObjectTortureTests.cs
@@ -49,6 +49,13 @@ namespace OpenSim.Tests.Torture
[TestFixture]
public class ObjectTortureTests
{
+ [TearDown]
+ public void TearDown()
+ {
+ GC.Collect();
+ GC.WaitForPendingFinalizers();
+ }
+
// [Test]
// public void Test0000Clean()
// {
@@ -141,8 +148,18 @@ namespace OpenSim.Tests.Torture
string.Format("Object {0} could not be retrieved", i));
}
- // This does not work to fire the SceneObjectGroup destructors - something else is hanging on to them.
-// scene.DeleteAllSceneObjects();
+ // When a scene object is added to a scene, it is placed in the update list for sending to viewers
+ // (though in this case we have none). When it is deleted, it is not removed from the update which is
+ // fine since it will later be ignored.
+ //
+ // However, that means that we need to manually run an update here to clear out that list so that deleted
+ // objects will be clean up by the garbage collector before the next stress test is run.
+ scene.Update();
+
+ // Currently, we need to do this in order to garbage collect the scene objects ready for the next test run.
+ // However, what we really need to do is find out why the entire scene is not garbage collected in
+ // teardown.
+ scene.DeleteAllSceneObjects();
Console.WriteLine(
"Took {0}ms, {1}MB ({2} - {3}) to create {4} objects each containing {5} prim(s)",