From 1b826c2fdc85faf47a26fd2ad5d20a025ab087ba Mon Sep 17 00:00:00 2001 From: Tedd Hansen Date: Sun, 19 Aug 2007 17:47:47 +0000 Subject: Added "StopScriot()" to ScriptManager. Stops Executor from executing events in script, removes script from EventQueueManagers target list, tells AppDomainManager that script is no longer active (and ready for unload). --- .../ScriptEngine/DotNetEngine/ScriptManager.cs | 69 +++++++++++----------- 1 file changed, 36 insertions(+), 33 deletions(-) (limited to 'OpenSim/Region/ScriptEngine/DotNetEngine/ScriptManager.cs') diff --git a/OpenSim/Region/ScriptEngine/DotNetEngine/ScriptManager.cs b/OpenSim/Region/ScriptEngine/DotNetEngine/ScriptManager.cs index 07d5d54..7f78790 100644 --- a/OpenSim/Region/ScriptEngine/DotNetEngine/ScriptManager.cs +++ b/OpenSim/Region/ScriptEngine/DotNetEngine/ScriptManager.cs @@ -69,7 +69,7 @@ namespace OpenSim.Region.ScriptEngine.DotNetEngine // Object> // IMPORTANT: Types and MemberInfo-derived objects require a LOT of memory. // Instead use RuntimeTypeHandle, RuntimeFieldHandle and RunTimeHandle (IntPtr) instead! - internal Dictionary> Scripts = new Dictionary>(); + internal Dictionary> Scripts = new Dictionary>(); public Scene World { get @@ -79,45 +79,45 @@ namespace OpenSim.Region.ScriptEngine.DotNetEngine } - internal Dictionary.KeyCollection GetScriptKeys(IScriptHost ObjectID) + internal Dictionary.KeyCollection GetScriptKeys(IScriptHost ObjectID) { if (Scripts.ContainsKey(ObjectID) == false) return null; - Dictionary Obj; + Dictionary Obj; Scripts.TryGetValue(ObjectID, out Obj); return Obj.Keys; } - internal OpenSim.Region.ScriptEngine.DotNetEngine.Compiler.LSL.LSL_BaseClass GetScript(IScriptHost ObjectID, string ScriptID) + internal LSL_BaseClass GetScript(IScriptHost ObjectID, string ScriptID) { if (Scripts.ContainsKey(ObjectID) == false) return null; - Dictionary Obj; + Dictionary Obj; Scripts.TryGetValue(ObjectID, out Obj); if (Obj.ContainsKey(ScriptID) == false) return null; // Get script - OpenSim.Region.ScriptEngine.DotNetEngine.Compiler.LSL.LSL_BaseClass Script; + LSL_BaseClass Script; Obj.TryGetValue(ScriptID, out Script); return Script; } - internal void SetScript(IScriptHost ObjectID, string ScriptID, OpenSim.Region.ScriptEngine.DotNetEngine.Compiler.LSL.LSL_BaseClass Script) + internal void SetScript(IScriptHost ObjectID, string ScriptID, LSL_BaseClass Script) { // Create object if it doesn't exist if (Scripts.ContainsKey(ObjectID) == false) { - Scripts.Add(ObjectID, new Dictionary()); + Scripts.Add(ObjectID, new Dictionary()); } // Delete script if it exists - Dictionary Obj; + Dictionary Obj; Scripts.TryGetValue(ObjectID, out Obj); if (Obj.ContainsKey(ScriptID) == true) Obj.Remove(ScriptID); @@ -126,7 +126,19 @@ namespace OpenSim.Region.ScriptEngine.DotNetEngine Obj.Add(ScriptID, Script); } + internal void RemoveScript(IScriptHost ObjectID, string ScriptID) + { + // Don't have that object? + if (Scripts.ContainsKey(ObjectID) == false) + return; + // Delete script if it exists + Dictionary Obj; + Scripts.TryGetValue(ObjectID, out Obj); + if (Obj.ContainsKey(ScriptID) == true) + Obj.Remove(ScriptID); + + } /// /// Fetches, loads and hooks up a script to an objects events /// @@ -207,7 +219,20 @@ namespace OpenSim.Region.ScriptEngine.DotNetEngine } - private string ProcessYield(string FileName) + public void StopScript(string ScriptID, IScriptHost ObjectID) + { + // Stop script + + // Get AppDomain + AppDomain ad = GetScript(ObjectID, ScriptID).Exec.GetAppDomain(); + // Tell script not to accept new requests + GetScript(ObjectID, ScriptID).Exec.StopScript(); + // Remove from internal structure + RemoveScript(ObjectID, ScriptID); + // Tell AppDomain that we have stopped script + m_scriptEngine.myAppDomainManager.StopScript(ad); + } + private string ProcessYield(string FileName) { // TODO: Create a new assembly and copy old but insert Yield Code //return TempDotNetMicroThreadingCodeInjector.TestFix(FileName); @@ -228,33 +253,11 @@ namespace OpenSim.Region.ScriptEngine.DotNetEngine // Execute a function in the script m_scriptEngine.Log.Verbose("ScriptEngine", "Executing Function ObjectID: " + ObjectID + ", ScriptID: " + ScriptID + ", FunctionName: " + FunctionName); - OpenSim.Region.ScriptEngine.DotNetEngine.Compiler.LSL.LSL_BaseClass Script = m_scriptEngine.myScriptManager.GetScript(ObjectID, ScriptID); + LSL_BaseClass Script = m_scriptEngine.myScriptManager.GetScript(ObjectID, ScriptID); // Must be done in correct AppDomain, so leaving it up to the script itself - Script.Exec.ExecuteEvent(FunctionName, args); - //Type type = Script.GetType(); - - - ////foreach (MemberInfo mi in type.GetMembers()) - ////{ - //// Common.SendToDebug("Member found: " + mi.ToString()); - ////} - - //m_scriptEngine.Log.Verbose("ScriptEngine", "Invoke: \"" + Script.State() + "_event_" + FunctionName + "\""); - - //try - //{ - // type.InvokeMember(Script.State() + "_event_" + FunctionName, BindingFlags.InvokeMethod, null, Script, args); - //} - //catch (Exception e) - //{ - // m_scriptEngine.Log.Error("ScriptEngine", "Exception attempting to executing script function: " + e.ToString()); - //} - - - } public string RegionName -- cgit v1.1