aboutsummaryrefslogtreecommitdiffstatshomepage
path: root/OpenSim/Region/Framework
diff options
context:
space:
mode:
authorJustin Clark-Casey (justincc)2010-08-28 00:40:33 +0100
committerJustin Clark-Casey (justincc)2010-08-28 00:40:33 +0100
commit1c0b4457cdcd543f04bc818a987f6e3f2311098d (patch)
tree56b6a949423b5ca0f54b2c200e037052a9ac3ff0 /OpenSim/Region/Framework
parentminor: reduce log chattiness of "load iar" for IARs with lots of folders (diff)
downloadopensim-SC-1c0b4457cdcd543f04bc818a987f6e3f2311098d.zip
opensim-SC-1c0b4457cdcd543f04bc818a987f6e3f2311098d.tar.gz
opensim-SC-1c0b4457cdcd543f04bc818a987f6e3f2311098d.tar.bz2
opensim-SC-1c0b4457cdcd543f04bc818a987f6e3f2311098d.tar.xz
Improve liveness by operating on list copies of SOG.Children where appropriate
Diffstat (limited to 'OpenSim/Region/Framework')
-rw-r--r--OpenSim/Region/Framework/Scenes/Scene.Inventory.cs22
-rw-r--r--OpenSim/Region/Framework/Scenes/Scene.PacketHandlers.cs15
-rw-r--r--OpenSim/Region/Framework/Scenes/Scene.cs21
-rw-r--r--OpenSim/Region/Framework/Scenes/SceneGraph.cs51
-rw-r--r--OpenSim/Region/Framework/Scenes/SceneObjectGroup.cs50
5 files changed, 84 insertions, 75 deletions
diff --git a/OpenSim/Region/Framework/Scenes/Scene.Inventory.cs b/OpenSim/Region/Framework/Scenes/Scene.Inventory.cs
index 8ed8b96..2ac46e2 100644
--- a/OpenSim/Region/Framework/Scenes/Scene.Inventory.cs
+++ b/OpenSim/Region/Framework/Scenes/Scene.Inventory.cs
@@ -2004,11 +2004,12 @@ namespace OpenSim.Region.Framework.Scenes
2004 sog.SetGroup(groupID, remoteClient); 2004 sog.SetGroup(groupID, remoteClient);
2005 sog.ScheduleGroupForFullUpdate(); 2005 sog.ScheduleGroupForFullUpdate();
2006 2006
2007 List<SceneObjectPart> partList = null;
2007 lock (sog.Children) 2008 lock (sog.Children)
2008 { 2009 partList = new List<SceneObjectPart>(sog.Children.Values);
2009 foreach (SceneObjectPart child in sog.Children.Values) 2010
2010 child.Inventory.ChangeInventoryOwner(ownerID); 2011 foreach (SceneObjectPart child in partList)
2011 } 2012 child.Inventory.ChangeInventoryOwner(ownerID);
2012 } 2013 }
2013 else 2014 else
2014 { 2015 {
@@ -2017,14 +2018,15 @@ namespace OpenSim.Region.Framework.Scenes
2017 2018
2018 if (sog.GroupID != groupID) 2019 if (sog.GroupID != groupID)
2019 continue; 2020 continue;
2020 2021
2022 List<SceneObjectPart> partList = null;
2021 lock (sog.Children) 2023 lock (sog.Children)
2024 partList = new List<SceneObjectPart>(sog.Children.Values);
2025
2026 foreach (SceneObjectPart child in partList)
2022 { 2027 {
2023 foreach (SceneObjectPart child in sog.Children.Values) 2028 child.LastOwnerID = child.OwnerID;
2024 { 2029 child.Inventory.ChangeInventoryOwner(groupID);
2025 child.LastOwnerID = child.OwnerID;
2026 child.Inventory.ChangeInventoryOwner(groupID);
2027 }
2028 } 2030 }
2029 2031
2030 sog.SetOwnerId(groupID); 2032 sog.SetOwnerId(groupID);
diff --git a/OpenSim/Region/Framework/Scenes/Scene.PacketHandlers.cs b/OpenSim/Region/Framework/Scenes/Scene.PacketHandlers.cs
index 9f1575d..c511774 100644
--- a/OpenSim/Region/Framework/Scenes/Scene.PacketHandlers.cs
+++ b/OpenSim/Region/Framework/Scenes/Scene.PacketHandlers.cs
@@ -164,16 +164,17 @@ namespace OpenSim.Region.Framework.Scenes
164 164
165 SceneObjectGroup sog = ent as SceneObjectGroup; 165 SceneObjectGroup sog = ent as SceneObjectGroup;
166 166
167 List<SceneObjectPart> partList = null;
167 lock (sog.Children) 168 lock (sog.Children)
169 partList = new List<SceneObjectPart>(sog.Children.Values);
170
171 foreach (SceneObjectPart part in partList)
168 { 172 {
169 foreach (KeyValuePair<UUID, SceneObjectPart> child in (sog.Children)) 173 if (part.LocalId == primLocalID)
170 { 174 {
171 if (child.Value.LocalId == primLocalID) 175 part.GetProperties(remoteClient);
172 { 176 foundPrim = true;
173 child.Value.GetProperties(remoteClient); 177 break;
174 foundPrim = true;
175 break;
176 }
177 } 178 }
178 } 179 }
179 180
diff --git a/OpenSim/Region/Framework/Scenes/Scene.cs b/OpenSim/Region/Framework/Scenes/Scene.cs
index 5fe944d..db081cc 100644
--- a/OpenSim/Region/Framework/Scenes/Scene.cs
+++ b/OpenSim/Region/Framework/Scenes/Scene.cs
@@ -2065,19 +2065,20 @@ namespace OpenSim.Region.Framework.Scenes
2065 group.RemoveScriptInstances(true); 2065 group.RemoveScriptInstances(true);
2066 } 2066 }
2067 2067
2068 List<SceneObjectPart> partList = null;
2068 lock (group.Children) 2069 lock (group.Children)
2070 partList = new List<SceneObjectPart>(group.Children.Values);
2071
2072 foreach (SceneObjectPart part in partList)
2069 { 2073 {
2070 foreach (SceneObjectPart part in group.Children.Values) 2074 if (part.IsJoint() && ((part.Flags & PrimFlags.Physics) != 0))
2071 { 2075 {
2072 if (part.IsJoint() && ((part.Flags & PrimFlags.Physics) != 0)) 2076 PhysicsScene.RequestJointDeletion(part.Name); // FIXME: what if the name changed?
2073 { 2077 }
2074 PhysicsScene.RequestJointDeletion(part.Name); // FIXME: what if the name changed? 2078 else if (part.PhysActor != null)
2075 } 2079 {
2076 else if (part.PhysActor != null) 2080 PhysicsScene.RemovePrim(part.PhysActor);
2077 { 2081 part.PhysActor = null;
2078 PhysicsScene.RemovePrim(part.PhysActor);
2079 part.PhysActor = null;
2080 }
2081 } 2082 }
2082 } 2083 }
2083 2084
diff --git a/OpenSim/Region/Framework/Scenes/SceneGraph.cs b/OpenSim/Region/Framework/Scenes/SceneGraph.cs
index 9db2691..2c242c9 100644
--- a/OpenSim/Region/Framework/Scenes/SceneGraph.cs
+++ b/OpenSim/Region/Framework/Scenes/SceneGraph.cs
@@ -380,34 +380,35 @@ namespace OpenSim.Region.Framework.Scenes
380 part.Shape.Scale = scale; 380 part.Shape.Scale = scale;
381 } 381 }
382 } 382 }
383
384 m_numPrim += sceneObject.Children.Count;
385 }
383 386
384 sceneObject.AttachToScene(m_parentScene); 387 sceneObject.AttachToScene(m_parentScene);
385 388
386 if (sendClientUpdates) 389 if (sendClientUpdates)
387 sceneObject.ScheduleGroupForFullUpdate(); 390 sceneObject.ScheduleGroupForFullUpdate();
388 391
389 Entities.Add(sceneObject); 392 Entities.Add(sceneObject);
390 m_numPrim += sceneObject.Children.Count; 393
391 394 if (attachToBackup)
392 if (attachToBackup) 395 sceneObject.AttachToBackup();
393 sceneObject.AttachToBackup(); 396
394 397 if (OnObjectCreate != null)
395 if (OnObjectCreate != null) 398 OnObjectCreate(sceneObject);
396 OnObjectCreate(sceneObject); 399
400 lock (SceneObjectGroupsByFullID)
401 {
402 SceneObjectGroupsByFullID[sceneObject.UUID] = sceneObject;
403 foreach (SceneObjectPart part in sceneObject.Children.Values)
404 SceneObjectGroupsByFullID[part.UUID] = sceneObject;
405 }
397 406
398 lock (SceneObjectGroupsByFullID) 407 lock (SceneObjectGroupsByLocalID)
399 { 408 {
400 SceneObjectGroupsByFullID[sceneObject.UUID] = sceneObject; 409 SceneObjectGroupsByLocalID[sceneObject.LocalId] = sceneObject;
401 foreach (SceneObjectPart part in sceneObject.Children.Values) 410 foreach (SceneObjectPart part in sceneObject.Children.Values)
402 SceneObjectGroupsByFullID[part.UUID] = sceneObject; 411 SceneObjectGroupsByLocalID[part.LocalId] = sceneObject;
403 }
404
405 lock (SceneObjectGroupsByLocalID)
406 {
407 SceneObjectGroupsByLocalID[sceneObject.LocalId] = sceneObject;
408 foreach (SceneObjectPart part in sceneObject.Children.Values)
409 SceneObjectGroupsByLocalID[part.LocalId] = sceneObject;
410 }
411 } 412 }
412 } 413 }
413 414
diff --git a/OpenSim/Region/Framework/Scenes/SceneObjectGroup.cs b/OpenSim/Region/Framework/Scenes/SceneObjectGroup.cs
index fc5eeed..40a8f83 100644
--- a/OpenSim/Region/Framework/Scenes/SceneObjectGroup.cs
+++ b/OpenSim/Region/Framework/Scenes/SceneObjectGroup.cs
@@ -237,6 +237,8 @@ namespace OpenSim.Region.Framework.Scenes
237 237
238 /// <value> 238 /// <value>
239 /// The parts of this scene object group. You must lock this property before using it. 239 /// The parts of this scene object group. You must lock this property before using it.
240 /// If you're doing anything other than reading values, please take a copy of the values rather than locking
241 /// the dictionary for the entirety of the operation. This increases liveness and reduces the danger of deadlock
240 /// If you want to know the number of children, consider using the PrimCount property instead 242 /// If you want to know the number of children, consider using the PrimCount property instead
241 /// </value> 243 /// </value>
242 public Dictionary<UUID, SceneObjectPart> Children 244 public Dictionary<UUID, SceneObjectPart> Children
@@ -1968,28 +1970,29 @@ namespace OpenSim.Region.Framework.Scenes
1968 //if ((RootPart.Flags & PrimFlags.TemporaryOnRez) != 0) 1970 //if ((RootPart.Flags & PrimFlags.TemporaryOnRez) != 0)
1969 // return; 1971 // return;
1970 1972
1971 lock (m_parts) 1973 bool UsePhysics = ((RootPart.Flags & PrimFlags.Physics) != 0);
1972 {
1973 bool UsePhysics = ((RootPart.Flags & PrimFlags.Physics) != 0);
1974 1974
1975 if (UsePhysics && !AbsolutePosition.ApproxEquals(lastPhysGroupPos, 0.02f)) 1975 if (UsePhysics && !AbsolutePosition.ApproxEquals(lastPhysGroupPos, 0.02f))
1976 { 1976 {
1977 m_rootPart.UpdateFlag = 1; 1977 m_rootPart.UpdateFlag = 1;
1978 lastPhysGroupPos = AbsolutePosition; 1978 lastPhysGroupPos = AbsolutePosition;
1979 } 1979 }
1980 1980
1981 if (UsePhysics && !GroupRotation.ApproxEquals(lastPhysGroupRot, 0.1f)) 1981 if (UsePhysics && !GroupRotation.ApproxEquals(lastPhysGroupRot, 0.1f))
1982 { 1982 {
1983 m_rootPart.UpdateFlag = 1; 1983 m_rootPart.UpdateFlag = 1;
1984 lastPhysGroupRot = GroupRotation; 1984 lastPhysGroupRot = GroupRotation;
1985 } 1985 }
1986 1986
1987 foreach (SceneObjectPart part in m_parts.Values) 1987 List<SceneObjectPart> partList = null;
1988 { 1988 lock (m_parts)
1989 if (!IsSelected) 1989 partList = new List<SceneObjectPart>(m_parts.Values);
1990 part.UpdateLookAt(); 1990
1991 part.SendScheduledUpdates(); 1991 foreach (SceneObjectPart part in partList)
1992 } 1992 {
1993 if (!IsSelected)
1994 part.UpdateLookAt();
1995 part.SendScheduledUpdates();
1993 } 1996 }
1994 } 1997 }
1995 1998
@@ -2787,11 +2790,12 @@ namespace OpenSim.Region.Framework.Scenes
2787 public void UpdatePermissions(UUID AgentID, byte field, uint localID, 2790 public void UpdatePermissions(UUID AgentID, byte field, uint localID,
2788 uint mask, byte addRemTF) 2791 uint mask, byte addRemTF)
2789 { 2792 {
2793 List<SceneObjectPart> partList = null;
2790 lock (m_parts) 2794 lock (m_parts)
2791 { 2795 partList = new List<SceneObjectPart>(m_parts.Values);
2792 foreach (SceneObjectPart part in m_parts.Values) 2796
2793 part.UpdatePermissions(AgentID, field, localID, mask, addRemTF); 2797 foreach (SceneObjectPart part in partList)
2794 } 2798 part.UpdatePermissions(AgentID, field, localID, mask, addRemTF);
2795 2799
2796 HasGroupChanged = true; 2800 HasGroupChanged = true;
2797 } 2801 }