diff options
author | Tedd Hansen | 2008-02-21 11:28:34 +0000 |
---|---|---|
committer | Tedd Hansen | 2008-02-21 11:28:34 +0000 |
commit | 89665faeaff2ff62eaaddd0f111be8bcd7ca0297 (patch) | |
tree | 12af17ba8a9b82b720a16ea2aa586531be1e4947 | |
parent | "threads" command now works. I've added manual tracking of threads (only if c... (diff) | |
download | opensim-SC_OLD-89665faeaff2ff62eaaddd0f111be8bcd7ca0297.zip opensim-SC_OLD-89665faeaff2ff62eaaddd0f111be8bcd7ca0297.tar.gz opensim-SC_OLD-89665faeaff2ff62eaaddd0f111be8bcd7ca0297.tar.bz2 opensim-SC_OLD-89665faeaff2ff62eaaddd0f111be8bcd7ca0297.tar.xz |
ScriptEngine changes in locking. Another step in direction of shared threads.
-rw-r--r-- | OpenSim/Region/ScriptEngine/Common/ScriptEngineBase/EventQueueManager.cs | 32 | ||||
-rw-r--r-- | OpenSim/Region/ScriptEngine/Common/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 267cf52..eaffe3f 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 | |||
60 | // Notes: | 60 | // Notes: |
61 | // * Current execution load balancing is optimized for 1 thread, and can cause unfair execute balancing between scripts. | 61 | // * Current execution load balancing is optimized for 1 thread, and can cause unfair execute balancing between scripts. |
62 | // Not noticeable unless server is under high load. | 62 | // Not noticeable unless server is under high load. |
63 | // * This class contains the number of threads used for script executions. Since we are not microthreading scripts yet, | ||
64 | // increase number of threads to allow more concurrent script executions in OpenSim. | ||
65 | // | 63 | // |
66 | 64 | ||
67 | public ScriptEngine m_ScriptEngine; | 65 | public ScriptEngine m_ScriptEngine; |
68 | 66 | ||
69 | /// <summary> | 67 | /// <summary> |
70 | /// List of threads (classes) processing event queue | 68 | /// List of threads (classes) processing event queue |
69 | /// Note that this may or may not be a reference to a static object depending on PrivateRegionThreads config setting. | ||
71 | /// </summary> | 70 | /// </summary> |
72 | internal List<EventQueueThreadClass> eventQueueThreads; // Thread pool that we work on | 71 | internal List<EventQueueThreadClass> eventQueueThreads; // Thread pool that we work on |
73 | /// <summary> | 72 | /// <summary> |
74 | /// Locking access to eventQueueThreads AND staticGlobalEventQueueThreads. | 73 | /// Locking access to eventQueueThreads AND staticGlobalEventQueueThreads. |
75 | /// Note that this may or may not be a reference to a static object depending on PrivateRegionThreads config setting. | ||
76 | /// </summary> | 74 | /// </summary> |
77 | private object eventQueueThreadsLock = new object(); | 75 | // private object eventQueueThreadsLock = new object(); |
78 | // Static objects for referencing the objects above if we don't have private threads: | 76 | // Static objects for referencing the objects above if we don't have private threads: |
79 | internal static List<EventQueueThreadClass> staticEventQueueThreads; // A static reference used if we don't use private threads | 77 | internal static List<EventQueueThreadClass> staticEventQueueThreads; // A static reference used if we don't use private threads |
80 | internal static object staticEventQueueThreadsLock; // Statick lock object reference for same reason | 78 | // internal static object staticEventQueueThreadsLock; // Statick lock object reference for same reason |
81 | 79 | ||
82 | /// <summary> | 80 | /// <summary> |
83 | /// Global static list of all threads (classes) processing event queue -- used by max enforcment thread | 81 | /// 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 | |||
91 | public object ThreadsToExitLock = new object(); | 89 | public object ThreadsToExitLock = new object(); |
92 | 90 | ||
93 | 91 | ||
94 | public object queueLock = new object(); // Mutex lock object | 92 | //public object queueLock = new object(); // Mutex lock object |
95 | 93 | ||
96 | /// <summary> | 94 | /// <summary> |
97 | /// How many threads to process queue with | 95 | /// How many threads to process queue with |
@@ -183,7 +181,7 @@ namespace OpenSim.Region.ScriptEngine.Common.ScriptEngineBase | |||
183 | { | 181 | { |
184 | // PRIVATE THREAD POOL PER REGION | 182 | // PRIVATE THREAD POOL PER REGION |
185 | eventQueueThreads = new List<EventQueueThreadClass>(); | 183 | eventQueueThreads = new List<EventQueueThreadClass>(); |
186 | eventQueueThreadsLock = new object(); | 184 | // eventQueueThreadsLock = new object(); |
187 | } | 185 | } |
188 | else | 186 | else |
189 | { | 187 | { |
@@ -191,12 +189,12 @@ namespace OpenSim.Region.ScriptEngine.Common.ScriptEngineBase | |||
191 | // Crate the static objects | 189 | // Crate the static objects |
192 | if (staticEventQueueThreads == null) | 190 | if (staticEventQueueThreads == null) |
193 | staticEventQueueThreads = new List<EventQueueThreadClass>(); | 191 | staticEventQueueThreads = new List<EventQueueThreadClass>(); |
194 | if (staticEventQueueThreadsLock == null) | 192 | // if (staticEventQueueThreadsLock == null) |
195 | staticEventQueueThreadsLock = new object(); | 193 | // staticEventQueueThreadsLock = new object(); |
196 | 194 | ||
197 | // Now reference our locals to them | 195 | // Now reference our locals to them |
198 | eventQueueThreads = staticEventQueueThreads; | 196 | eventQueueThreads = staticEventQueueThreads; |
199 | eventQueueThreadsLock = staticEventQueueThreadsLock; | 197 | //eventQueueThreadsLock = staticEventQueueThreadsLock; |
200 | } | 198 | } |
201 | 199 | ||
202 | ReadConfig(); | 200 | ReadConfig(); |
@@ -213,7 +211,7 @@ namespace OpenSim.Region.ScriptEngine.Common.ScriptEngineBase | |||
213 | EventExecutionMaxQueueSize = m_ScriptEngine.ScriptConfigSource.GetInt("EventExecutionMaxQueueSize", 300); | 211 | EventExecutionMaxQueueSize = m_ScriptEngine.ScriptConfigSource.GetInt("EventExecutionMaxQueueSize", 300); |
214 | 212 | ||
215 | // Now refresh config in all threads | 213 | // Now refresh config in all threads |
216 | lock (eventQueueThreadsLock) | 214 | lock (eventQueueThreads) |
217 | { | 215 | { |
218 | foreach (EventQueueThreadClass EventQueueThread in eventQueueThreads) | 216 | foreach (EventQueueThreadClass EventQueueThread in eventQueueThreads) |
219 | { | 217 | { |
@@ -232,10 +230,10 @@ namespace OpenSim.Region.ScriptEngine.Common.ScriptEngineBase | |||
232 | 230 | ||
233 | private void Stop() | 231 | private void Stop() |
234 | { | 232 | { |
235 | if (eventQueueThreadsLock != null && eventQueueThreads != null) | 233 | if (eventQueueThreads != null && eventQueueThreads != null) |
236 | { | 234 | { |
237 | // Kill worker threads | 235 | // Kill worker threads |
238 | lock (eventQueueThreadsLock) | 236 | lock (eventQueueThreads) |
239 | { | 237 | { |
240 | foreach (EventQueueThreadClass EventQueueThread in eventQueueThreads) | 238 | foreach (EventQueueThreadClass EventQueueThread in eventQueueThreads) |
241 | { | 239 | { |
@@ -247,7 +245,7 @@ namespace OpenSim.Region.ScriptEngine.Common.ScriptEngineBase | |||
247 | } | 245 | } |
248 | 246 | ||
249 | // Remove all entries from our event queue | 247 | // Remove all entries from our event queue |
250 | lock (queueLock) | 248 | lock (eventQueue) |
251 | { | 249 | { |
252 | eventQueue.Clear(); | 250 | eventQueue.Clear(); |
253 | } | 251 | } |
@@ -361,7 +359,7 @@ namespace OpenSim.Region.ScriptEngine.Common.ScriptEngineBase | |||
361 | /// <param name="param">Array of parameters to match event mask</param> | 359 | /// <param name="param">Array of parameters to match event mask</param> |
362 | public void AddToScriptQueue(uint localID, LLUUID itemID, string FunctionName, Queue_llDetectParams_Struct qParams, params object[] param) | 360 | public void AddToScriptQueue(uint localID, LLUUID itemID, string FunctionName, Queue_llDetectParams_Struct qParams, params object[] param) |
363 | { | 361 | { |
364 | lock (queueLock) | 362 | lock (eventQueue) |
365 | { | 363 | { |
366 | if (eventQueue.Count >= EventExecutionMaxQueueSize) | 364 | if (eventQueue.Count >= EventExecutionMaxQueueSize) |
367 | { | 365 | { |
@@ -396,7 +394,7 @@ namespace OpenSim.Region.ScriptEngine.Common.ScriptEngineBase | |||
396 | if (eventQueueThreads.Count == numberOfThreads) | 394 | if (eventQueueThreads.Count == numberOfThreads) |
397 | return; | 395 | return; |
398 | 396 | ||
399 | lock (eventQueueThreadsLock) | 397 | lock (eventQueueThreads) |
400 | { | 398 | { |
401 | int diff = numberOfThreads - eventQueueThreads.Count; | 399 | int diff = numberOfThreads - eventQueueThreads.Count; |
402 | // Positive number: Start | 400 | // Positive number: Start |
@@ -426,7 +424,7 @@ namespace OpenSim.Region.ScriptEngine.Common.ScriptEngineBase | |||
426 | public void CheckScriptMaxExecTime() | 424 | public void CheckScriptMaxExecTime() |
427 | { | 425 | { |
428 | // Iterate through all ScriptThreadClasses and check how long their current function has been executing | 426 | // Iterate through all ScriptThreadClasses and check how long their current function has been executing |
429 | lock (eventQueueThreadsLock) | 427 | lock (eventQueueThreads) |
430 | { | 428 | { |
431 | foreach (EventQueueThreadClass EventQueueThread in staticGlobalEventQueueThreads) | 429 | foreach (EventQueueThreadClass EventQueueThread in staticGlobalEventQueueThreads) |
432 | { | 430 | { |
diff --git a/OpenSim/Region/ScriptEngine/Common/ScriptEngineBase/EventQueueThreadClass.cs b/OpenSim/Region/ScriptEngine/Common/ScriptEngineBase/EventQueueThreadClass.cs index 6f96654..cf66e7a 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 | |||
200 | //myScriptEngine.Log.Info("[" + ScriptEngineName + "]: Processing event for localID: " + QIS.localID + ", itemID: " + QIS.itemID + ", FunctionName: " + QIS.FunctionName); | 200 | //myScriptEngine.Log.Info("[" + ScriptEngineName + "]: Processing event for localID: " + QIS.localID + ", itemID: " + QIS.itemID + ", FunctionName: " + QIS.FunctionName); |
201 | 201 | ||
202 | // OBJECT BASED LOCK - TWO THREADS WORKING ON SAME OBJECT IS NOT GOOD | 202 | // OBJECT BASED LOCK - TWO THREADS WORKING ON SAME OBJECT IS NOT GOOD |
203 | lock (eventQueueManager.queueLock) | 203 | lock (eventQueueManager.eventQueue) |
204 | { | 204 | { |
205 | GotItem = false; | 205 | GotItem = false; |
206 | for (int qc = 0; qc < eventQueueManager.eventQueue.Count; qc++) | 206 | for (int qc = 0; qc < eventQueueManager.eventQueue.Count; qc++) |
@@ -230,12 +230,12 @@ namespace OpenSim.Region.ScriptEngine.Common.ScriptEngineBase | |||
230 | { | 230 | { |
231 | ///cfk 2-7-08 dont need this right now and the default Linux build has DEBUG defined | 231 | ///cfk 2-7-08 dont need this right now and the default Linux build has DEBUG defined |
232 | #if DEBUG | 232 | #if DEBUG |
233 | eventQueueManager.m_ScriptEngine.Log.Debug("[" + ScriptEngineName + "]: " + | 233 | //eventQueueManager.m_ScriptEngine.Log.Debug("[" + ScriptEngineName + "]: " + |
234 | "Executing event:\r\n" | 234 | // "Executing event:\r\n" |
235 | + "QIS.localID: " + QIS.localID | 235 | // + "QIS.localID: " + QIS.localID |
236 | + ", QIS.itemID: " + QIS.itemID | 236 | // + ", QIS.itemID: " + QIS.itemID |
237 | + ", QIS.functionName: " + | 237 | // + ", QIS.functionName: " + |
238 | QIS.functionName); | 238 | // QIS.functionName); |
239 | #endif | 239 | #endif |
240 | LastExecutionStarted = DateTime.Now.Ticks; | 240 | LastExecutionStarted = DateTime.Now.Ticks; |
241 | KillCurrentScript = false; | 241 | KillCurrentScript = false; |