* Remove one possible deadlock situation as seen today
* On script rez, XEngine was taking an m_scripts lock and then later on an m_parts lock when looking for a part by local id * In the meantime, a scene object being deleted would take an m_parts lock and then later on try to take an m_scripts lock when it tried to trigger script removal * There may be better ways to resolve this, but I believe that in general, we must always take an m_parts lock before an m_scripts lock0.6.0-stable
parent
7ac264c2f0
commit
4c7ddd2c71
|
@ -406,9 +406,15 @@ namespace OpenSim.Region.ScriptEngine.XEngine
|
||||||
// Get the asset ID of the script, so we can check if we
|
// Get the asset ID of the script, so we can check if we
|
||||||
// already have it.
|
// already have it.
|
||||||
|
|
||||||
|
// We must look for the part outside the m_Scripts lock because GetSceneObjectPart later triggers the
|
||||||
|
// m_parts lock on SOG. At the same time, a scene object that is being deleted will take the m_parts lock
|
||||||
|
// and then later on try to take the m_scripts lock in this class when it calls OnRemoveScript()
|
||||||
SceneObjectPart part = m_Scene.GetSceneObjectPart(localID);
|
SceneObjectPart part = m_Scene.GetSceneObjectPart(localID);
|
||||||
if (part == null)
|
if (part == null)
|
||||||
|
{
|
||||||
|
Log.Error("[Script] SceneObjectPart unavailable. Script NOT started.");
|
||||||
return false;
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
TaskInventoryItem item = part.GetInventoryItem(itemID);
|
TaskInventoryItem item = part.GetInventoryItem(itemID);
|
||||||
if (item == null)
|
if (item == null)
|
||||||
|
@ -494,7 +500,7 @@ namespace OpenSim.Region.ScriptEngine.XEngine
|
||||||
m_DomainScripts[appDomain].Add(itemID);
|
m_DomainScripts[appDomain].Add(itemID);
|
||||||
|
|
||||||
ScriptInstance instance =
|
ScriptInstance instance =
|
||||||
new ScriptInstance(this,localID,
|
new ScriptInstance(this, part.LocalId,
|
||||||
part.UUID, itemID, assetID, assembly,
|
part.UUID, itemID, assetID, assembly,
|
||||||
m_AppDomains[appDomain],
|
m_AppDomains[appDomain],
|
||||||
part.ParentGroup.RootPart.Name,
|
part.ParentGroup.RootPart.Name,
|
||||||
|
|
Loading…
Reference in New Issue