lock SceneObjectGroupsByFullID in SceneGraph.ForEachSOG() to stop failure if SceneObjectGroupsByFullID is updated elsewhere at the same time.

0.7.2-post-fixes
Justin Clark-Casey (justincc) 2012-01-30 19:21:58 +00:00
parent 0a277a64a7
commit 9e5f5f3d80
1 changed files with 7 additions and 5 deletions

View File

@ -1153,8 +1153,10 @@ namespace OpenSim.Region.Framework.Scenes
/// <param name="action"></param> /// <param name="action"></param>
protected internal void ForEachSOG(Action<SceneObjectGroup> action) protected internal void ForEachSOG(Action<SceneObjectGroup> action)
{ {
// FIXME: Need to lock here, really. List<SceneObjectGroup> objlist;
List<SceneObjectGroup> objlist = new List<SceneObjectGroup>(SceneObjectGroupsByFullID.Values); lock (SceneObjectGroupsByFullID)
objlist = new List<SceneObjectGroup>(SceneObjectGroupsByFullID.Values);
foreach (SceneObjectGroup obj in objlist) foreach (SceneObjectGroup obj in objlist)
{ {
try try
@ -1163,7 +1165,7 @@ namespace OpenSim.Region.Framework.Scenes
} }
catch (Exception e) catch (Exception e)
{ {
// Catch it and move on. This includes situations where splist has inconsistent info // Catch it and move on. This includes situations where objlist has inconsistent info
m_log.WarnFormat( m_log.WarnFormat(
"[SCENEGRAPH]: Problem processing action in ForEachSOG: {0} {1}", e.Message, e.StackTrace); "[SCENEGRAPH]: Problem processing action in ForEachSOG: {0} {1}", e.Message, e.StackTrace);
} }
@ -1398,10 +1400,10 @@ namespace OpenSim.Region.Framework.Scenes
/// <summary> /// <summary>
/// Update the texture entry of the given prim. /// Update the texture entry of the given prim.
/// </summary> /// </summary>
/// /// <remarks>
/// A texture entry is an object that contains details of all the textures of the prim's face. In this case, /// A texture entry is an object that contains details of all the textures of the prim's face. In this case,
/// the texture is given in its byte serialized form. /// the texture is given in its byte serialized form.
/// /// </remarks>
/// <param name="localID"></param> /// <param name="localID"></param>
/// <param name="texture"></param> /// <param name="texture"></param>
/// <param name="remoteClient"></param> /// <param name="remoteClient"></param>