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