From be02107ea88885f377176937d7cbf5ec1b285c42 Mon Sep 17 00:00:00 2001 From: Justin Clarke Casey Date: Wed, 7 May 2008 22:59:30 +0000 Subject: * Increasing ScenePresences locking to prevent race conditions such as those seen in one of the crashes of mantis 1163 * It's not impossible that this could lead to deadlock where sessions simply appear to freeze, even though the region console still responds. * If this is the case, please file a mantis --- OpenSim/Region/Environment/Scenes/InnerScene.cs | 39 +++++++++++++++++-------- 1 file changed, 27 insertions(+), 12 deletions(-) (limited to 'OpenSim/Region/Environment/Scenes/InnerScene.cs') diff --git a/OpenSim/Region/Environment/Scenes/InnerScene.cs b/OpenSim/Region/Environment/Scenes/InnerScene.cs index 80e71c8..9d4119d 100644 --- a/OpenSim/Region/Environment/Scenes/InnerScene.cs +++ b/OpenSim/Region/Environment/Scenes/InnerScene.cs @@ -116,7 +116,11 @@ namespace OpenSim.Region.Environment.Scenes public void Close() { - ScenePresences.Clear(); + lock (ScenePresences) + { + ScenePresences.Clear(); + } + //SceneObjects.Clear(); Entities.Clear(); } @@ -792,6 +796,8 @@ namespace OpenSim.Region.Environment.Scenes /// public List GetScenePresences(FilterAvatarList filter) { + // No locking of scene presences here since we're passing back a list... + List result = new List(); List ScenePresencesList = GetScenePresences(); @@ -813,9 +819,12 @@ namespace OpenSim.Region.Environment.Scenes /// null if the agent was not found public ScenePresence GetScenePresence(LLUUID agentID) { - if (ScenePresences.ContainsKey(agentID)) + lock (ScenePresences) { - return ScenePresences[agentID]; + if (ScenePresences.ContainsKey(agentID)) + { + return ScenePresences[agentID]; + } } return null; @@ -917,16 +926,19 @@ namespace OpenSim.Region.Environment.Scenes internal bool TryGetAvatarByName(string avatarName, out ScenePresence avatar) { - foreach (ScenePresence presence in ScenePresences.Values) + lock (ScenePresences) { - if (!presence.IsChildAgent) + foreach (ScenePresence presence in ScenePresences.Values) { - string name = presence.ControllingClient.FirstName + " " + presence.ControllingClient.LastName; - - if (String.Compare(avatarName, name, true) == 0) + if (!presence.IsChildAgent) { - avatar = presence; - return true; + string name = presence.ControllingClient.FirstName + " " + presence.ControllingClient.LastName; + + if (String.Compare(avatarName, name, true) == 0) + { + avatar = presence; + return true; + } } } } @@ -1008,9 +1020,12 @@ namespace OpenSim.Region.Environment.Scenes internal void ForEachClient(Action action) { - foreach (ScenePresence presence in ScenePresences.Values) + lock (ScenePresences) { - action(presence.ControllingClient); + foreach (ScenePresence presence in ScenePresences.Values) + { + action(presence.ControllingClient); + } } } -- cgit v1.1