From dcf41cb68370dc1e1b03fd78edf75b175b17f6ea Mon Sep 17 00:00:00 2001
From: Tedd Hansen
Date: Thu, 1 Nov 2007 19:27:03 +0000
Subject: ScriptServer fixes: Added more debug logging, mutex lock (to be
extra-super-sure) on script load/unload, removed experimental
Grid-scriptengine from compile because of dynamic module loader, and added
random string to script filename to bypass module loader file lock. Please
delete your copy of
bin/ScriptEngine/OpenSim.Grid.ScriptEngine.DotNetEngine.dll.
---
OpenSim/Region/ScriptEngine/Common/Executor.cs | 7 ++
.../DotNetEngine/Compiler/LSL/Compiler.cs | 3 +-
.../DotNetEngine/Compiler/LSL/LSL2CSConverter.cs | 4 +
.../ScriptEngine/DotNetEngine/EventQueueManager.cs | 23 +++--
.../ScriptEngine/DotNetEngine/ScriptManager.cs | 102 ++++++++++++---------
5 files changed, 87 insertions(+), 52 deletions(-)
(limited to 'OpenSim/Region/ScriptEngine')
diff --git a/OpenSim/Region/ScriptEngine/Common/Executor.cs b/OpenSim/Region/ScriptEngine/Common/Executor.cs
index c656e01..1805e38 100644
--- a/OpenSim/Region/ScriptEngine/Common/Executor.cs
+++ b/OpenSim/Region/ScriptEngine/Common/Executor.cs
@@ -82,6 +82,10 @@ namespace OpenSim.Region.ScriptEngine.Common
string EventName = m_Script.State() + "_event_" + FunctionName;
+#if DEBUG
+ Console.WriteLine("ScriptEngine: Script event function name: " + EventName);
+#endif
+
//type.InvokeMember(EventName, BindingFlags.InvokeMethod, null, m_Script, args);
//Console.WriteLine("ScriptEngine Executor.ExecuteEvent: \"" + EventName + "\"");
@@ -112,6 +116,9 @@ namespace OpenSim.Region.ScriptEngine.Common
return;
}
+#if DEBUG
+ Console.WriteLine("ScriptEngine: Executing function name: " + EventName);
+#endif
// Found
//try
//{
diff --git a/OpenSim/Region/ScriptEngine/DotNetEngine/Compiler/LSL/Compiler.cs b/OpenSim/Region/ScriptEngine/DotNetEngine/Compiler/LSL/Compiler.cs
index 7f452e0..c81e6bd 100644
--- a/OpenSim/Region/ScriptEngine/DotNetEngine/Compiler/LSL/Compiler.cs
+++ b/OpenSim/Region/ScriptEngine/DotNetEngine/Compiler/LSL/Compiler.cs
@@ -39,6 +39,7 @@ namespace OpenSim.Region.ScriptEngine.DotNetEngine.Compiler.LSL
private LSL2CSConverter LSL_Converter = new LSL2CSConverter();
private CSharpCodeProvider codeProvider = new CSharpCodeProvider();
private static UInt64 scriptCompileCounter = 0;
+ private static int instanceID = new Random().Next(0, int.MaxValue); // Implemented due to peer preassure --- will cause garbage in ScriptEngines folder ;)
//private ICodeCompiler icc = codeProvider.CreateCompiler();
public string CompileFromFile(string LSOFileName)
{
@@ -82,7 +83,7 @@ namespace OpenSim.Region.ScriptEngine.DotNetEngine.Compiler.LSL
{
// Output assembly name
scriptCompileCounter++;
- string OutFile = Path.Combine("ScriptEngines", "Script_" + scriptCompileCounter + ".dll");
+ string OutFile = Path.Combine("ScriptEngines", "DotNetScript_" + instanceID.ToString() + "_" + scriptCompileCounter.ToString() + ".dll");
try
{
File.Delete(OutFile);
diff --git a/OpenSim/Region/ScriptEngine/DotNetEngine/Compiler/LSL/LSL2CSConverter.cs b/OpenSim/Region/ScriptEngine/DotNetEngine/Compiler/LSL/LSL2CSConverter.cs
index 0c28617..bbd6839 100644
--- a/OpenSim/Region/ScriptEngine/DotNetEngine/Compiler/LSL/LSL2CSConverter.cs
+++ b/OpenSim/Region/ScriptEngine/DotNetEngine/Compiler/LSL/LSL2CSConverter.cs
@@ -53,6 +53,7 @@ namespace OpenSim.Region.ScriptEngine.DotNetEngine.Compiler.LSL
public string Convert(string Script)
{
+ quotes.Clear();
string Return = "";
Script = " \r\n" + Script;
@@ -310,6 +311,9 @@ namespace OpenSim.Region.ScriptEngine.DotNetEngine.Compiler.LSL
Return += Script;
Return += "} }\r\n";
+
+ quotes.Clear();
+
return Return;
}
}
diff --git a/OpenSim/Region/ScriptEngine/DotNetEngine/EventQueueManager.cs b/OpenSim/Region/ScriptEngine/DotNetEngine/EventQueueManager.cs
index d7491d9..f215dd5 100644
--- a/OpenSim/Region/ScriptEngine/DotNetEngine/EventQueueManager.cs
+++ b/OpenSim/Region/ScriptEngine/DotNetEngine/EventQueueManager.cs
@@ -181,6 +181,12 @@ namespace OpenSim.Region.ScriptEngine.DotNetEngine
// Execute function
try
{
+#if DEBUG
+ m_ScriptEngine.Log.Debug("ScriptEngine", "Executing event:\r\n"
+ + "QIS.localID: " + QIS.localID
+ + ", QIS.itemID: " + QIS.itemID
+ + ", QIS.functionName: " + QIS.functionName);
+#endif
m_ScriptEngine.m_ScriptManager.ExecuteEvent(QIS.localID, QIS.itemID,
QIS.functionName, QIS.param);
}
@@ -188,16 +194,17 @@ namespace OpenSim.Region.ScriptEngine.DotNetEngine
{
// DISPLAY ERROR INWORLD
string text = "Error executing script function \"" + QIS.functionName + "\":\r\n";
- if (e.InnerException != null)
- {
+ //if (e.InnerException != null)
+ //{
// Send inner exception
text += e.InnerException.Message.ToString();
- }
- else
- {
+ //}
+ //else
+ //{
+ text += "\r\n";
// Send normal
text += e.Message.ToString();
- }
+ //}
try
{
if (text.Length > 1500)
@@ -214,7 +221,7 @@ namespace OpenSim.Region.ScriptEngine.DotNetEngine
//else
//{
// T oconsole
- Console.WriteLine("Unable to send text in-world:\r\n" + text);
+ m_ScriptEngine.Log.Error("ScriptEngine", "Unable to send text in-world:\r\n" + text);
}
}
finally
@@ -230,7 +237,7 @@ namespace OpenSim.Region.ScriptEngine.DotNetEngine
}
catch (Exception e)
{
- Console.WriteLine("Exception in EventQueueThreadLoop: " + e.ToString());
+ m_ScriptEngine.Log.Error("ScriptEngine", "Exception in EventQueueThreadLoop: " + e.ToString());
}
} // while
} // try
diff --git a/OpenSim/Region/ScriptEngine/DotNetEngine/ScriptManager.cs b/OpenSim/Region/ScriptEngine/DotNetEngine/ScriptManager.cs
index 54a5ef5..a3cf9f7 100644
--- a/OpenSim/Region/ScriptEngine/DotNetEngine/ScriptManager.cs
+++ b/OpenSim/Region/ScriptEngine/DotNetEngine/ScriptManager.cs
@@ -225,6 +225,8 @@ namespace OpenSim.Region.ScriptEngine.DotNetEngine
#region Start/Stop/Reset script
+ Object startStopLock = new Object();
+
///
/// Fetches, loads and hooks up a script to an objects events
///
@@ -259,76 +261,83 @@ namespace OpenSim.Region.ScriptEngine.DotNetEngine
StartScript(localID, itemID, script);
}
+ // Create a new instance of the compiler (reuse)
+ Compiler.LSL.Compiler LSLCompiler = new Compiler.LSL.Compiler();
private void _StartScript(uint localID, LLUUID itemID, string Script)
{
- //IScriptHost root = host.GetRoot();
- Console.WriteLine("ScriptManager StartScript: localID: " + localID + ", itemID: " + itemID);
+ lock (startStopLock)
+ {
+ //IScriptHost root = host.GetRoot();
+ Console.WriteLine("ScriptManager StartScript: localID: " + localID + ", itemID: " + itemID);
- // We will initialize and start the script.
- // It will be up to the script itself to hook up the correct events.
- string ScriptSource = "";
+ // We will initialize and start the script.
+ // It will be up to the script itself to hook up the correct events.
+ string ScriptSource = "";
- SceneObjectPart m_host = World.GetSceneObjectPart(localID);
+ SceneObjectPart m_host = World.GetSceneObjectPart(localID);
- try
- {
- // Create a new instance of the compiler (currently we don't want reuse)
- Compiler.LSL.Compiler LSLCompiler = new Compiler.LSL.Compiler();
- // Compile (We assume LSL)
- ScriptSource = LSLCompiler.CompileFromLSLText(Script);
- //Console.WriteLine("Compilation of " + FileName + " done");
- // * Insert yield into code
- ScriptSource = ProcessYield(ScriptSource);
+ try
+ {
+
+ // Compile (We assume LSL)
+ ScriptSource = LSLCompiler.CompileFromLSLText(Script);
+ //Console.WriteLine("Compilation of " + FileName + " done");
+ // * Insert yield into code
+ ScriptSource = ProcessYield(ScriptSource);
#if DEBUG
- long before;
- before = GC.GetTotalMemory(true);
+ long before;
+ before = GC.GetTotalMemory(true);
#endif
- LSL_BaseClass CompiledScript;
- CompiledScript = m_scriptEngine.m_AppDomainManager.LoadScript(ScriptSource);
+ LSL_BaseClass CompiledScript;
+ CompiledScript = m_scriptEngine.m_AppDomainManager.LoadScript(ScriptSource);
#if DEBUG
- Console.WriteLine("Script " + itemID + " occupies {0} bytes", GC.GetTotalMemory(true) - before);
+ Console.WriteLine("Script " + itemID + " occupies {0} bytes", GC.GetTotalMemory(true) - before);
#endif
- CompiledScript.SourceCode = ScriptSource;
- // Add it to our script memstruct
- SetScript(localID, itemID, CompiledScript);
+ CompiledScript.SourceCode = ScriptSource;
+ // Add it to our script memstruct
+ SetScript(localID, itemID, CompiledScript);
- // We need to give (untrusted) assembly a private instance of BuiltIns
- // this private copy will contain Read-Only FullitemID so that it can bring that on to the server whenever needed.
+ // We need to give (untrusted) assembly a private instance of BuiltIns
+ // this private copy will contain Read-Only FullitemID so that it can bring that on to the server whenever needed.
- LSL_BuiltIn_Commands LSLB = new LSL_BuiltIn_Commands(m_scriptEngine, m_host, localID, itemID);
+ LSL_BuiltIn_Commands LSLB = new LSL_BuiltIn_Commands(m_scriptEngine, m_host, localID, itemID);
- // Start the script - giving it BuiltIns
- CompiledScript.Start(LSLB);
+ // Start the script - giving it BuiltIns
+ CompiledScript.Start(LSLB);
- // Fire the first start-event
- m_scriptEngine.m_EventQueueManager.AddToScriptQueue(localID, itemID, "state_entry", new object[] {});
- }
- catch (Exception e)
- {
- //m_scriptEngine.Log.Error("ScriptEngine", "Error compiling script: " + e.ToString());
- try
- {
- // DISPLAY ERROR INWORLD
- string text = "Error compiling script:\r\n" + e.Message.ToString();
- if (text.Length > 1500)
- text = text.Substring(0, 1500);
- World.SimChat(Helpers.StringToField(text), 1, 0, m_host.AbsolutePosition, m_host.Name, m_host.UUID);
+ // Fire the first start-event
+ m_scriptEngine.m_EventQueueManager.AddToScriptQueue(localID, itemID, "state_entry", new object[] { });
}
- catch (Exception e2)
+ catch (Exception e)
{
- m_scriptEngine.Log.Error("ScriptEngine", "Error displaying error in-world: " + e2.ToString());
+ //m_scriptEngine.Log.Error("ScriptEngine", "Error compiling script: " + e.ToString());
+ try
+ {
+ // DISPLAY ERROR INWORLD
+ string text = "Error compiling script:\r\n" + e.Message.ToString();
+ if (text.Length > 1500)
+ text = text.Substring(0, 1500);
+ World.SimChat(Helpers.StringToField(text), 1, 0, m_host.AbsolutePosition, m_host.Name, m_host.UUID);
+ }
+ catch (Exception e2)
+ {
+ m_scriptEngine.Log.Error("ScriptEngine", "Error displaying error in-world: " + e2.ToString());
+ m_scriptEngine.Log.Error("ScriptEngine", "Errormessage: Error compiling script:\r\n" + e.Message.ToString());
+ }
}
}
}
private void _StopScript(uint localID, LLUUID itemID)
{
+ lock (startStopLock)
+ {
// Stop script
Console.WriteLine("Stop script localID: " + localID + " LLUID: " + itemID.ToString());
@@ -361,6 +370,7 @@ namespace OpenSim.Region.ScriptEngine.DotNetEngine
": " + e.ToString());
}
}
+ }
private string ProcessYield(string FileName)
{
@@ -382,12 +392,18 @@ namespace OpenSim.Region.ScriptEngine.DotNetEngine
/// Arguments to pass to function
internal void ExecuteEvent(uint localID, LLUUID itemID, string FunctionName, object[] args)
{
+#if DEBUG
+ Console.WriteLine("ScriptEngine: Inside ExecuteEvent for event " + FunctionName);
+#endif
// Execute a function in the script
//m_scriptEngine.Log.Verbose("ScriptEngine", "Executing Function localID: " + localID + ", itemID: " + itemID + ", FunctionName: " + FunctionName);
LSL_BaseClass Script = m_scriptEngine.m_ScriptManager.GetScript(localID, itemID);
if (Script == null)
return;
+#if DEBUG
+ Console.WriteLine("ScriptEngine: Executing event: " + FunctionName);
+#endif
// Must be done in correct AppDomain, so leaving it up to the script itself
Script.Exec.ExecuteEvent(FunctionName, args);
}
--
cgit v1.1