Patch for mantis#1493: Several patches to xengine. Thanks Melanie!

This commit is contained in:
Adam Johnson
2008-06-07 17:43:07 +00:00
parent 2b83aa931c
commit 990225a4ba
5 changed files with 279 additions and 53 deletions

View File

@@ -314,8 +314,6 @@ namespace OpenSim.Region.ScriptEngine.XEngine
{
assembly = m_Compiler.PerformScriptCompile(script,
assetID.ToString());
m_log.DebugFormat("[XEngine] Loaded script {0}.{1}",
part.ParentGroup.RootPart.Name, item.Name);
}
catch (Exception e)
{
@@ -387,8 +385,13 @@ namespace OpenSim.Region.ScriptEngine.XEngine
m_DomainScripts[appDomain].Add(itemID);
XScriptInstance instance = new XScriptInstance(this,localID,
part.UUID, itemID, assetID, assembly,
m_AppDomains[appDomain]);
part.UUID, itemID, assetID, assembly,
m_AppDomains[appDomain],
part.ParentGroup.RootPart.Name,
item.Name);
m_log.DebugFormat("[XEngine] Loaded script {0}.{1}",
part.ParentGroup.RootPart.Name, item.Name);
instance.AppDomain = appDomain;
@@ -450,6 +453,8 @@ namespace OpenSim.Region.ScriptEngine.XEngine
UnloadAppDomain(instance.AppDomain);
}
instance.RemoveState();
instance = null;
CleanAssemblies();
@@ -706,6 +711,9 @@ namespace OpenSim.Region.ScriptEngine.XEngine
private bool m_TimerQueued;
private DateTime m_EventStart;
private bool m_InEvent;
private string m_PrimName;
private string m_ScriptName;
private string m_Assembly;
// Script state
private string m_State="default";
@@ -715,6 +723,7 @@ namespace OpenSim.Region.ScriptEngine.XEngine
public bool Running
{
get { return m_RunEvents; }
set { m_RunEvents = value; }
}
public string State
@@ -734,6 +743,16 @@ namespace OpenSim.Region.ScriptEngine.XEngine
set { m_AppDomain = value; }
}
public string PrimName
{
get { return m_PrimName; }
}
public string ScriptName
{
get { return m_ScriptName; }
}
public LLUUID ItemID
{
get { return m_ItemID; }
@@ -766,7 +785,8 @@ namespace OpenSim.Region.ScriptEngine.XEngine
}
public XScriptInstance(XEngine engine, uint localID, LLUUID objectID,
LLUUID itemID, LLUUID assetID, string assembly, AppDomain dom)
LLUUID itemID, LLUUID assetID, string assembly, AppDomain dom,
string primName, string scriptName)
{
m_Engine = engine;
@@ -774,6 +794,9 @@ namespace OpenSim.Region.ScriptEngine.XEngine
m_ObjectID = objectID;
m_ItemID = itemID;
m_AssetID = assetID;
m_PrimName = primName;
m_ScriptName = scriptName;
m_Assembly = assembly;
SceneObjectPart part=engine.World.GetSceneObjectPart(localID);
if (part == null)
@@ -811,10 +834,12 @@ namespace OpenSim.Region.ScriptEngine.XEngine
}
catch (Exception e)
{
m_Engine.Log.Error("Error loading script instance\n"+e.ToString());
m_Engine.Log.Error("[XEngine] Error loading script instance\n"+e.ToString());
return;
}
string savedState = assembly + ".state";
string savedState = Path.Combine(Path.GetDirectoryName(assembly),
m_ItemID.ToString() + ".state");
if (File.Exists(savedState))
{
string xml = String.Empty;
@@ -841,28 +866,53 @@ namespace OpenSim.Region.ScriptEngine.XEngine
m_Engine.m_ASYNCLSLCommandManager.CreateFromData(
m_LocalID, m_ItemID, m_ObjectID,
PluginData);
m_Engine.Log.DebugFormat("[XEngine] Successfully retrieved state for script {0}.{1}", m_PrimName, m_ScriptName);
if(m_RunEvents)
{
m_RunEvents = false;
Start();
}
}
}
else
{
m_Engine.Log.Error("Unable to load script state: Memory limit exceeded");
m_Engine.Log.Error("[XEngine] Unable to load script state: Memory limit exceeded");
PostEvent(new XEventParams("state_entry",
new Object[0], new XDetectParams[0]));
Start();
}
}
catch (Exception e)
{
m_Engine.Log.ErrorFormat("Unable to load script state from xml: {0}\n"+e.ToString(), xml);
m_Engine.Log.ErrorFormat("[XEngine] Unable to load script state from xml: {0}\n"+e.ToString(), xml);
PostEvent(new XEventParams("state_entry",
new Object[0], new XDetectParams[0]));
Start();
}
}
else
{
m_Engine.Log.ErrorFormat("[XEngine] Unable to load script state, file not found");
PostEvent(new XEventParams("state_entry",
new Object[0], new XDetectParams[0]));
Start();
}
}
public void RemoveState()
{
string savedState = Path.Combine(Path.GetDirectoryName(m_Assembly),
m_ItemID.ToString() + ".state");
try
{
File.Delete(savedState);
}
catch(Exception)
{
}
Start();
}
public void VarDump(Dictionary<string, object> vars)
@@ -935,16 +985,11 @@ namespace OpenSim.Region.ScriptEngine.XEngine
result.Abort();
if (SmartThreadPool.WaitAll(new IWorkItemResult[] {result}, new TimeSpan((long)10000000), false))
lock (m_EventQueue)
{
lock (m_EventQueue)
{
m_CurrentResult = null;
}
return true;
m_CurrentResult = null;
}
m_Engine.Log.Error("[XEngine] Failed to reliably stop script");
return true;
}
@@ -960,6 +1005,8 @@ namespace OpenSim.Region.ScriptEngine.XEngine
public void PostEvent(XEventParams data)
{
// m_Engine.Log.DebugFormat("[XEngine] Posted event {2} in state {3} to {0}.{1}",
// m_PrimName, m_ScriptName, data.EventName, m_State);
lock (m_EventQueue)
{
if (m_EventQueue.Count >= m_Engine.MaxScriptQueue)
@@ -1003,6 +1050,8 @@ namespace OpenSim.Region.ScriptEngine.XEngine
if (data.EventName == "state") // Hardcoded state change
{
// m_Engine.Log.DebugFormat("[XEngine] Script {0}.{1} state set to {2}",
// m_PrimName, m_ScriptName, data.Params[0].ToString());
m_State=data.Params[0].ToString();
m_Engine.m_ASYNCLSLCommandManager.RemoveScript(
m_LocalID, m_ItemID);
@@ -1020,6 +1069,9 @@ namespace OpenSim.Region.ScriptEngine.XEngine
// m_Engine.Log.DebugFormat("[XEngine] Processed event {0}", data.EventName);
SceneObjectPart part = m_Engine.World.GetSceneObjectPart(
m_LocalID);
// m_Engine.Log.DebugFormat("[XEngine] Delivered event {2} in state {3} to {0}.{1}",
// m_PrimName, m_ScriptName, data.EventName, m_State);
try
{
m_EventStart = DateTime.Now;
@@ -1148,14 +1200,19 @@ namespace OpenSim.Region.ScriptEngine.XEngine
try
{
FileStream fs = File.Create(assembly + ".state");
FileStream fs = File.Create(Path.Combine(Path.GetDirectoryName(assembly), m_ItemID.ToString() + ".state"));
System.Text.ASCIIEncoding enc = new System.Text.ASCIIEncoding();
Byte[] buf = enc.GetBytes(xml);
fs.Write(buf, 0, buf.Length);
fs.Close();
}
catch(Exception)
catch(Exception e)
{
Console.WriteLine("Unable to save xml\n"+e.ToString());
}
if(!File.Exists(Path.Combine(Path.GetDirectoryName(assembly), m_ItemID.ToString() + ".state")))
{
throw new Exception("Completed persistence save, but no file was created");
}
}
}
@@ -1181,6 +1238,12 @@ namespace OpenSim.Region.ScriptEngine.XEngine
rootElement.AppendChild(state);
XmlElement running = xmldoc.CreateElement("", "Running", "");
running.AppendChild(xmldoc.CreateTextNode(
instance.Running.ToString()));
rootElement.AppendChild(running);
Dictionary<string, Object> vars = instance.GetVars();
XmlElement variables = xmldoc.CreateElement("", "Variables", "");
@@ -1277,6 +1340,9 @@ namespace OpenSim.Region.ScriptEngine.XEngine
case "State":
instance.State=part.InnerText;
break;
case "Running":
instance.Running=bool.Parse(part.InnerText);
break;
case "Variables":
XmlNodeList varL = part.ChildNodes;
foreach (XmlNode var in varL)