From e80dcfa9f6eb14f67f7a7bdf4ae7a596323e156c Mon Sep 17 00:00:00 2001 From: diva Date: Thu, 15 Jan 2009 23:37:49 +0000 Subject: Eased the locking times of ScenePresences. No locks were removed, just the locking periods changed. * Added an additional lock in GetScenePresences() * Changed ForEachClient to use GetScenePresences() instead of the main ScenePresences dictionary, so that there is no need to lock. --- OpenSim/Region/Environment/Scenes/Scene.cs | 55 ++++++++++++++----------- OpenSim/Region/Environment/Scenes/SceneGraph.cs | 15 +++++-- 2 files changed, 43 insertions(+), 27 deletions(-) diff --git a/OpenSim/Region/Environment/Scenes/Scene.cs b/OpenSim/Region/Environment/Scenes/Scene.cs index fad90fa..9c3aa96 100644 --- a/OpenSim/Region/Environment/Scenes/Scene.cs +++ b/OpenSim/Region/Environment/Scenes/Scene.cs @@ -3175,13 +3175,16 @@ namespace OpenSim.Region.Environment.Scenes return; } + ScenePresence sp = null; lock (m_scenePresences) { if (m_scenePresences.ContainsKey(remoteClient.AgentId)) - { - m_sceneGridService.RequestTeleportToLocation(m_scenePresences[remoteClient.AgentId], info.RegionHandle, - position, Vector3.Zero, (uint)(TPFlags.SetLastToTarget | TPFlags.ViaLandmark)); - } + sp = m_scenePresences[remoteClient.AgentId]; + } + if (sp != null) + { + m_sceneGridService.RequestTeleportToLocation(sp, info.RegionHandle, + position, Vector3.Zero, (uint)(TPFlags.SetLastToTarget | TPFlags.ViaLandmark)); } } @@ -3417,36 +3420,40 @@ namespace OpenSim.Region.Environment.Scenes public void handleRequestGodlikePowers(UUID agentID, UUID sessionID, UUID token, bool godLike, IClientAPI controllingClient) { + ScenePresence sp = null; + lock (m_scenePresences) { // User needs to be logged into this sim - if (m_scenePresences.ContainsKey(agentID)) + m_scenePresences.TryGetValue(agentID, out sp); + } + + if (sp != null) + { + if (godLike == false) { - if (godLike == false) - { - m_scenePresences[agentID].GrantGodlikePowers(agentID, sessionID, token, godLike); - return; - } + sp.GrantGodlikePowers(agentID, sessionID, token, godLike); + return; + } - // First check that this is the sim owner - if (Permissions.IsGod(agentID)) + // First check that this is the sim owner + if (Permissions.IsGod(agentID)) + { + // Next we check for spoofing..... + UUID testSessionID = sp.ControllingClient.SessionId; + if (sessionID == testSessionID) { - // Next we check for spoofing..... - UUID testSessionID = m_scenePresences[agentID].ControllingClient.SessionId; - if (sessionID == testSessionID) + if (sessionID == controllingClient.SessionId) { - if (sessionID == controllingClient.SessionId) - { - //m_log.Info("godlike: " + godLike.ToString()); - m_scenePresences[agentID].GrantGodlikePowers(agentID, testSessionID, token, godLike); - } + //m_log.Info("godlike: " + godLike.ToString()); + sp.GrantGodlikePowers(agentID, testSessionID, token, godLike); } } - else - { - m_dialogModule.SendAlertToUser(agentID, "Request for god powers denied"); - } } + else + { + m_dialogModule.SendAlertToUser(agentID, "Request for god powers denied"); + } } } diff --git a/OpenSim/Region/Environment/Scenes/SceneGraph.cs b/OpenSim/Region/Environment/Scenes/SceneGraph.cs index be2fb46..940aee6 100644 --- a/OpenSim/Region/Environment/Scenes/SceneGraph.cs +++ b/OpenSim/Region/Environment/Scenes/SceneGraph.cs @@ -774,7 +774,10 @@ namespace OpenSim.Region.Environment.Scenes /// protected internal List GetScenePresences() { - return new List(ScenePresences.Values); + lock (ScenePresences) + { + return new List(ScenePresences.Values); + } } protected internal List GetAvatars() @@ -1085,12 +1088,18 @@ namespace OpenSim.Region.Environment.Scenes protected internal void ForEachClient(Action action) { - lock (ScenePresences) + List splist = GetScenePresences(); + foreach (ScenePresence presence in splist) { - foreach (ScenePresence presence in ScenePresences.Values) + try { action(presence.ControllingClient); } + catch (Exception e) + { + // Catch it and move on. This includes situations where splist has inconsistent info + m_log.WarnFormat("[SCENE]: Problem processing action in ForEachClient: ", e.Message); + } } } -- cgit v1.1