From 89665faeaff2ff62eaaddd0f111be8bcd7ca0297 Mon Sep 17 00:00:00 2001 From: Tedd Hansen Date: Thu, 21 Feb 2008 11:28:34 +0000 Subject: [PATCH] ScriptEngine changes in locking. Another step in direction of shared threads. --- .../ScriptEngineBase/EventQueueManager.cs | 32 +++++++++---------- .../ScriptEngineBase/EventQueueThreadClass.cs | 14 ++++---- 2 files changed, 22 insertions(+), 24 deletions(-) diff --git a/OpenSim/Region/ScriptEngine/Common/ScriptEngineBase/EventQueueManager.cs b/OpenSim/Region/ScriptEngine/Common/ScriptEngineBase/EventQueueManager.cs index 267cf52dc9..eaffe3f143 100644 --- a/OpenSim/Region/ScriptEngine/Common/ScriptEngineBase/EventQueueManager.cs +++ b/OpenSim/Region/ScriptEngine/Common/ScriptEngineBase/EventQueueManager.cs @@ -60,24 +60,22 @@ namespace OpenSim.Region.ScriptEngine.Common.ScriptEngineBase // Notes: // * Current execution load balancing is optimized for 1 thread, and can cause unfair execute balancing between scripts. // Not noticeable unless server is under high load. - // * This class contains the number of threads used for script executions. Since we are not microthreading scripts yet, - // increase number of threads to allow more concurrent script executions in OpenSim. // public ScriptEngine m_ScriptEngine; /// /// List of threads (classes) processing event queue + /// Note that this may or may not be a reference to a static object depending on PrivateRegionThreads config setting. /// internal List eventQueueThreads; // Thread pool that we work on /// /// Locking access to eventQueueThreads AND staticGlobalEventQueueThreads. - /// Note that this may or may not be a reference to a static object depending on PrivateRegionThreads config setting. /// - private object eventQueueThreadsLock = new object(); +// private object eventQueueThreadsLock = new object(); // Static objects for referencing the objects above if we don't have private threads: internal static List staticEventQueueThreads; // A static reference used if we don't use private threads - internal static object staticEventQueueThreadsLock; // Statick lock object reference for same reason +// internal static object staticEventQueueThreadsLock; // Statick lock object reference for same reason /// /// Global static list of all threads (classes) processing event queue -- used by max enforcment thread @@ -91,7 +89,7 @@ namespace OpenSim.Region.ScriptEngine.Common.ScriptEngineBase public object ThreadsToExitLock = new object(); - public object queueLock = new object(); // Mutex lock object + //public object queueLock = new object(); // Mutex lock object /// /// How many threads to process queue with @@ -183,7 +181,7 @@ namespace OpenSim.Region.ScriptEngine.Common.ScriptEngineBase { // PRIVATE THREAD POOL PER REGION eventQueueThreads = new List(); - eventQueueThreadsLock = new object(); + // eventQueueThreadsLock = new object(); } else { @@ -191,12 +189,12 @@ namespace OpenSim.Region.ScriptEngine.Common.ScriptEngineBase // Crate the static objects if (staticEventQueueThreads == null) staticEventQueueThreads = new List(); - if (staticEventQueueThreadsLock == null) - staticEventQueueThreadsLock = new object(); + // if (staticEventQueueThreadsLock == null) + // staticEventQueueThreadsLock = new object(); // Now reference our locals to them eventQueueThreads = staticEventQueueThreads; - eventQueueThreadsLock = staticEventQueueThreadsLock; + //eventQueueThreadsLock = staticEventQueueThreadsLock; } ReadConfig(); @@ -213,7 +211,7 @@ namespace OpenSim.Region.ScriptEngine.Common.ScriptEngineBase EventExecutionMaxQueueSize = m_ScriptEngine.ScriptConfigSource.GetInt("EventExecutionMaxQueueSize", 300); // Now refresh config in all threads - lock (eventQueueThreadsLock) + lock (eventQueueThreads) { foreach (EventQueueThreadClass EventQueueThread in eventQueueThreads) { @@ -232,10 +230,10 @@ namespace OpenSim.Region.ScriptEngine.Common.ScriptEngineBase private void Stop() { - if (eventQueueThreadsLock != null && eventQueueThreads != null) + if (eventQueueThreads != null && eventQueueThreads != null) { // Kill worker threads - lock (eventQueueThreadsLock) + lock (eventQueueThreads) { foreach (EventQueueThreadClass EventQueueThread in eventQueueThreads) { @@ -247,7 +245,7 @@ namespace OpenSim.Region.ScriptEngine.Common.ScriptEngineBase } // Remove all entries from our event queue - lock (queueLock) + lock (eventQueue) { eventQueue.Clear(); } @@ -361,7 +359,7 @@ namespace OpenSim.Region.ScriptEngine.Common.ScriptEngineBase /// Array of parameters to match event mask public void AddToScriptQueue(uint localID, LLUUID itemID, string FunctionName, Queue_llDetectParams_Struct qParams, params object[] param) { - lock (queueLock) + lock (eventQueue) { if (eventQueue.Count >= EventExecutionMaxQueueSize) { @@ -396,7 +394,7 @@ namespace OpenSim.Region.ScriptEngine.Common.ScriptEngineBase if (eventQueueThreads.Count == numberOfThreads) return; - lock (eventQueueThreadsLock) + lock (eventQueueThreads) { int diff = numberOfThreads - eventQueueThreads.Count; // Positive number: Start @@ -426,7 +424,7 @@ namespace OpenSim.Region.ScriptEngine.Common.ScriptEngineBase public void CheckScriptMaxExecTime() { // Iterate through all ScriptThreadClasses and check how long their current function has been executing - lock (eventQueueThreadsLock) + lock (eventQueueThreads) { foreach (EventQueueThreadClass EventQueueThread in staticGlobalEventQueueThreads) { diff --git a/OpenSim/Region/ScriptEngine/Common/ScriptEngineBase/EventQueueThreadClass.cs b/OpenSim/Region/ScriptEngine/Common/ScriptEngineBase/EventQueueThreadClass.cs index 6f966544b8..cf66e7a36a 100644 --- a/OpenSim/Region/ScriptEngine/Common/ScriptEngineBase/EventQueueThreadClass.cs +++ b/OpenSim/Region/ScriptEngine/Common/ScriptEngineBase/EventQueueThreadClass.cs @@ -200,7 +200,7 @@ namespace OpenSim.Region.ScriptEngine.Common.ScriptEngineBase //myScriptEngine.Log.Info("[" + ScriptEngineName + "]: Processing event for localID: " + QIS.localID + ", itemID: " + QIS.itemID + ", FunctionName: " + QIS.FunctionName); // OBJECT BASED LOCK - TWO THREADS WORKING ON SAME OBJECT IS NOT GOOD - lock (eventQueueManager.queueLock) + lock (eventQueueManager.eventQueue) { GotItem = false; for (int qc = 0; qc < eventQueueManager.eventQueue.Count; qc++) @@ -230,12 +230,12 @@ namespace OpenSim.Region.ScriptEngine.Common.ScriptEngineBase { ///cfk 2-7-08 dont need this right now and the default Linux build has DEBUG defined #if DEBUG - eventQueueManager.m_ScriptEngine.Log.Debug("[" + ScriptEngineName + "]: " + - "Executing event:\r\n" - + "QIS.localID: " + QIS.localID - + ", QIS.itemID: " + QIS.itemID - + ", QIS.functionName: " + - QIS.functionName); + //eventQueueManager.m_ScriptEngine.Log.Debug("[" + ScriptEngineName + "]: " + + // "Executing event:\r\n" + // + "QIS.localID: " + QIS.localID + // + ", QIS.itemID: " + QIS.itemID + // + ", QIS.functionName: " + + // QIS.functionName); #endif LastExecutionStarted = DateTime.Now.Ticks; KillCurrentScript = false;