diff options
Diffstat (limited to '')
-rw-r--r-- | OpenSim/Region/ScriptEngine/Common/ScriptEngineBase/EventQueueManager.cs | 42 |
1 files changed, 33 insertions, 9 deletions
diff --git a/OpenSim/Region/ScriptEngine/Common/ScriptEngineBase/EventQueueManager.cs b/OpenSim/Region/ScriptEngine/Common/ScriptEngineBase/EventQueueManager.cs index 04c084a..3ba4618 100644 --- a/OpenSim/Region/ScriptEngine/Common/ScriptEngineBase/EventQueueManager.cs +++ b/OpenSim/Region/ScriptEngine/Common/ScriptEngineBase/EventQueueManager.cs | |||
@@ -42,7 +42,7 @@ namespace OpenSim.Region.ScriptEngine.Common.ScriptEngineBase | |||
42 | /// Events are queued and executed in separate thread | 42 | /// Events are queued and executed in separate thread |
43 | /// </summary> | 43 | /// </summary> |
44 | [Serializable] | 44 | [Serializable] |
45 | public class EventQueueManager | 45 | public class EventQueueManager : iScriptEngineFunctionModule |
46 | { | 46 | { |
47 | 47 | ||
48 | // | 48 | // |
@@ -197,13 +197,22 @@ namespace OpenSim.Region.ScriptEngine.Common.ScriptEngineBase | |||
197 | 197 | ||
198 | } | 198 | } |
199 | 199 | ||
200 | private void ReadConfig() | 200 | public void ReadConfig() |
201 | { | 201 | { |
202 | // Refresh config | ||
202 | numberOfThreads = m_ScriptEngine.ScriptConfigSource.GetInt("NumberOfScriptThreads", 2); | 203 | numberOfThreads = m_ScriptEngine.ScriptConfigSource.GetInt("NumberOfScriptThreads", 2); |
203 | maxFunctionExecutionTimems = m_ScriptEngine.ScriptConfigSource.GetInt("MaxEventExecutionTimeMs", 5000); | 204 | maxFunctionExecutionTimems = m_ScriptEngine.ScriptConfigSource.GetInt("MaxEventExecutionTimeMs", 5000); |
204 | EnforceMaxExecutionTime = m_ScriptEngine.ScriptConfigSource.GetBoolean("EnforceMaxEventExecutionTime", false); | 205 | EnforceMaxExecutionTime = m_ScriptEngine.ScriptConfigSource.GetBoolean("EnforceMaxEventExecutionTime", false); |
205 | KillScriptOnMaxFunctionExecutionTime = m_ScriptEngine.ScriptConfigSource.GetBoolean("DeactivateScriptOnTimeout", false); | 206 | KillScriptOnMaxFunctionExecutionTime = m_ScriptEngine.ScriptConfigSource.GetBoolean("DeactivateScriptOnTimeout", false); |
206 | 207 | ||
208 | // Now refresh config in all threads | ||
209 | lock (eventQueueThreadsLock) | ||
210 | { | ||
211 | foreach (EventQueueThreadClass EventQueueThread in eventQueueThreads) | ||
212 | { | ||
213 | EventQueueThread.ReadConfig(); | ||
214 | } | ||
215 | } | ||
207 | } | 216 | } |
208 | 217 | ||
209 | #endregion | 218 | #endregion |
@@ -222,7 +231,7 @@ namespace OpenSim.Region.ScriptEngine.Common.ScriptEngineBase | |||
222 | { | 231 | { |
223 | foreach (EventQueueThreadClass EventQueueThread in eventQueueThreads) | 232 | foreach (EventQueueThreadClass EventQueueThread in eventQueueThreads) |
224 | { | 233 | { |
225 | EventQueueThread.Shutdown(); | 234 | AbortThreadClass(EventQueueThread); |
226 | } | 235 | } |
227 | eventQueueThreads.Clear(); | 236 | eventQueueThreads.Clear(); |
228 | staticGlobalEventQueueThreads.Clear(); | 237 | staticGlobalEventQueueThreads.Clear(); |
@@ -243,7 +252,7 @@ namespace OpenSim.Region.ScriptEngine.Common.ScriptEngineBase | |||
243 | EventQueueThreadClass eqtc = new EventQueueThreadClass(this); | 252 | EventQueueThreadClass eqtc = new EventQueueThreadClass(this); |
244 | eventQueueThreads.Add(eqtc); | 253 | eventQueueThreads.Add(eqtc); |
245 | staticGlobalEventQueueThreads.Add(eqtc); | 254 | staticGlobalEventQueueThreads.Add(eqtc); |
246 | m_ScriptEngine.Log.Debug("DotNetEngine", "Started new script execution thread. Current thread count: " + eventQueueThreads.Count); | 255 | m_ScriptEngine.Log.Debug(m_ScriptEngine.ScriptEngineName, "Started new script execution thread. Current thread count: " + eventQueueThreads.Count); |
247 | 256 | ||
248 | } | 257 | } |
249 | private void AbortThreadClass(EventQueueThreadClass threadClass) | 258 | private void AbortThreadClass(EventQueueThreadClass threadClass) |
@@ -252,16 +261,17 @@ namespace OpenSim.Region.ScriptEngine.Common.ScriptEngineBase | |||
252 | eventQueueThreads.Remove(threadClass); | 261 | eventQueueThreads.Remove(threadClass); |
253 | if (staticGlobalEventQueueThreads.Contains(threadClass)) | 262 | if (staticGlobalEventQueueThreads.Contains(threadClass)) |
254 | staticGlobalEventQueueThreads.Remove(threadClass); | 263 | staticGlobalEventQueueThreads.Remove(threadClass); |
264 | |||
255 | try | 265 | try |
256 | { | 266 | { |
257 | threadClass.Shutdown(); | 267 | threadClass.Stop(); |
258 | } | 268 | } |
259 | catch (Exception ex) | 269 | catch (Exception ex) |
260 | { | 270 | { |
261 | m_ScriptEngine.Log.Error("EventQueueManager", "If you see this, could you please report it to Tedd:"); | 271 | m_ScriptEngine.Log.Error(m_ScriptEngine.ScriptEngineName + ":EventQueueManager", "If you see this, could you please report it to Tedd:"); |
262 | m_ScriptEngine.Log.Error("EventQueueManager", "Script thread execution timeout kill ended in exception: " + ex.ToString()); | 272 | m_ScriptEngine.Log.Error(m_ScriptEngine.ScriptEngineName + ":EventQueueManager", "Script thread execution timeout kill ended in exception: " + ex.ToString()); |
263 | } | 273 | } |
264 | m_ScriptEngine.Log.Debug("DotNetEngine", "Killed script execution thread. Remaining thread count: " + eventQueueThreads.Count); | 274 | m_ScriptEngine.Log.Debug(m_ScriptEngine.ScriptEngineName, "Killed script execution thread. Remaining thread count: " + eventQueueThreads.Count); |
265 | } | 275 | } |
266 | #endregion | 276 | #endregion |
267 | 277 | ||
@@ -313,7 +323,7 @@ namespace OpenSim.Region.ScriptEngine.Common.ScriptEngineBase | |||
313 | public void AddToObjectQueue(uint localID, string FunctionName, Queue_llDetectParams_Struct qParams, params object[] param) | 323 | public void AddToObjectQueue(uint localID, string FunctionName, Queue_llDetectParams_Struct qParams, params object[] param) |
314 | { | 324 | { |
315 | // Determine all scripts in Object and add to their queue | 325 | // Determine all scripts in Object and add to their queue |
316 | //myScriptEngine.m_logger.Verbose("ScriptEngine", "EventQueueManager Adding localID: " + localID + ", FunctionName: " + FunctionName); | 326 | //myScriptEngine.m_logger.Verbose(ScriptEngineName, "EventQueueManager Adding localID: " + localID + ", FunctionName: " + FunctionName); |
317 | 327 | ||
318 | 328 | ||
319 | // Do we have any scripts in this object at all? If not, return | 329 | // Do we have any scripts in this object at all? If not, return |
@@ -367,6 +377,10 @@ namespace OpenSim.Region.ScriptEngine.Common.ScriptEngineBase | |||
367 | /// </summary> | 377 | /// </summary> |
368 | public void AdjustNumberOfScriptThreads() | 378 | public void AdjustNumberOfScriptThreads() |
369 | { | 379 | { |
380 | // Is there anything here for us to do? | ||
381 | if (eventQueueThreads.Count == numberOfThreads) | ||
382 | return; | ||
383 | |||
370 | lock (eventQueueThreadsLock) | 384 | lock (eventQueueThreadsLock) |
371 | { | 385 | { |
372 | int diff = numberOfThreads - eventQueueThreads.Count; | 386 | int diff = numberOfThreads - eventQueueThreads.Count; |
@@ -424,5 +438,15 @@ namespace OpenSim.Region.ScriptEngine.Common.ScriptEngineBase | |||
424 | } | 438 | } |
425 | } | 439 | } |
426 | #endregion | 440 | #endregion |
441 | /// <summary> | ||
442 | /// If set to true then threads and stuff should try to make a graceful exit | ||
443 | /// </summary> | ||
444 | public bool PleaseShutdown | ||
445 | { | ||
446 | get { return _PleaseShutdown; } | ||
447 | set { _PleaseShutdown = value; } | ||
448 | } | ||
449 | private bool _PleaseShutdown = false; | ||
450 | |||
427 | } | 451 | } |
428 | } \ No newline at end of file | 452 | } \ No newline at end of file |