From 73e9b0be725a73a489b29f3fe2df236c897ef3b5 Mon Sep 17 00:00:00 2001 From: Dan Lake Date: Wed, 17 Mar 2010 06:40:00 -0700 Subject: Inconsistent locking of ScenePresence array in SceneGraph. Fixed by eliminating option to return the actual list. Callers can now either request a copy of the array as a new List or ask the SceneGraph to call a delegate function on every ScenePresence. Iteration and locking of the ScenePresences now takes place only within the SceneGraph class. This patch also applies a fix to Combat/CombatModule.cs which had unlocked iteration of the ScenePresences and inconsistent try/catch around the use of those ScenePresences. --- OpenSim/Region/Framework/Scenes/SceneManager.cs | 17 +++++------------ 1 file changed, 5 insertions(+), 12 deletions(-) (limited to 'OpenSim/Region/Framework/Scenes/SceneManager.cs') diff --git a/OpenSim/Region/Framework/Scenes/SceneManager.cs b/OpenSim/Region/Framework/Scenes/SceneManager.cs index 680c39a..a955532 100644 --- a/OpenSim/Region/Framework/Scenes/SceneManager.cs +++ b/OpenSim/Region/Framework/Scenes/SceneManager.cs @@ -414,12 +414,8 @@ namespace OpenSim.Region.Framework.Scenes ForEachCurrentScene( delegate(Scene scene) { - ScenePresence[] scenePresences = scene.GetScenePresences(); - - for (int i = 0; i < scenePresences.Length; i++) + scene.ForEachScenePresence(delegate(ScenePresence scenePresence) { - ScenePresence scenePresence = scenePresences[i]; - if (!scenePresence.IsChildAgent) { m_log.DebugFormat("Packet debug for {0} {1} set to {2}", @@ -429,7 +425,7 @@ namespace OpenSim.Region.Framework.Scenes scenePresence.ControllingClient.SetDebugPacketLevel(newDebug); } - } + }); } ); } @@ -441,14 +437,11 @@ namespace OpenSim.Region.Framework.Scenes ForEachCurrentScene( delegate(Scene scene) { - ScenePresence[] scenePresences = scene.GetScenePresences(); - - for (int i = 0; i < scenePresences.Length; i++) + scene.ForEachScenePresence(delegate(ScenePresence scenePresence) { - ScenePresence scenePresence = scenePresences[i]; if (!scenePresence.IsChildAgent) avatars.Add(scenePresence); - } + }); } ); @@ -461,7 +454,7 @@ namespace OpenSim.Region.Framework.Scenes ForEachCurrentScene(delegate(Scene scene) { - ScenePresence[] scenePresences = scene.GetScenePresences(); + List scenePresences = scene.GetScenePresences(); presences.AddRange(scenePresences); }); -- cgit v1.1