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/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 +- 5 files changed, 40 insertions(+), 16 deletions(-) (limited to 'OpenSim/Region/Environment/Scenes') 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