diff --git a/OpenSim/Region/Environment/Scenes/InnerScene.cs b/OpenSim/Region/Environment/Scenes/InnerScene.cs index 03f3cd0255..0ca3405dba 100644 --- a/OpenSim/Region/Environment/Scenes/InnerScene.cs +++ b/OpenSim/Region/Environment/Scenes/InnerScene.cs @@ -129,7 +129,7 @@ namespace OpenSim.Region.Environment.Scenes internal void UpdateEntities() { - List updateEntities = new List(Entities.Values); + List updateEntities = GetEntities(); foreach (EntityBase entity in updateEntities) { @@ -147,7 +147,7 @@ namespace OpenSim.Region.Environment.Scenes internal void UpdateEntityMovement() { - List moveEntities = new List(Entities.Values); + List moveEntities = GetEntities(); foreach (EntityBase entity in moveEntities) { @@ -174,7 +174,10 @@ namespace OpenSim.Region.Environment.Scenes if (!Entities.ContainsKey(sceneObject.UUID)) { // QuadTree.AddObject(sceneObject); - Entities.Add(sceneObject.UUID, sceneObject); + lock (Entities) + { + Entities.Add(sceneObject.UUID, sceneObject); + } m_numPrim++; } } @@ -188,7 +191,9 @@ namespace OpenSim.Region.Environment.Scenes } public void RemovePrim(uint localID, LLUUID avatar_deleter) { - foreach (EntityBase obj in Entities.Values) + List EntityList = GetEntities(); + + foreach (EntityBase obj in EntityList) { if (obj is SceneObjectGroup) { @@ -310,7 +315,12 @@ namespace OpenSim.Region.Environment.Scenes /// public List GetScenePresences() { - List result = new List(ScenePresences.Values); + List result; + + lock (ScenePresences) + { + result = new List(ScenePresences.Values); + } return result; } @@ -330,8 +340,9 @@ namespace OpenSim.Region.Environment.Scenes public List GetScenePresences(FilterAvatarList filter) { List result = new List(); + List ScenePresencesList = GetScenePresences(); - foreach (ScenePresence avatar in ScenePresences.Values) + foreach (ScenePresence avatar in ScenePresencesList) { if (filter(avatar)) { @@ -358,7 +369,9 @@ namespace OpenSim.Region.Environment.Scenes private SceneObjectGroup GetGroupByPrim(uint localID) { - foreach (EntityBase ent in Entities.Values) + List EntityList = GetEntities(); + + foreach (EntityBase ent in EntityList) { if (ent is SceneObjectGroup) { @@ -371,7 +384,9 @@ namespace OpenSim.Region.Environment.Scenes private SceneObjectGroup GetGroupByPrim(LLUUID fullID) { - foreach (EntityBase ent in Entities.Values) + List EntityList = GetEntities(); + + foreach (EntityBase ent in EntityList) { if (ent is SceneObjectGroup) { @@ -461,6 +476,18 @@ namespace OpenSim.Region.Environment.Scenes return false; } + public List GetEntities() + { + List result; + + lock (Entities) + { + result = new List(Entities.Values); + } + + return result; + } + #endregion #region Other Methods @@ -484,7 +511,9 @@ namespace OpenSim.Region.Environment.Scenes public void SendAllSceneObjectsToClient(ScenePresence presence) { - foreach (EntityBase ent in Entities.Values) + List EntityList = GetEntities(); + + foreach (EntityBase ent in EntityList) { if (ent is SceneObjectGroup) { @@ -770,8 +799,10 @@ namespace OpenSim.Region.Environment.Scenes /// public void LinkObjects(uint parentPrim, List childPrims) { + List EntityList = GetEntities(); + SceneObjectGroup parenPrim = null; - foreach (EntityBase ent in Entities.Values) + foreach (EntityBase ent in EntityList) { if (ent is SceneObjectGroup) { @@ -788,7 +819,7 @@ namespace OpenSim.Region.Environment.Scenes { for (int i = 0; i < childPrims.Count; i++) { - foreach (EntityBase ent in Entities.Values) + foreach (EntityBase ent in EntityList) { if (ent is SceneObjectGroup) { @@ -819,8 +850,10 @@ namespace OpenSim.Region.Environment.Scenes // XXX I'm anticipating that building this dictionary once is more efficient than // repeated scanning of the Entity.Values for a large number of primIds. However, it might // be more efficient yet to keep this dictionary permanently on hand. + Dictionary sceneObjects = new Dictionary(); - foreach (EntityBase ent in Entities.Values) + List EntitieList = GetEntities(); + foreach (EntityBase ent in EntitieList) { if (ent is SceneObjectGroup) { @@ -863,8 +896,10 @@ namespace OpenSim.Region.Environment.Scenes /// public void DuplicateObject(uint originalPrim, LLVector3 offset, uint flags, LLUUID AgentID, LLUUID GroupID) { + List EntityList = GetEntities(); + SceneObjectGroup originPrim = null; - foreach (EntityBase ent in Entities.Values) + foreach (EntityBase ent in EntityList) { if (ent is SceneObjectGroup) { @@ -882,7 +917,10 @@ namespace OpenSim.Region.Environment.Scenes { SceneObjectGroup copy = originPrim.Copy(AgentID, GroupID); copy.AbsolutePosition = copy.AbsolutePosition + offset; - Entities.Add(copy.UUID, copy); + lock (Entities) + { + Entities.Add(copy.UUID, copy); + } m_numPrim++; copy.ScheduleGroupForFullUpdate(); } diff --git a/OpenSim/Region/Environment/Scenes/Scene.Inventory.cs b/OpenSim/Region/Environment/Scenes/Scene.Inventory.cs index 7026fea95d..9821906f4a 100644 --- a/OpenSim/Region/Environment/Scenes/Scene.Inventory.cs +++ b/OpenSim/Region/Environment/Scenes/Scene.Inventory.cs @@ -33,6 +33,7 @@ using OpenSim.Framework; using OpenSim.Framework.Communications.Cache; using OpenSim.Framework.Console; using OpenSim.Region.Physics.Manager; +using System.Collections.Generic; namespace OpenSim.Region.Environment.Scenes { @@ -342,7 +343,9 @@ namespace OpenSim.Region.Environment.Scenes private SceneObjectGroup GetGroupByPrim(uint localID) { - foreach (EntityBase ent in Entities.Values) + List EntitieList = GetEntities(); + + foreach (EntityBase ent in EntitieList) { if (ent is SceneObjectGroup) { @@ -455,7 +458,10 @@ namespace OpenSim.Region.Environment.Scenes { EntityBase selectedEnt = null; //MainLog.Instance.Verbose("CLIENT", "LocalID:" + Data.ObjectLocalID.ToString()); - foreach (EntityBase ent in Entities.Values) + + List EntitieList = GetEntities(); + + foreach (EntityBase ent in EntitieList) { if (ent.LocalId == Data.ObjectLocalID) { diff --git a/OpenSim/Region/Environment/Scenes/Scene.PacketHandlers.cs b/OpenSim/Region/Environment/Scenes/Scene.PacketHandlers.cs index aa7c7b41eb..6a7c266a3d 100644 --- a/OpenSim/Region/Environment/Scenes/Scene.PacketHandlers.cs +++ b/OpenSim/Region/Environment/Scenes/Scene.PacketHandlers.cs @@ -97,7 +97,9 @@ namespace OpenSim.Region.Environment.Scenes /// public void SelectPrim(uint primLocalID, IClientAPI remoteClient) { - foreach (EntityBase ent in Entities.Values) + List EntitieList = GetEntities(); + + foreach (EntityBase ent in EntitieList) { if (ent is SceneObjectGroup) { @@ -119,7 +121,9 @@ namespace OpenSim.Region.Environment.Scenes /// public void DeselectPrim(uint primLocalID, IClientAPI remoteClient) { - foreach (EntityBase ent in Entities.Values) + List EntitieList = GetEntities(); + + foreach (EntityBase ent in EntitieList) { if (ent is SceneObjectGroup) { @@ -137,7 +141,9 @@ namespace OpenSim.Region.Environment.Scenes { EventManager.TriggerObjectGrab(localID, offsetPos, remoteClient); - foreach (EntityBase ent in Entities.Values) + List EntitieList = GetEntities(); + + foreach (EntityBase ent in EntitieList) { if (ent is SceneObjectGroup) { diff --git a/OpenSim/Region/Environment/Scenes/Scene.cs b/OpenSim/Region/Environment/Scenes/Scene.cs index 8277f396df..db2e4b8563 100644 --- a/OpenSim/Region/Environment/Scenes/Scene.cs +++ b/OpenSim/Region/Environment/Scenes/Scene.cs @@ -1615,7 +1615,9 @@ namespace OpenSim.Region.Environment.Scenes /// public void SendGeneralAlert(string message) { - foreach (ScenePresence presence in m_scenePresences.Values) + List presenceList = GetScenePresences(); + + foreach (ScenePresence presence in presenceList) { presence.ControllingClient.SendAlertMessage(message); } @@ -1776,7 +1778,9 @@ namespace OpenSim.Region.Environment.Scenes /// public void SendAlertToUser(string firstName, string lastName, string message, bool modal) { - foreach (ScenePresence presence in m_scenePresences.Values) + List presenceList = GetScenePresences(); + + foreach (ScenePresence presence in presenceList) { if ((presence.Firstname == firstName) && (presence.Lastname == lastName)) { @@ -1821,7 +1825,9 @@ namespace OpenSim.Region.Environment.Scenes /// public void ForceClientUpdate() { - foreach (EntityBase ent in Entities.Values) + List EntitieList = GetEntities(); + + foreach (EntityBase ent in EntitieList) { if (ent is SceneObjectGroup) { @@ -1838,7 +1844,10 @@ namespace OpenSim.Region.Environment.Scenes public void HandleEditCommand(string[] cmdparams) { Console.WriteLine("Searching for Primitive: '" + cmdparams[0] + "'"); - foreach (EntityBase ent in Entities.Values) + + List EntitieList = GetEntities(); + + foreach (EntityBase ent in EntitieList) { if (ent is SceneObjectGroup) { @@ -2017,7 +2026,8 @@ namespace OpenSim.Region.Environment.Scenes if (!(m_scenePresences.Equals(null))) { try { - foreach (ScenePresence presence in m_scenePresences.Values) + List presenceList = GetScenePresences(); + foreach (ScenePresence presence in presenceList) { action(presence); } @@ -2033,7 +2043,14 @@ namespace OpenSim.Region.Environment.Scenes /// public void ForEachObject(Action action) { - foreach (SceneObjectGroup presence in m_sceneObjects.Values) + List presenceList; + + lock (m_sceneObjects) + { + presenceList = new List(m_sceneObjects.Values); + } + + foreach (SceneObjectGroup presence in presenceList) { action(presence); } @@ -2074,6 +2091,11 @@ namespace OpenSim.Region.Environment.Scenes m_innerScene.ForEachClient(action); } + public List GetEntities() + { + return m_innerScene.GetEntities(); + } + #endregion } } diff --git a/OpenSim/Region/Environment/Scenes/SceneManager.cs b/OpenSim/Region/Environment/Scenes/SceneManager.cs index c589e8db21..e822874804 100644 --- a/OpenSim/Region/Environment/Scenes/SceneManager.cs +++ b/OpenSim/Region/Environment/Scenes/SceneManager.cs @@ -290,7 +290,9 @@ namespace OpenSim.Region.Environment.Scenes { ForEachCurrentScene(delegate(Scene scene) { - foreach (EntityBase entity in scene.Entities.Values) + List EntitieList = scene.GetEntities(); + + foreach (EntityBase entity in EntitieList) { if (entity is ScenePresence) { @@ -315,7 +317,9 @@ namespace OpenSim.Region.Environment.Scenes ForEachCurrentScene(delegate(Scene scene) { - foreach (EntityBase entity in scene.Entities.Values) + List EntitieList = scene.GetEntities(); + + foreach (EntityBase entity in EntitieList) { if (entity is ScenePresence) { @@ -419,4 +423,4 @@ namespace OpenSim.Region.Environment.Scenes m_localScenes.ForEach(action); } } -} \ No newline at end of file +} diff --git a/OpenSim/Region/Environment/Scenes/SceneXmlLoader.cs b/OpenSim/Region/Environment/Scenes/SceneXmlLoader.cs index c4411e3a8d..aeb9c6133a 100644 --- a/OpenSim/Region/Environment/Scenes/SceneXmlLoader.cs +++ b/OpenSim/Region/Environment/Scenes/SceneXmlLoader.cs @@ -108,7 +108,10 @@ namespace OpenSim.Region.Environment.Scenes StreamWriter stream = new StreamWriter(file); int primCount = 0; stream.WriteLine("\n"); - foreach (EntityBase ent in m_innerScene.Entities.Values) + + List EntityList = m_innerScene.GetEntities(); + + foreach (EntityBase ent in EntityList) { if (ent is SceneObjectGroup) { @@ -170,7 +173,10 @@ namespace OpenSim.Region.Environment.Scenes StreamWriter stream = new StreamWriter(file); int primCount = 0; stream.WriteLine("\n"); - foreach (EntityBase ent in m_innerScene.Entities.Values) + + List EntityList = m_innerScene.GetEntities(); + + foreach (EntityBase ent in EntityList) { if (ent is SceneObjectGroup) {