From 824eb7ed20a006a7abf0b1cd4d7f46d9c154647e Mon Sep 17 00:00:00 2001 From: Diva Canto Date: Sat, 10 Mar 2012 19:51:28 -0800 Subject: Added osGetGridGatekeeperURI() --- .../ScriptEngine/Shared/Api/Implementation/OSSL_Api.cs | 14 ++++++++++++++ .../Region/ScriptEngine/Shared/Api/Interface/IOSSL_Api.cs | 1 + .../Region/ScriptEngine/Shared/Api/Runtime/OSSL_Stub.cs | 5 +++++ 3 files changed, 20 insertions(+) (limited to 'OpenSim/Region/ScriptEngine') diff --git a/OpenSim/Region/ScriptEngine/Shared/Api/Implementation/OSSL_Api.cs b/OpenSim/Region/ScriptEngine/Shared/Api/Implementation/OSSL_Api.cs index 8edd146..3dbc31a 100644 --- a/OpenSim/Region/ScriptEngine/Shared/Api/Implementation/OSSL_Api.cs +++ b/OpenSim/Region/ScriptEngine/Shared/Api/Implementation/OSSL_Api.cs @@ -2093,6 +2093,20 @@ namespace OpenSim.Region.ScriptEngine.Shared.Api return HomeURI; } + public string osGetGridGatekeeperURI() + { + CheckThreatLevel(ThreatLevel.Moderate, "osGetGridGatekeeperURI"); + m_host.AddScriptLPS(1); + + string gatekeeperURI = String.Empty; + IConfigSource config = m_ScriptEngine.ConfigSource; + + if (config.Configs["GridService"] != null) + gatekeeperURI = config.Configs["GridService"].GetString("Gatekeeper", gatekeeperURI); + + return gatekeeperURI; + } + public string osGetGridCustom(string key) { CheckThreatLevel(ThreatLevel.Moderate, "osGetGridCustom"); diff --git a/OpenSim/Region/ScriptEngine/Shared/Api/Interface/IOSSL_Api.cs b/OpenSim/Region/ScriptEngine/Shared/Api/Interface/IOSSL_Api.cs index 82a6caf..a5b906f 100644 --- a/OpenSim/Region/ScriptEngine/Shared/Api/Interface/IOSSL_Api.cs +++ b/OpenSim/Region/ScriptEngine/Shared/Api/Interface/IOSSL_Api.cs @@ -161,6 +161,7 @@ namespace OpenSim.Region.ScriptEngine.Shared.Api.Interfaces string osGetGridName(); string osGetGridLoginURI(); string osGetGridHomeURI(); + string osGetGridGatekeeperURI(); string osGetGridCustom(string key); LSL_String osFormatString(string str, LSL_List strings); diff --git a/OpenSim/Region/ScriptEngine/Shared/Api/Runtime/OSSL_Stub.cs b/OpenSim/Region/ScriptEngine/Shared/Api/Runtime/OSSL_Stub.cs index 4341246..e048da2 100644 --- a/OpenSim/Region/ScriptEngine/Shared/Api/Runtime/OSSL_Stub.cs +++ b/OpenSim/Region/ScriptEngine/Shared/Api/Runtime/OSSL_Stub.cs @@ -457,6 +457,11 @@ namespace OpenSim.Region.ScriptEngine.Shared.ScriptBase return m_OSSL_Functions.osGetGridHomeURI(); } + public string osGetGridGatekeeperURI() + { + return m_OSSL_Functions.osGetGridGatekeeperURI(); + } + public string osGetGridCustom(string key) { return m_OSSL_Functions.osGetGridCustom(key); -- cgit v1.1 From 25592bbd852e9350bca25f240d6d54c7a54e28a0 Mon Sep 17 00:00:00 2001 From: Justin Clark-Casey (justincc) Date: Mon, 12 Mar 2012 21:16:05 +0000 Subject: Add max thread and min thread information to "xengine status" region console command --- OpenSim/Region/ScriptEngine/Shared/Instance/ScriptInstance.cs | 3 +++ OpenSim/Region/ScriptEngine/XEngine/XEngine.cs | 2 ++ 2 files changed, 5 insertions(+) (limited to 'OpenSim/Region/ScriptEngine') diff --git a/OpenSim/Region/ScriptEngine/Shared/Instance/ScriptInstance.cs b/OpenSim/Region/ScriptEngine/Shared/Instance/ScriptInstance.cs index bc1902b..4010167 100644 --- a/OpenSim/Region/ScriptEngine/Shared/Instance/ScriptInstance.cs +++ b/OpenSim/Region/ScriptEngine/Shared/Instance/ScriptInstance.cs @@ -578,7 +578,10 @@ namespace OpenSim.Region.ScriptEngine.Shared.Instance return true; if (!m_InSelfDelete) + { +// m_log.ErrorFormat("[SCRIPT INSTANCE]: Aborting script {0} {1}", ScriptName, ItemID); result.Abort(); + } lock (m_EventQueue) { diff --git a/OpenSim/Region/ScriptEngine/XEngine/XEngine.cs b/OpenSim/Region/ScriptEngine/XEngine/XEngine.cs index b433430..66349e3 100644 --- a/OpenSim/Region/ScriptEngine/XEngine/XEngine.cs +++ b/OpenSim/Region/ScriptEngine/XEngine/XEngine.cs @@ -384,6 +384,8 @@ namespace OpenSim.Region.ScriptEngine.XEngine sb.AppendFormat("Unique scripts : {0}\n", m_uniqueScripts.Count); sb.AppendFormat("Scripts waiting for load : {0}\n", m_CompileQueue.Count); + sb.AppendFormat("Max threads : {0}\n", m_ThreadPool.MaxThreads); + sb.AppendFormat("Min threads : {0}\n", m_ThreadPool.MinThreads); sb.AppendFormat("Allocated threads : {0}\n", m_ThreadPool.ActiveThreads); sb.AppendFormat("In use threads : {0}\n", m_ThreadPool.InUseThreads); sb.AppendFormat("Work items waiting : {0}\n", m_ThreadPool.WaitingCallbacks); -- cgit v1.1 From 95ec96bf86ebebbc6c2f2c3f3a2bd8ce3f9990f4 Mon Sep 17 00:00:00 2001 From: Justin Clark-Casey (justincc) Date: Wed, 14 Mar 2012 00:29:36 +0000 Subject: refactor: rename ScriptInstance.m_CurrentResult to m_CurrentWorkItem to make it more understandable as to what it is and what it does (hold a thread pool work item for a waiting of in-progress event) Also add other various illustrative comments --- .../ScriptEngine/Interfaces/IScriptInstance.cs | 8 ++- .../ScriptEngine/Shared/Instance/ScriptInstance.cs | 66 ++++++++++++++-------- OpenSim/Region/ScriptEngine/XEngine/XEngine.cs | 1 - 3 files changed, 50 insertions(+), 25 deletions(-) (limited to 'OpenSim/Region/ScriptEngine') diff --git a/OpenSim/Region/ScriptEngine/Interfaces/IScriptInstance.cs b/OpenSim/Region/ScriptEngine/Interfaces/IScriptInstance.cs index d3200d5..f00e41f 100644 --- a/OpenSim/Region/ScriptEngine/Interfaces/IScriptInstance.cs +++ b/OpenSim/Region/ScriptEngine/Interfaces/IScriptInstance.cs @@ -89,7 +89,7 @@ namespace OpenSim.Region.ScriptEngine.Interfaces void Start(); /// - /// Stop the script. + /// Stop the script instance. /// /// /// true if the script was successfully stopped, false otherwise @@ -97,13 +97,17 @@ namespace OpenSim.Region.ScriptEngine.Interfaces void SetState(string state); + /// + /// Post an event to this script instance. + /// + /// void PostEvent(EventParams data); void Suspend(); void Resume(); /// - /// Process the next event queued for this script + /// Process the next event queued for this script instance. /// /// object EventProcessor(); diff --git a/OpenSim/Region/ScriptEngine/Shared/Instance/ScriptInstance.cs b/OpenSim/Region/ScriptEngine/Shared/Instance/ScriptInstance.cs index 4010167..b840730 100644 --- a/OpenSim/Region/ScriptEngine/Shared/Instance/ScriptInstance.cs +++ b/OpenSim/Region/ScriptEngine/Shared/Instance/ScriptInstance.cs @@ -58,7 +58,15 @@ namespace OpenSim.Region.ScriptEngine.Shared.Instance private static readonly ILog m_log = LogManager.GetLogger(MethodBase.GetCurrentMethod().DeclaringType); private IScriptEngine m_Engine; - private IScriptWorkItem m_CurrentResult = null; + + /// + /// The current work item if an event for this script is running or waiting to run, + /// + /// + /// Null if there is no running or waiting to run event. Must be changed only under an m_EventQueue lock. + /// + private IScriptWorkItem m_CurrentWorkItem; + private Queue m_EventQueue = new Queue(32); private bool m_RunEvents = false; private UUID m_ItemID; @@ -157,7 +165,7 @@ namespace OpenSim.Region.ScriptEngine.Shared.Instance { // Need to place ourselves back in a work item if there are events to process if ((m_EventQueue.Count > 0) && m_RunEvents && (!m_ShuttingDown)) - m_CurrentResult = m_Engine.QueueEventHandler(this); + m_CurrentWorkItem = m_Engine.QueueEventHandler(this); } } } @@ -527,8 +535,8 @@ namespace OpenSim.Region.ScriptEngine.Shared.Instance if (m_EventQueue.Count > 0) { - if (m_CurrentResult == null) - m_CurrentResult = m_Engine.QueueEventHandler(this); + if (m_CurrentWorkItem == null) + m_CurrentWorkItem = m_Engine.QueueEventHandler(this); // else // m_log.Error("[Script] Tried to start a script that was already queued"); } @@ -540,52 +548,58 @@ namespace OpenSim.Region.ScriptEngine.Shared.Instance // m_log.DebugFormat( // "[SCRIPT INSTANCE]: Stopping script {0} {1} with timeout {2}", ScriptName, ItemID, timeout); - IScriptWorkItem result; + IScriptWorkItem workItem; lock (m_EventQueue) { if (!Running) return true; - if (m_CurrentResult == null) + // If we're not running or waiting to run an event then we can safely stop. + if (m_CurrentWorkItem == null) { m_RunEvents = false; return true; } - if (m_CurrentResult.Cancel()) + // If we are waiting to run an event then we can try to cancel it. + if (m_CurrentWorkItem.Cancel()) { - m_CurrentResult = null; + m_CurrentWorkItem = null; m_RunEvents = false; return true; } - result = m_CurrentResult; + workItem = m_CurrentWorkItem; m_RunEvents = false; } - if (result.Wait(new TimeSpan((long)timeout * 100000))) + // Wait for the current event to complete. + if (workItem.Wait(new TimeSpan((long)timeout * 100000))) { return true; } lock (m_EventQueue) { - result = m_CurrentResult; + workItem = m_CurrentWorkItem; } - if (result == null) + if (workItem == null) return true; + // If the event still hasn't stopped and we the stop isn't the result of script or object removal, then + // forcibly abort the work item (this aborts the underlying thread). if (!m_InSelfDelete) { // m_log.ErrorFormat("[SCRIPT INSTANCE]: Aborting script {0} {1}", ScriptName, ItemID); - result.Abort(); + + workItem.Abort(); } lock (m_EventQueue) { - m_CurrentResult = null; + m_CurrentWorkItem = null; } return true; @@ -606,6 +620,13 @@ namespace OpenSim.Region.ScriptEngine.Shared.Instance throw new EventAbortException(); } + /// + /// Post an event to this script instance. + /// + /// + /// The request to run the event is sent + /// + /// public void PostEvent(EventParams data) { // m_log.DebugFormat("[Script] Posted event {2} in state {3} to {0}.{1}", @@ -672,9 +693,9 @@ namespace OpenSim.Region.ScriptEngine.Shared.Instance m_EventQueue.Enqueue(data); - if (m_CurrentResult == null) + if (m_CurrentWorkItem == null) { - m_CurrentResult = m_Engine.QueueEventHandler(this); + m_CurrentWorkItem = m_Engine.QueueEventHandler(this); } } } @@ -701,11 +722,11 @@ namespace OpenSim.Region.ScriptEngine.Shared.Instance { if ((m_EventQueue.Count > 0) && m_RunEvents && (!m_ShuttingDown)) { - m_CurrentResult = m_Engine.QueueEventHandler(this); + m_CurrentWorkItem = m_Engine.QueueEventHandler(this); } else { - m_CurrentResult = null; + m_CurrentWorkItem = null; } return 0; } @@ -825,15 +846,18 @@ namespace OpenSim.Region.ScriptEngine.Shared.Instance } } + + // If there are more events and we are currently running and not shutting down, then ask the + // script engine to run the next event. lock (m_EventQueue) { if ((m_EventQueue.Count > 0) && m_RunEvents && (!m_ShuttingDown)) { - m_CurrentResult = m_Engine.QueueEventHandler(this); + m_CurrentWorkItem = m_Engine.QueueEventHandler(this); } else { - m_CurrentResult = null; + m_CurrentWorkItem = null; } } @@ -943,8 +967,6 @@ namespace OpenSim.Region.ScriptEngine.Shared.Instance public void SaveState(string assembly) { - - // If we're currently in an event, just tell it to save upon return // if (m_InEvent) diff --git a/OpenSim/Region/ScriptEngine/XEngine/XEngine.cs b/OpenSim/Region/ScriptEngine/XEngine/XEngine.cs index 66349e3..ab41873 100644 --- a/OpenSim/Region/ScriptEngine/XEngine/XEngine.cs +++ b/OpenSim/Region/ScriptEngine/XEngine/XEngine.cs @@ -990,7 +990,6 @@ namespace OpenSim.Region.ScriptEngine.XEngine lock (m_Scripts) { // Create the object record - if ((!m_Scripts.ContainsKey(itemID)) || (m_Scripts[itemID].AssetID != assetID)) { -- cgit v1.1