From 47829849d99e1ec6e11ac26e1f892cbaf94d5503 Mon Sep 17 00:00:00 2001 From: Adam Frisby Date: Mon, 24 Nov 2008 14:45:05 +0000 Subject: * Swaps Scene.Entities Dictionary for EntityManager. * Important Changes: Scene.Entities is now IEnumerable directly. You do not need to use Entities.Values, you can Enumerate on .Entities directly. (So 'foreach Scene.Entities' vs 'foreach Scene.Entities.Values'). * Locks: Entities maintains it's own internal locking states. This means you do not need to lock entities anymore. I'll be going through and removing locks on it systematically. --- OpenSim/Region/DataSnapshot/ObjectSnapshot.cs | 2 +- .../Modules/ContentManagementSystem/CMModel.cs | 7 ++++- .../Modules/World/Land/LandManagementModule.cs | 2 +- OpenSim/Region/Environment/Scenes/EntityManager.cs | 32 ++++++++++++++++++---- .../Region/Environment/Scenes/Scene.Inventory.cs | 2 +- OpenSim/Region/Environment/Scenes/Scene.cs | 12 ++++++-- OpenSim/Region/Environment/Scenes/SceneGraph.cs | 8 ++---- OpenSim/Region/Environment/Scenes/ScenePresence.cs | 2 +- 8 files changed, 48 insertions(+), 19 deletions(-) diff --git a/OpenSim/Region/DataSnapshot/ObjectSnapshot.cs b/OpenSim/Region/DataSnapshot/ObjectSnapshot.cs index f032704..6dc1e9c 100644 --- a/OpenSim/Region/DataSnapshot/ObjectSnapshot.cs +++ b/OpenSim/Region/DataSnapshot/ObjectSnapshot.cs @@ -98,7 +98,7 @@ namespace OpenSim.Region.DataSnapshot.Providers XmlNode parent = nodeFactory.CreateNode(XmlNodeType.Element, "objectdata", ""); XmlNode node; - foreach (EntityBase entity in m_scene.Entities.Values) + foreach (EntityBase entity in m_scene.Entities) { // only objects, not avatars if (entity is SceneObjectGroup) diff --git a/OpenSim/Region/Environment/Modules/ContentManagementSystem/CMModel.cs b/OpenSim/Region/Environment/Modules/ContentManagementSystem/CMModel.cs index 5229489..65fa9ba 100644 --- a/OpenSim/Region/Environment/Modules/ContentManagementSystem/CMModel.cs +++ b/OpenSim/Region/Environment/Modules/ContentManagementSystem/CMModel.cs @@ -272,7 +272,12 @@ namespace OpenSim.Region.Environment.Modules.ContentManagement lock (scene) { - scene.Entities = ReplacementList; + scene.Entities.Clear(); + + foreach(KeyValuePair kvp in ReplacementList) + { + scene.Entities.Add(kvp.Value); + } } foreach (EntityBase ent in ReplacementList.Values) diff --git a/OpenSim/Region/Environment/Modules/World/Land/LandManagementModule.cs b/OpenSim/Region/Environment/Modules/World/Land/LandManagementModule.cs index fe2458c..d33201f 100644 --- a/OpenSim/Region/Environment/Modules/World/Land/LandManagementModule.cs +++ b/OpenSim/Region/Environment/Modules/World/Land/LandManagementModule.cs @@ -666,7 +666,7 @@ namespace OpenSim.Region.Environment.Modules.World.Land ResetAllLandPrimCounts(); lock (m_scene.Entities) { - foreach (EntityBase obj in m_scene.Entities.Values) + foreach (EntityBase obj in m_scene.Entities) { if (obj != null) { diff --git a/OpenSim/Region/Environment/Scenes/EntityManager.cs b/OpenSim/Region/Environment/Scenes/EntityManager.cs index 43bf090..be39878 100644 --- a/OpenSim/Region/Environment/Scenes/EntityManager.cs +++ b/OpenSim/Region/Environment/Scenes/EntityManager.cs @@ -71,21 +71,25 @@ namespace OpenSim.Region.Environment.Scenes } } - public void Remove(uint localID) + public bool Remove(uint localID) { lock(m_lock) { - m_eb_uuid.Remove(m_eb_localID[localID].UUID); - m_eb_localID.Remove(localID); + bool a = m_eb_uuid.Remove(m_eb_localID[localID].UUID); + bool b = m_eb_localID.Remove(localID); + + return a && b; } } - public void Remove(UUID id) + public bool Remove(UUID id) { lock(m_lock) { - m_eb_localID.Remove(m_eb_uuid[id].LocalId); - m_eb_uuid.Remove(id); + bool a = m_eb_localID.Remove(m_eb_uuid[id].LocalId); + bool b = m_eb_uuid.Remove(id); + + return a && b; } } @@ -145,6 +149,22 @@ namespace OpenSim.Region.Environment.Scenes } } + public bool TryGetValue(UUID key, out EntityBase obj) + { + lock(m_lock) + { + return m_eb_uuid.TryGetValue(key, out obj); + } + } + + public bool TryGetValue(uint key, out EntityBase obj) + { + lock (m_lock) + { + return m_eb_localID.TryGetValue(key, out obj); + } + } + /// /// This could be optimised to work on the list 'live' rather than making a safe copy and iterating that. /// diff --git a/OpenSim/Region/Environment/Scenes/Scene.Inventory.cs b/OpenSim/Region/Environment/Scenes/Scene.Inventory.cs index 9b30d87..9f91f37 100644 --- a/OpenSim/Region/Environment/Scenes/Scene.Inventory.cs +++ b/OpenSim/Region/Environment/Scenes/Scene.Inventory.cs @@ -57,7 +57,7 @@ namespace OpenSim.Region.Environment.Scenes { m_log.Info("[PRIM INVENTORY]: Starting scripts in scene"); - foreach (EntityBase group in Entities.Values) + foreach (EntityBase group in Entities) { if (group is SceneObjectGroup) { diff --git a/OpenSim/Region/Environment/Scenes/Scene.cs b/OpenSim/Region/Environment/Scenes/Scene.cs index d2e797a..55e8634 100644 --- a/OpenSim/Region/Environment/Scenes/Scene.cs +++ b/OpenSim/Region/Environment/Scenes/Scene.cs @@ -244,6 +244,7 @@ namespace OpenSim.Region.Environment.Scenes // set { m_sceneGraph.SceneObjects = value; } // } + /** /// /// The dictionary of all entities in this scene. The contents of this dictionary may be changed at any time. /// If you wish to add or remove entities, please use the appropriate method for that entity rather than @@ -257,6 +258,11 @@ namespace OpenSim.Region.Environment.Scenes get { return m_sceneGraph.Entities; } set { m_sceneGraph.Entities = value; } } + */ + public EntityManager Entities + { + get { return m_sceneGraph.Entities; } + } public Dictionary m_restorePresences { @@ -605,7 +611,7 @@ namespace OpenSim.Region.Environment.Scenes m_log.Info("Stopping all Scripts in Scene"); lock (Entities) { - foreach (EntityBase ent in Entities.Values) + foreach (EntityBase ent in Entities) { if (ent is SceneObjectGroup) { @@ -619,7 +625,7 @@ namespace OpenSim.Region.Environment.Scenes m_log.Info("Starting all Scripts in Scene"); lock (Entities) { - foreach (EntityBase ent in Entities.Values) + foreach (EntityBase ent in Entities) { if (ent is SceneObjectGroup) { @@ -1857,7 +1863,7 @@ namespace OpenSim.Region.Environment.Scenes { lock (Entities) { - ICollection entities = new List(Entities.Values); + ICollection entities = new List(Entities); foreach (EntityBase e in entities) { diff --git a/OpenSim/Region/Environment/Scenes/SceneGraph.cs b/OpenSim/Region/Environment/Scenes/SceneGraph.cs index 05ad996..2c75867 100644 --- a/OpenSim/Region/Environment/Scenes/SceneGraph.cs +++ b/OpenSim/Region/Environment/Scenes/SceneGraph.cs @@ -59,7 +59,8 @@ namespace OpenSim.Region.Environment.Scenes protected internal Dictionary ScenePresences = new Dictionary(); // SceneObjects is not currently populated or used. //public Dictionary SceneObjects; - protected internal Dictionary Entities = new Dictionary(); + protected internal EntityManager Entities = new EntityManager(); +// protected internal Dictionary Entities = new Dictionary(); protected internal Dictionary RestorePresences = new Dictionary(); protected internal BasicQuadTreeNode QuadTree; @@ -972,10 +973,7 @@ namespace OpenSim.Region.Environment.Scenes /// protected internal List GetEntities() { - lock (Entities) - { - return new List(Entities.Values); - } + return Entities.GetEntities(); } protected internal Dictionary GetTopScripts() diff --git a/OpenSim/Region/Environment/Scenes/ScenePresence.cs b/OpenSim/Region/Environment/Scenes/ScenePresence.cs index 042a4fb..807fd8c 100644 --- a/OpenSim/Region/Environment/Scenes/ScenePresence.cs +++ b/OpenSim/Region/Environment/Scenes/ScenePresence.cs @@ -600,7 +600,7 @@ namespace OpenSim.Region.Environment.Scenes { m_pendingObjects = new Queue(); - List ents = new List(m_scene.Entities.Values); + List ents = new List(m_scene.Entities); if (!m_isChildAgent) // Proximity sort makes no sense for { // Child agents ents.Sort(delegate(EntityBase a, EntityBase b) -- cgit v1.1