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