Rewrote parts of the code that were double-locking different objects. This is about half of the code base reviewed.

This commit is contained in:
Diva Canto
2009-10-06 15:39:53 -07:00
parent 99c85b5ef5
commit e992ca0255
9 changed files with 211 additions and 176 deletions

View File

@@ -442,42 +442,46 @@ namespace OpenSim.Region.CoreModules.Avatar.Friends
private ScenePresence GetRootPresenceFromAgentID(UUID AgentID)
{
ScenePresence returnAgent = null;
List<Scene> scenes = null;
lock (m_scenes)
{
ScenePresence queryagent = null;
foreach (Scene scene in m_scenes.Values)
{
queryagent = scene.GetScenePresence(AgentID);
if (queryagent != null)
{
if (!queryagent.IsChildAgent)
{
returnAgent = queryagent;
break;
}
}
}
}
return returnAgent;
}
scenes = new List<Scene>(m_scenes.Values);
private ScenePresence GetAnyPresenceFromAgentID(UUID AgentID)
{
ScenePresence returnAgent = null;
lock (m_scenes)
ScenePresence queryagent = null;
foreach (Scene scene in scenes)
{
ScenePresence queryagent = null;
foreach (Scene scene in m_scenes.Values)
queryagent = scene.GetScenePresence(AgentID);
if (queryagent != null)
{
queryagent = scene.GetScenePresence(AgentID);
if (queryagent != null)
if (!queryagent.IsChildAgent)
{
returnAgent = queryagent;
break;
}
}
}
return returnAgent;
}
private ScenePresence GetAnyPresenceFromAgentID(UUID AgentID)
{
List<Scene> scenes = null;
lock (m_scenes)
scenes = new List<Scene>(m_scenes.Values);
ScenePresence returnAgent = null;
ScenePresence queryagent = null;
foreach (Scene scene in m_scenes.Values)
{
queryagent = scene.GetScenePresence(AgentID);
if (queryagent != null)
{
returnAgent = queryagent;
break;
}
}
return returnAgent;
}

View File

@@ -290,13 +290,14 @@ namespace OpenSim.Region.CoreModules.Avatar.InstantMessage
// get the agent. This should work every time, as we just got a packet from it
ScenePresence agent = null;
List<Scene> scenes = null;
lock (m_Scenes)
scenes = new List<Scene>(m_Scenes);
foreach (Scene scene in scenes)
{
foreach (Scene scene in m_Scenes)
{
agent = scene.GetScenePresence(agentID);
if (agent != null) break;
}
agent = scene.GetScenePresence(agentID);
if (agent != null) break;
}
// just to be paranoid...

View File

@@ -111,16 +111,17 @@ namespace OpenSim.Region.CoreModules.Avatar.Inventory.Transfer
private Scene FindClientScene(UUID agentId)
{
List<Scene> scenes = null;
lock (m_Scenelist)
scenes = new List<Scene>(m_Scenelist);
foreach (Scene scene in scenes)
{
foreach (Scene scene in m_Scenelist)
ScenePresence presence = scene.GetScenePresence(agentId);
if (presence != null)
{
ScenePresence presence = scene.GetScenePresence(agentId);
if (presence != null)
{
if (!presence.IsChildAgent)
return scene;
}
if (!presence.IsChildAgent)
return scene;
}
}
return null;

View File

@@ -198,19 +198,20 @@ namespace OpenSim.Region.CoreModules.Scripting.EmailModules
private SceneObjectPart findPrim(UUID objectID, out string ObjectRegionName)
{
List<Scene> scenes = null;
lock (m_Scenes)
scenes = new List<Scene>(m_Scenes.Values);
foreach (Scene s in scenes)
{
foreach (Scene s in m_Scenes.Values)
SceneObjectPart part = s.GetSceneObjectPart(objectID);
if (part != null)
{
SceneObjectPart part = s.GetSceneObjectPart(objectID);
if (part != null)
{
ObjectRegionName = s.RegionInfo.RegionName;
uint localX = (s.RegionInfo.RegionLocX * (int)Constants.RegionSize);
uint localY = (s.RegionInfo.RegionLocY * (int)Constants.RegionSize);
ObjectRegionName = ObjectRegionName + " (" + localX + ", " + localY + ")";
return part;
}
ObjectRegionName = s.RegionInfo.RegionName;
uint localX = (s.RegionInfo.RegionLocX * (int)Constants.RegionSize);
uint localY = (s.RegionInfo.RegionLocY * (int)Constants.RegionSize);
ObjectRegionName = ObjectRegionName + " (" + localX + ", " + localY + ")";
return part;
}
}
ObjectRegionName = string.Empty;
@@ -363,6 +364,7 @@ namespace OpenSim.Region.CoreModules.Scripting.EmailModules
public Email GetNextEmail(UUID objectID, string sender, string subject)
{
List<Email> queue = null;
List<UUID> removal = new List<UUID>();
lock (m_LastGetEmailCall)
{
@@ -375,7 +377,6 @@ namespace OpenSim.Region.CoreModules.Scripting.EmailModules
// Hopefully this isn't too time consuming. If it is, we can always push it into a worker thread.
DateTime now = DateTime.Now;
List<UUID> removal = new List<UUID>();
foreach (UUID uuid in m_LastGetEmailCall.Keys)
{
if ((now - m_LastGetEmailCall[uuid]) > m_QueueTimeout)
@@ -383,15 +384,15 @@ namespace OpenSim.Region.CoreModules.Scripting.EmailModules
removal.Add(uuid);
}
}
}
foreach (UUID remove in removal)
{
foreach (UUID remove in removal)
{
lock (m_LastGetEmailCall)
m_LastGetEmailCall.Remove(remove);
lock (m_MailQueues)
{
m_MailQueues.Remove(remove);
}
}
lock (m_MailQueues)
m_MailQueues.Remove(remove);
}
lock (m_MailQueues)

View File

@@ -187,14 +187,16 @@ namespace OpenSim.Region.CoreModules.World.Land
LandData newData = data.Copy();
newData.LocalID = local_id;
ILandObject land = null;
lock (m_landList)
{
if (m_landList.ContainsKey(local_id))
{
m_landList[local_id].LandData = newData;
m_scene.EventManager.TriggerLandObjectUpdated((uint)local_id, m_landList[local_id]);
land = m_landList[local_id];
}
}
m_scene.EventManager.TriggerLandObjectUpdated((uint)local_id, land);
}
public bool AllowedForcefulBans
@@ -504,6 +506,7 @@ namespace OpenSim.Region.CoreModules.World.Land
/// <param name="local_id">Land.localID of the peice of land to remove.</param>
public void removeLandObject(int local_id)
{
UUID id = UUID.Zero;
lock (m_landList)
{
for (int x = 0; x < 64; x++)
@@ -520,9 +523,10 @@ namespace OpenSim.Region.CoreModules.World.Land
}
}
m_scene.EventManager.TriggerLandObjectRemoved(m_landList[local_id].LandData.GlobalID);
id = m_landList[local_id].LandData.GlobalID;
m_landList.Remove(local_id);
}
m_scene.EventManager.TriggerLandObjectRemoved(id);
}
private void performFinalLandJoin(ILandObject master, ILandObject slave)