From 7580fa5c0aef318b32f7aa8bb8b0b011b08e1efa Mon Sep 17 00:00:00 2001 From: Charles Krinke Date: Wed, 2 Jul 2008 13:31:39 +0000 Subject: Mantis#1648. Thank you, Melanie for a patch that: Fix a script Xengine deadlock/hang if llResetScript is used in changed() --- .../ScriptEngine/Interfaces/IScriptEngine.cs | 1 + .../Shared/Api/Implementation/LSL_Api.cs | 2 +- OpenSim/Region/ScriptEngine/XEngine/XEngine.cs | 27 ++++++++++++++++++++-- 3 files changed, 27 insertions(+), 3 deletions(-) (limited to 'OpenSim') diff --git a/OpenSim/Region/ScriptEngine/Interfaces/IScriptEngine.cs b/OpenSim/Region/ScriptEngine/Interfaces/IScriptEngine.cs index 856f228..0dab318 100644 --- a/OpenSim/Region/ScriptEngine/Interfaces/IScriptEngine.cs +++ b/OpenSim/Region/ScriptEngine/Interfaces/IScriptEngine.cs @@ -50,6 +50,7 @@ namespace OpenSim.Region.ScriptEngine.Interfaces bool PostScriptEvent(LLUUID itemID, EventParams parms); bool PostObjectEvent(uint localID, EventParams parms); + void ApiResetScript(LLUUID itemID); void ResetScript(LLUUID itemID); void SetScriptState(LLUUID itemID, bool state); bool GetScriptState(LLUUID itemID); diff --git a/OpenSim/Region/ScriptEngine/Shared/Api/Implementation/LSL_Api.cs b/OpenSim/Region/ScriptEngine/Shared/Api/Implementation/LSL_Api.cs index 235b657..f4944cc 100644 --- a/OpenSim/Region/ScriptEngine/Shared/Api/Implementation/LSL_Api.cs +++ b/OpenSim/Region/ScriptEngine/Shared/Api/Implementation/LSL_Api.cs @@ -2767,7 +2767,7 @@ namespace OpenSim.Region.ScriptEngine.Shared.Api public void llResetScript() { m_host.AddScriptLPS(1); - m_ScriptEngine.ResetScript(m_itemID); + m_ScriptEngine.ApiResetScript(m_itemID); } public void llMessageLinked(int linknum, int num, string msg, string id) diff --git a/OpenSim/Region/ScriptEngine/XEngine/XEngine.cs b/OpenSim/Region/ScriptEngine/XEngine/XEngine.cs index b6f7fbc..5e3b91a 100644 --- a/OpenSim/Region/ScriptEngine/XEngine/XEngine.cs +++ b/OpenSim/Region/ScriptEngine/XEngine/XEngine.cs @@ -779,6 +779,13 @@ namespace OpenSim.Region.ScriptEngine.XEngine return false; } + public void ApiResetScript(LLUUID itemID) + { + XScriptInstance instance = GetInstance(itemID); + if (instance != null) + instance.ApiResetScript(); + } + public void ResetScript(LLUUID itemID) { XScriptInstance instance = GetInstance(itemID); @@ -1270,8 +1277,6 @@ namespace OpenSim.Region.ScriptEngine.XEngine } else { - m_CurrentEvent = data.EventName; -// 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}", @@ -1279,10 +1284,14 @@ namespace OpenSim.Region.ScriptEngine.XEngine try { + m_CurrentEvent = data.EventName; m_EventStart = DateTime.Now; m_InEvent = true; + m_Executor.ExecuteEvent(State, data.EventName, data.Params); + m_InEvent = false; + m_CurrentEvent = String.Empty; } catch (Exception e) { @@ -1358,6 +1367,8 @@ namespace OpenSim.Region.ScriptEngine.XEngine { bool running = Running; + RemoveState(); + Stop(0); m_Engine.m_AsyncCommands.RemoveScript(m_LocalID, m_ItemID); m_EventQueue.Clear(); @@ -1365,6 +1376,18 @@ namespace OpenSim.Region.ScriptEngine.XEngine m_State = "default"; if (running) Start(); + PostEvent(new EventParams("state_entry", + new Object[0], new DetectParams[0])); + } + + public void ApiResetScript() + { + bool running = Running; + + RemoveState(); + + m_Script.ResetVars(); + m_Engine.m_AsyncCommands.RemoveScript(m_LocalID, m_ItemID); if(m_CurrentEvent != "state_entry") { PostEvent(new EventParams("state_entry", -- cgit v1.1