aboutsummaryrefslogtreecommitdiffstatshomepage
path: root/OpenSim/Region/Framework/Scenes/Scene.cs
diff options
context:
space:
mode:
authorJustin Clark-Casey (justincc)2012-03-15 00:20:47 +0000
committerJustin Clark-Casey (justincc)2012-03-15 00:20:47 +0000
commit2f81e53f63012f0ed1623dc6159da01a3807fbf6 (patch)
tree3ffa114441d92456392f452464f808983fbe1ee3 /OpenSim/Region/Framework/Scenes/Scene.cs
parentAlleviate an issue where calling Thread.Abort() on script WorkItems can fail ... (diff)
downloadopensim-SC_OLD-2f81e53f63012f0ed1623dc6159da01a3807fbf6.zip
opensim-SC_OLD-2f81e53f63012f0ed1623dc6159da01a3807fbf6.tar.gz
opensim-SC_OLD-2f81e53f63012f0ed1623dc6159da01a3807fbf6.tar.bz2
opensim-SC_OLD-2f81e53f63012f0ed1623dc6159da01a3807fbf6.tar.xz
Fix a problem where multiple near simultaneous calls to llDie() from multiple scripts in the same linkset can cause unnecessary thread aborts.
The first llDie() could lock Scene.m_deleting_scene_object. The second llDie() would then wait at this lock. The first llDie() would go on to remove the second script but always abort it since the second script's WorkItem would not go away. Easiest solution here is to remove the m_deleting_scene_object since it's no longer justified - we no longer lock m_parts but take a copy instead. This also requires an adjustment in XEngine.OnRemoveScript not to use instance.ObjectID instead when firing the OnObjectRemoved event.
Diffstat (limited to 'OpenSim/Region/Framework/Scenes/Scene.cs')
-rw-r--r--OpenSim/Region/Framework/Scenes/Scene.cs11
1 files changed, 1 insertions, 10 deletions
diff --git a/OpenSim/Region/Framework/Scenes/Scene.cs b/OpenSim/Region/Framework/Scenes/Scene.cs
index 9e59d50..3a066d4 100644
--- a/OpenSim/Region/Framework/Scenes/Scene.cs
+++ b/OpenSim/Region/Framework/Scenes/Scene.cs
@@ -219,8 +219,6 @@ namespace OpenSim.Region.Framework.Scenes
219 219
220 private int m_lastUpdate; 220 private int m_lastUpdate;
221 private bool m_firstHeartbeat = true; 221 private bool m_firstHeartbeat = true;
222
223 private object m_deleting_scene_object = new object();
224 222
225 private UpdatePrioritizationSchemes m_priorityScheme = UpdatePrioritizationSchemes.Time; 223 private UpdatePrioritizationSchemes m_priorityScheme = UpdatePrioritizationSchemes.Time;
226 private bool m_reprioritizationEnabled = true; 224 private bool m_reprioritizationEnabled = true;
@@ -1994,15 +1992,8 @@ namespace OpenSim.Region.Framework.Scenes
1994 public void DeleteSceneObject(SceneObjectGroup group, bool silent) 1992 public void DeleteSceneObject(SceneObjectGroup group, bool silent)
1995 { 1993 {
1996// m_log.DebugFormat("[SCENE]: Deleting scene object {0} {1}", group.Name, group.UUID); 1994// m_log.DebugFormat("[SCENE]: Deleting scene object {0} {1}", group.Name, group.UUID);
1997
1998 //SceneObjectPart rootPart = group.GetChildPart(group.UUID);
1999 1995
2000 // Serialise calls to RemoveScriptInstances to avoid 1996 group.RemoveScriptInstances(true);
2001 // deadlocking on m_parts inside SceneObjectGroup
2002 lock (m_deleting_scene_object)
2003 {
2004 group.RemoveScriptInstances(true);
2005 }
2006 1997
2007 SceneObjectPart[] partList = group.Parts; 1998 SceneObjectPart[] partList = group.Parts;
2008 1999