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

This reverts commit e992ca0255.
prioritization
Melanie 2009-10-07 01:45:49 +01:00
parent e992ca0255
commit 89d23a1fa2
9 changed files with 174 additions and 209 deletions

View File

@ -128,18 +128,24 @@ namespace OpenSim.Framework.Communications.Cache
/// <returns>null if no user details are found</returns> /// <returns>null if no user details are found</returns>
public CachedUserInfo GetUserDetails(string fname, string lname) public CachedUserInfo GetUserDetails(string fname, string lname)
{ {
CachedUserInfo userInfo;
lock (m_userProfilesByName) lock (m_userProfilesByName)
{ {
CachedUserInfo userInfo;
if (m_userProfilesByName.TryGetValue(string.Format(NAME_FORMAT, fname, lname), out userInfo)) if (m_userProfilesByName.TryGetValue(string.Format(NAME_FORMAT, fname, lname), out userInfo))
{
return userInfo; return userInfo;
}
else
{
UserProfileData userProfile = m_commsManager.UserService.GetUserProfile(fname, lname);
if (userProfile != null)
return AddToCaches(userProfile);
else
return null;
}
} }
UserProfileData userProfile = m_commsManager.UserService.GetUserProfile(fname, lname);
if (userProfile != null)
return AddToCaches(userProfile);
else
return null;
} }
/// <summary> /// <summary>
@ -154,14 +160,20 @@ namespace OpenSim.Framework.Communications.Cache
return null; return null;
lock (m_userProfilesById) lock (m_userProfilesById)
{
if (m_userProfilesById.ContainsKey(userID)) if (m_userProfilesById.ContainsKey(userID))
{
return m_userProfilesById[userID]; return m_userProfilesById[userID];
}
UserProfileData userProfile = m_commsManager.UserService.GetUserProfile(userID); else
if (userProfile != null) {
return AddToCaches(userProfile); UserProfileData userProfile = m_commsManager.UserService.GetUserProfile(userID);
else if (userProfile != null)
return null; return AddToCaches(userProfile);
else
return null;
}
}
} }
/// <summary> /// <summary>
@ -199,10 +211,14 @@ namespace OpenSim.Framework.Communications.Cache
CachedUserInfo createdUserInfo = new CachedUserInfo(m_InventoryService, userProfile); CachedUserInfo createdUserInfo = new CachedUserInfo(m_InventoryService, userProfile);
lock (m_userProfilesById) lock (m_userProfilesById)
{
m_userProfilesById[createdUserInfo.UserProfile.ID] = createdUserInfo; m_userProfilesById[createdUserInfo.UserProfile.ID] = createdUserInfo;
lock (m_userProfilesByName) lock (m_userProfilesByName)
m_userProfilesByName[createdUserInfo.UserProfile.Name] = createdUserInfo; {
m_userProfilesByName[createdUserInfo.UserProfile.Name] = createdUserInfo;
}
}
return createdUserInfo; return createdUserInfo;
} }
@ -214,25 +230,21 @@ namespace OpenSim.Framework.Communications.Cache
/// <returns>true if there was a profile to remove, false otherwise</returns> /// <returns>true if there was a profile to remove, false otherwise</returns>
protected bool RemoveFromCaches(UUID userId) protected bool RemoveFromCaches(UUID userId)
{ {
CachedUserInfo userInfo = null;
lock (m_userProfilesById) lock (m_userProfilesById)
{ {
if (m_userProfilesById.ContainsKey(userId)) if (m_userProfilesById.ContainsKey(userId))
{ {
userInfo = m_userProfilesById[userId]; CachedUserInfo userInfo = m_userProfilesById[userId];
m_userProfilesById.Remove(userId); m_userProfilesById.Remove(userId);
}
} lock (m_userProfilesByName)
if (userInfo != null)
lock (m_userProfilesByName)
{
if (m_userProfilesByName.ContainsKey(userInfo.UserProfile.Name))
{ {
m_userProfilesByName.Remove(userInfo.UserProfile.Name); m_userProfilesByName.Remove(userInfo.UserProfile.Name);
return true;
} }
return true;
} }
}
return false; return false;
} }

View File

@ -3122,7 +3122,6 @@ namespace OpenSim.Region.ClientStack.LindenUDP
objectData.TextureAnim = textureanim; objectData.TextureAnim = textureanim;
} }
bool doUpdate = false;
lock (m_primFullUpdates) lock (m_primFullUpdates)
{ {
if (m_primFullUpdates.Count == 0) if (m_primFullUpdates.Count == 0)
@ -3131,10 +3130,8 @@ namespace OpenSim.Region.ClientStack.LindenUDP
m_primFullUpdates.Add(objectData); m_primFullUpdates.Add(objectData);
if (m_primFullUpdates.Count >= m_primFullUpdatesPerPacket) if (m_primFullUpdates.Count >= m_primFullUpdatesPerPacket)
doUpdate = true; ProcessPrimFullUpdates(this, null);
} }
if (doUpdate)
ProcessPrimFullUpdates(this, null);
} }
void HandleQueueEmpty(ThrottleOutPacketType queue) void HandleQueueEmpty(ThrottleOutPacketType queue)
@ -3155,40 +3152,35 @@ namespace OpenSim.Region.ClientStack.LindenUDP
void ProcessPrimFullUpdates(object sender, ElapsedEventArgs e) void ProcessPrimFullUpdates(object sender, ElapsedEventArgs e)
{ {
bool stopTimer = false;
lock (m_primFullUpdates) lock (m_primFullUpdates)
{ {
if (m_primFullUpdates.Count == 0 && m_primFullUpdateTimer.Enabled) if (m_primFullUpdates.Count == 0 && m_primFullUpdateTimer.Enabled)
stopTimer = true; {
} lock (m_primFullUpdateTimer)
if (stopTimer) m_primFullUpdateTimer.Stop();
{
lock (m_primFullUpdateTimer)
m_primFullUpdateTimer.Stop();
return;
}
ObjectUpdatePacket outPacket = return;
(ObjectUpdatePacket)PacketPool.Instance.GetPacket( }
PacketType.ObjectUpdate);
outPacket.RegionData.RegionHandle = ObjectUpdatePacket outPacket =
Scene.RegionInfo.RegionHandle; (ObjectUpdatePacket)PacketPool.Instance.GetPacket(
outPacket.RegionData.TimeDilation = PacketType.ObjectUpdate);
(ushort)(Scene.TimeDilation * ushort.MaxValue);
int max = m_primFullUpdates.Count; outPacket.RegionData.RegionHandle =
if (max > m_primFullUpdatesPerPacket) Scene.RegionInfo.RegionHandle;
max = m_primFullUpdatesPerPacket; outPacket.RegionData.TimeDilation =
(ushort)(Scene.TimeDilation * ushort.MaxValue);
int count = 0; int max = m_primFullUpdates.Count;
int size = 0; if (max > m_primFullUpdatesPerPacket)
max = m_primFullUpdatesPerPacket;
byte[] zerobuffer = new byte[1024]; int count = 0;
byte[] blockbuffer = new byte[1024]; int size = 0;
byte[] zerobuffer = new byte[1024];
byte[] blockbuffer = new byte[1024];
lock (m_primFullUpdates)
{
for (count = 0 ; count < max ; count++) for (count = 0 ; count < max ; count++)
{ {
int length = 0; int length = 0;
@ -3212,12 +3204,9 @@ namespace OpenSim.Region.ClientStack.LindenUDP
OutPacket(outPacket, ThrottleOutPacketType.Task | ThrottleOutPacketType.LowPriority); OutPacket(outPacket, ThrottleOutPacketType.Task | ThrottleOutPacketType.LowPriority);
if (m_primFullUpdates.Count == 0 && m_primFullUpdateTimer.Enabled) if (m_primFullUpdates.Count == 0 && m_primFullUpdateTimer.Enabled)
stopTimer = true; lock (m_primFullUpdateTimer)
m_primFullUpdateTimer.Stop();
} }
if (stopTimer)
lock (m_primFullUpdateTimer)
m_primFullUpdateTimer.Stop();
} }
/// <summary> /// <summary>
@ -3236,7 +3225,6 @@ namespace OpenSim.Region.ClientStack.LindenUDP
CreatePrimImprovedBlock(localID, position, rotation, CreatePrimImprovedBlock(localID, position, rotation,
velocity, rotationalvelocity, state); velocity, rotationalvelocity, state);
bool doUpdate = false;
lock (m_primTerseUpdates) lock (m_primTerseUpdates)
{ {
if (m_primTerseUpdates.Count == 0) if (m_primTerseUpdates.Count == 0)
@ -3245,51 +3233,43 @@ namespace OpenSim.Region.ClientStack.LindenUDP
m_primTerseUpdates.Add(objectData); m_primTerseUpdates.Add(objectData);
if (m_primTerseUpdates.Count >= m_primTerseUpdatesPerPacket) if (m_primTerseUpdates.Count >= m_primTerseUpdatesPerPacket)
doUpdate = true; ProcessPrimTerseUpdates(this, null);
} }
if (doUpdate)
ProcessPrimTerseUpdates(this, null);
} }
void ProcessPrimTerseUpdates(object sender, ElapsedEventArgs e) void ProcessPrimTerseUpdates(object sender, ElapsedEventArgs e)
{ {
bool stopTimer = false;
lock (m_primTerseUpdates) lock (m_primTerseUpdates)
{ {
if (m_primTerseUpdates.Count == 0) if (m_primTerseUpdates.Count == 0)
stopTimer = true; {
} lock (m_primTerseUpdateTimer)
if (stopTimer) m_primTerseUpdateTimer.Stop();
{
lock (m_primTerseUpdateTimer)
m_primTerseUpdateTimer.Stop();
return; return;
} }
ImprovedTerseObjectUpdatePacket outPacket = ImprovedTerseObjectUpdatePacket outPacket =
(ImprovedTerseObjectUpdatePacket) (ImprovedTerseObjectUpdatePacket)
PacketPool.Instance.GetPacket( PacketPool.Instance.GetPacket(
PacketType.ImprovedTerseObjectUpdate); PacketType.ImprovedTerseObjectUpdate);
outPacket.RegionData.RegionHandle = outPacket.RegionData.RegionHandle =
Scene.RegionInfo.RegionHandle; Scene.RegionInfo.RegionHandle;
outPacket.RegionData.TimeDilation = outPacket.RegionData.TimeDilation =
(ushort)(Scene.TimeDilation * ushort.MaxValue); (ushort)(Scene.TimeDilation * ushort.MaxValue);
int max = m_primTerseUpdates.Count; int max = m_primTerseUpdates.Count;
if (max > m_primTerseUpdatesPerPacket) if (max > m_primTerseUpdatesPerPacket)
max = m_primTerseUpdatesPerPacket; max = m_primTerseUpdatesPerPacket;
int count = 0; int count = 0;
int size = 0; int size = 0;
byte[] zerobuffer = new byte[1024]; byte[] zerobuffer = new byte[1024];
byte[] blockbuffer = new byte[1024]; byte[] blockbuffer = new byte[1024];
lock (m_primTerseUpdates) for (count = 0 ; count < max ; count++)
{
for (count = 0; count < max; count++)
{ {
int length = 0; int length = 0;
m_primTerseUpdates[count].ToBytes(blockbuffer, ref length); m_primTerseUpdates[count].ToBytes(blockbuffer, ref length);
@ -3314,11 +3294,9 @@ namespace OpenSim.Region.ClientStack.LindenUDP
OutPacket(outPacket, ThrottleOutPacketType.Task | ThrottleOutPacketType.LowPriority); OutPacket(outPacket, ThrottleOutPacketType.Task | ThrottleOutPacketType.LowPriority);
if (m_primTerseUpdates.Count == 0) if (m_primTerseUpdates.Count == 0)
stopTimer = true; lock (m_primTerseUpdateTimer)
m_primTerseUpdateTimer.Stop();
} }
if (stopTimer)
lock (m_primTerseUpdateTimer)
m_primTerseUpdateTimer.Stop();
} }
public void FlushPrimUpdates() public void FlushPrimUpdates()

View File

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

View File

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

View File

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

View File

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

View File

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

View File

@ -122,13 +122,12 @@ namespace OpenSim.Region.Framework.Scenes
public bool InventoryDeQueueAndDelete() public bool InventoryDeQueueAndDelete()
{ {
DeleteToInventoryHolder x = null; DeleteToInventoryHolder x = null;
int left = 0;
try try
{ {
lock (m_inventoryDeletes) lock (m_inventoryDeletes)
{ {
left = m_inventoryDeletes.Count; int left = m_inventoryDeletes.Count;
if (left > 0) if (left > 0)
{ {
x = m_inventoryDeletes.Dequeue(); x = m_inventoryDeletes.Dequeue();
@ -137,26 +136,23 @@ namespace OpenSim.Region.Framework.Scenes
m_inventoryDeletes.Enqueue(x); m_inventoryDeletes.Enqueue(x);
return true; return true;
} }
}
}
if (left > 0) m_log.DebugFormat(
{ "[SCENE]: Sending object to user's inventory, {0} item(s) remaining.", left);
m_log.DebugFormat(
"[SCENE]: Sending object to user's inventory, {0} item(s) remaining.", left); try
{
try m_scene.DeleteToInventory(x.action, x.folderID, x.objectGroup, x.remoteClient);
{ if (x.permissionToDelete)
m_scene.DeleteToInventory(x.action, x.folderID, x.objectGroup, x.remoteClient); m_scene.DeleteSceneObject(x.objectGroup, false);
if (x.permissionToDelete) }
m_scene.DeleteSceneObject(x.objectGroup, false); catch (Exception e)
{
m_log.DebugFormat("Exception background sending object: " + e);
}
return true;
} }
catch (Exception e)
{
m_log.DebugFormat("Exception background sending object: " + e);
}
return true;
} }
} }
catch (Exception e) catch (Exception e)

View File

@ -297,44 +297,34 @@ namespace OpenSim.Region.Framework.Scenes
sceneObject.AttachToScene(m_parentScene); sceneObject.AttachToScene(m_parentScene);
List<SceneObjectPart> parts = null;
bool found = false;
lock (sceneObject) lock (sceneObject)
{ {
if (!Entities.ContainsKey(sceneObject.UUID)) if (!Entities.ContainsKey(sceneObject.UUID))
{ {
found = true;
Entities.Add(sceneObject); Entities.Add(sceneObject);
m_numPrim += sceneObject.Children.Count; m_numPrim += sceneObject.Children.Count;
if (attachToBackup) if (attachToBackup)
sceneObject.AttachToBackup(); sceneObject.AttachToBackup();
parts = new List<SceneObjectPart>(sceneObject.Children.Values); if (OnObjectCreate != null)
OnObjectCreate(sceneObject);
}
} lock (m_dictionary_lock)
if (found)
{
lock (m_dictionary_lock)
{
SceneObjectGroupsByFullID[sceneObject.UUID] = sceneObject;
SceneObjectGroupsByLocalID[sceneObject.LocalId] = sceneObject;
foreach (SceneObjectPart part in parts)
{ {
SceneObjectGroupsByFullID[part.UUID] = sceneObject; SceneObjectGroupsByFullID[sceneObject.UUID] = sceneObject;
SceneObjectGroupsByLocalID[part.LocalId] = sceneObject; SceneObjectGroupsByLocalID[sceneObject.LocalId] = sceneObject;
foreach (SceneObjectPart part in sceneObject.Children.Values)
{
SceneObjectGroupsByFullID[part.UUID] = sceneObject;
SceneObjectGroupsByLocalID[part.LocalId] = sceneObject;
}
} }
return true;
} }
if (OnObjectCreate != null)
OnObjectCreate(sceneObject);
return true;
} }
return false; return false;
} }