From a3ac702941bbae92ca5a3ed452eb3d417bf30f0b Mon Sep 17 00:00:00 2001 From: Dr Scofield Date: Wed, 28 Jan 2009 09:22:12 +0000 Subject: From: Christopher Yeoh Adding Oarfileloaded and EmptyScriptCompileQueue event support which allows (with a module) for programmatic notification of when a region objects and scripts are up and running after a server start or load-oar. --- OpenSim/Region/ScriptEngine/XEngine/XEngine.cs | 24 ++++++++++++++++++++++++ 1 file changed, 24 insertions(+) (limited to 'OpenSim/Region/ScriptEngine') diff --git a/OpenSim/Region/ScriptEngine/XEngine/XEngine.cs b/OpenSim/Region/ScriptEngine/XEngine/XEngine.cs index 30ce79b..fc76d0b 100644 --- a/OpenSim/Region/ScriptEngine/XEngine/XEngine.cs +++ b/OpenSim/Region/ScriptEngine/XEngine/XEngine.cs @@ -71,6 +71,8 @@ namespace OpenSim.Region.ScriptEngine.XEngine private ThreadPriority m_Prio; private bool m_Enabled = false; private bool m_InitialStartup = true; + private int m_ScriptFailCount; // Number of script fails since compile queue was last empty + private string m_ScriptErrorMessage; // disable warning: need to keep a reference to XEngine.EventManager // alive to avoid it being garbage collected @@ -149,6 +151,8 @@ namespace OpenSim.Region.ScriptEngine.XEngine public void Initialise(Scene scene, IConfigSource configSource) { m_ScriptConfig = configSource.Configs["XEngine"]; + m_ScriptFailCount = 0; + m_ScriptErrorMessage = String.Empty; if (m_ScriptConfig == null) { @@ -417,6 +421,13 @@ namespace OpenSim.Region.ScriptEngine.XEngine { m_InitialStartup = false; System.Threading.Thread.Sleep(15000); + lock (m_CompileQueue) + { + if (m_CompileQueue.Count==0) + // No scripts on region, so won't get triggered later + // by the queue becoming empty so we trigger it here + m_Scene.EventManager.TriggerEmptyScriptCompileQueue(0, String.Empty); + } } Object o; @@ -443,6 +454,9 @@ namespace OpenSim.Region.ScriptEngine.XEngine else { m_CurrentCompile = null; + m_Scene.EventManager.TriggerEmptyScriptCompileQueue(m_ScriptFailCount, + m_ScriptErrorMessage); + m_ScriptFailCount = 0; } } return null; @@ -468,12 +482,18 @@ namespace OpenSim.Region.ScriptEngine.XEngine if (part == null) { Log.Error("[Script] SceneObjectPart unavailable. Script NOT started."); + m_ScriptErrorMessage += "SceneObjectPart unavailable. Script NOT started.\n"; + m_ScriptFailCount++; return false; } TaskInventoryItem item = part.Inventory.GetInventoryItem(itemID); if (item == null) + { + m_ScriptErrorMessage += "Can't find script inventory item.\n"; + m_ScriptFailCount++; return false; + } UUID assetID = item.AssetID; @@ -499,6 +519,8 @@ namespace OpenSim.Region.ScriptEngine.XEngine try { // DISPLAY ERROR INWORLD + m_ScriptErrorMessage += "Failed to compile: " + e.Message.ToString(); + m_ScriptFailCount++; string text = "Error compiling script:\n" + e.Message.ToString(); if (text.Length > 1000) text = text.Substring(0, 1000); @@ -567,6 +589,8 @@ namespace OpenSim.Region.ScriptEngine.XEngine catch (Exception e) { m_log.ErrorFormat("[XEngine] Exception creating app domain:\n {0}", e.ToString()); + m_ScriptErrorMessage += "Exception creating app domain:\n"; + m_ScriptFailCount++; return false; } } -- cgit v1.1