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