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 /OpenSim/Region/ScriptEngine/Common/ScriptEngineBase/EventQueueManager.cs | |
parent | "threads" command now works. I've added manual tracking of threads (only if c... (diff) | |
download | opensim-SC-89665faeaff2ff62eaaddd0f111be8bcd7ca0297.zip opensim-SC-89665faeaff2ff62eaaddd0f111be8bcd7ca0297.tar.gz opensim-SC-89665faeaff2ff62eaaddd0f111be8bcd7ca0297.tar.bz2 opensim-SC-89665faeaff2ff62eaaddd0f111be8bcd7ca0297.tar.xz |
ScriptEngine changes in locking. Another step in direction of shared threads.
Diffstat (limited to '')
-rw-r--r-- | OpenSim/Region/ScriptEngine/Common/ScriptEngineBase/EventQueueManager.cs | 32 |
1 files changed, 15 insertions, 17 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 | { |