From 0ee69707ea8c0948b79aeba5dbe078fe28dc6482 Mon Sep 17 00:00:00 2001
From: Justin Clarke Casey
Date: Sat, 24 May 2008 23:11:07 +0000
Subject: * Refactor: Collapse some multiple remove object paths * Push some
delete functionality into InnerScene to match what's already there for adding
objects
---
.../World/TreePopulator/TreePopulatorModule.cs | 2 +-
OpenSim/Region/Environment/Scenes/InnerScene.cs | 41 ++++++++++---
.../Region/Environment/Scenes/Scene.Inventory.cs | 8 +--
OpenSim/Region/Environment/Scenes/Scene.cs | 71 +++++++++-------------
.../Region/Examples/SimpleModule/ComplexObject.cs | 2 +-
.../ScriptEngine/Common/LSL_BuiltIn_Commands.cs | 2 +-
6 files changed, 68 insertions(+), 58 deletions(-)
diff --git a/OpenSim/Region/Environment/Modules/World/TreePopulator/TreePopulatorModule.cs b/OpenSim/Region/Environment/Modules/World/TreePopulator/TreePopulatorModule.cs
index c56ed08..fc3b9dd 100644
--- a/OpenSim/Region/Environment/Modules/World/TreePopulator/TreePopulatorModule.cs
+++ b/OpenSim/Region/Environment/Modules/World/TreePopulator/TreePopulatorModule.cs
@@ -179,7 +179,7 @@ namespace OpenSim.Region.Environment.Modules.World.TreePopulator
if (Util.RandomClass.NextDouble() < killLikelyhood)
{
- m_scene.RemoveSceneObject(selectedTree.ParentGroup);
+ m_scene.DeleteSceneObject(selectedTree.ParentGroup);
m_trees.Remove(selectedTree.ParentGroup.UUID);
m_scene.ForEachClient(delegate(IClientAPI controller)
diff --git a/OpenSim/Region/Environment/Scenes/InnerScene.cs b/OpenSim/Region/Environment/Scenes/InnerScene.cs
index 63f7f17..b03ffe2 100644
--- a/OpenSim/Region/Environment/Scenes/InnerScene.cs
+++ b/OpenSim/Region/Environment/Scenes/InnerScene.cs
@@ -204,18 +204,45 @@ namespace OpenSim.Region.Environment.Scenes
/// Add an object to the scene.
///
///
- public void AddSceneObject(SceneObjectGroup sceneObject)
+ /// true if the object was added, false if an object with the same uuid was already in the scene
+ ///
+ public bool AddSceneObject(SceneObjectGroup sceneObject)
{
- if (!Entities.ContainsKey(sceneObject.UUID))
+ lock (Entities)
{
- // QuadTree.AddSceneObject(sceneObject);
- lock (Entities)
+ if (!Entities.ContainsKey(sceneObject.UUID))
{
+ // QuadTree.AddSceneObject(sceneObject);
Entities.Add(sceneObject.UUID, sceneObject);
+ m_numPrim++;
+
+ return true;
}
- m_numPrim++;
+
+ return false;
}
}
+
+ ///
+ /// Delete an object from the scene
+ ///
+ ///
+ /// true if the object was deleted, false if there was no object to delete
+ public bool DeleteSceneObject(LLUUID uuid)
+ {
+ lock (Entities)
+ {
+ if (Entities.ContainsKey(uuid))
+ {
+ Entities.Remove(uuid);
+ m_numPrim--;
+
+ return true;
+ }
+ }
+
+ return false;
+ }
///
/// Add an entity to the list of prims to process on the next update
@@ -376,7 +403,6 @@ namespace OpenSim.Region.Environment.Scenes
// To LocalId or LLUUID, *THAT* is the question. How now Brown LLUUID??
public void DetachSingleAttachmentToInv(LLUUID itemID, IClientAPI remoteClient)
{
-
if (itemID == LLUUID.Zero) // If this happened, someone made a mistake....
return;
@@ -392,11 +418,10 @@ namespace OpenSim.Region.Environment.Scenes
group.DetachToInventoryPrep();
m_log.Debug("[DETACH]: Saving attachpoint: " + ((uint)group.GetAttachmentPoint()).ToString());
m_parentScene.updateKnownAsset(remoteClient, group, group.GetFromAssetID(),group.OwnerID);
- m_parentScene.DeleteSceneObjectGroup(group);
+ m_parentScene.DeleteSceneObject(group);
}
}
}
-
}
public void AttachObject(IClientAPI remoteClient, uint objectLocalID, uint AttachmentPt, LLQuaternion rot, LLVector3 attachPos)
diff --git a/OpenSim/Region/Environment/Scenes/Scene.Inventory.cs b/OpenSim/Region/Environment/Scenes/Scene.Inventory.cs
index 816b01d..82e112f 100644
--- a/OpenSim/Region/Environment/Scenes/Scene.Inventory.cs
+++ b/OpenSim/Region/Environment/Scenes/Scene.Inventory.cs
@@ -1251,14 +1251,12 @@ namespace OpenSim.Region.Environment.Scenes
}
}
-
if (permissionToDelete)
{
- DeleteSceneObjectGroup(objectGroup);
+ DeleteSceneObject(objectGroup);
}
}
- }
-
+ }
}
public void updateKnownAsset(IClientAPI remoteClient, SceneObjectGroup grp, LLUUID assetID, LLUUID agentID)
@@ -1790,7 +1788,7 @@ namespace OpenSim.Region.Environment.Scenes
returnobjects[i] = null;
- DeleteSceneObjectGroup(ObjectDeleting);
+ DeleteSceneObject(ObjectDeleting);
ObjectDeleting = null;
}
else
diff --git a/OpenSim/Region/Environment/Scenes/Scene.cs b/OpenSim/Region/Environment/Scenes/Scene.cs
index bbe8bd9..e30813c 100644
--- a/OpenSim/Region/Environment/Scenes/Scene.cs
+++ b/OpenSim/Region/Environment/Scenes/Scene.cs
@@ -1335,22 +1335,40 @@ namespace OpenSim.Region.Environment.Scenes
public void AddSceneObject(SceneObjectGroup sceneObject)
{
m_innerScene.AddSceneObject(sceneObject);
- }
+ }
///
- /// Remove an object from the scene
+ /// Delete this object from the scene.
///
- ///
- public void RemoveSceneObject(SceneObjectGroup sceneObject)
+ ///
+ public void DeleteSceneObject(SceneObjectGroup group)
{
- if (Entities.ContainsKey(sceneObject.UUID))
+ SceneObjectPart rootPart = (group).GetChildPart(group.UUID);
+ if (rootPart.PhysActor != null)
+ {
+ PhysicsScene.RemovePrim(rootPart.PhysActor);
+ rootPart.PhysActor = null;
+ }
+
+ m_storageManager.DataStore.RemoveObject(group.UUID, m_regInfo.RegionID);
+ group.DeleteGroup();
+
+ if (m_innerScene.DeleteSceneObject(group.UUID))
{
- EventManager.TriggerObjectBeingRemovedFromScene(sceneObject);
- Entities.Remove(sceneObject.UUID);
+ EventManager.TriggerObjectBeingRemovedFromScene(group);
EventManager.TriggerParcelPrimCountTainted();
- m_innerScene.RemoveAPrimCount();
}
- }
+
+ group.DeleteParts();
+
+ // In case anybody else retains a reference to this group, signal deletion by changing the name
+ // to null. We can't zero out the UUID because this is taken from the root part, which has already
+ // been removed.
+ // FIXME: This is a really poor temporary solution, since it still leaves plenty of scope for race
+ // conditions where a user deletes an entity while it is being stored. Really, the update
+ // code needs a redesign.
+ group.Name = null;
+ }
public void LoadPrimsFromXml(string fileName, bool newIdsFlag, LLVector3 loadOffset)
{
@@ -1411,7 +1429,7 @@ namespace OpenSim.Region.Environment.Scenes
// We remove the object here
try
{
- DeleteSceneObjectGroup(grp);
+ DeleteSceneObject(grp);
}
catch (Exception)
{
@@ -1473,7 +1491,7 @@ namespace OpenSim.Region.Environment.Scenes
// We remove the object here
try
{
- DeleteSceneObjectGroup(grp);
+ DeleteSceneObject(grp);
}
catch (Exception)
{
@@ -3142,37 +3160,6 @@ namespace OpenSim.Region.Environment.Scenes
}
///
- /// Delete this object from the scene.
- ///
- ///
- public void DeleteSceneObjectGroup(SceneObjectGroup group)
- {
- SceneObjectPart rootPart = (group).GetChildPart(group.UUID);
- if (rootPart.PhysActor != null)
- {
- PhysicsScene.RemovePrim(rootPart.PhysActor);
- rootPart.PhysActor = null;
- }
-
- m_storageManager.DataStore.RemoveObject(group.UUID, m_regInfo.RegionID);
- group.DeleteGroup();
-
- lock (Entities)
- {
- RemoveSceneObject(group);
- }
- group.DeleteParts();
-
- // In case anybody else retains a reference to this group, signal deletion by changing the name
- // to null. We can't zero out the UUID because this is taken from the root part, which has already
- // been removed.
- // FIXME: This is a really poor temporary solution, since it still leaves plenty of scope for race
- // conditions where a user deletes an entity while it is being stored. Really, the update
- // code needs a redesign.
- group.Name = null;
- }
-
- ///
///
///
///
diff --git a/OpenSim/Region/Examples/SimpleModule/ComplexObject.cs b/OpenSim/Region/Examples/SimpleModule/ComplexObject.cs
index 87a5ffc..d83bba6 100644
--- a/OpenSim/Region/Examples/SimpleModule/ComplexObject.cs
+++ b/OpenSim/Region/Examples/SimpleModule/ComplexObject.cs
@@ -126,7 +126,7 @@ namespace OpenSim.Region.Examples.SimpleModule
if (m_parts.Count == 1)
{
m_parts.Remove(m_rootPart.UUID);
- m_scene.RemoveSceneObject(this);
+ m_scene.DeleteSceneObject(this);
remoteClient.SendKillObject(m_regionHandle, m_rootPart.LocalId);
remoteClient.AddMoney(50);
remoteClient.SendChatMessage("KABLAM!!!", 1, AbsolutePosition, "Groupie Groupie", LLUUID.Zero, (byte)ChatSourceType.Object, (byte)ChatAudibleLevel.Fully);
diff --git a/OpenSim/Region/ScriptEngine/Common/LSL_BuiltIn_Commands.cs b/OpenSim/Region/ScriptEngine/Common/LSL_BuiltIn_Commands.cs
index ab91424..3fa65f5 100644
--- a/OpenSim/Region/ScriptEngine/Common/LSL_BuiltIn_Commands.cs
+++ b/OpenSim/Region/ScriptEngine/Common/LSL_BuiltIn_Commands.cs
@@ -704,7 +704,7 @@ namespace OpenSim.Region.ScriptEngine.Common
public void llDie()
{
m_host.AddScriptLPS(1);
- World.DeleteSceneObjectGroup(m_host.ParentGroup);
+ World.DeleteSceneObject(m_host.ParentGroup);
}
public double llGround(LSL_Types.Vector3 offset)
--
cgit v1.1