diff options
author | Justin Clark-Casey (justincc) | 2012-12-13 21:02:55 +0000 |
---|---|---|
committer | Justin Clark-Casey (justincc) | 2012-12-13 23:21:25 +0000 |
commit | 523213060b315c677bf3142b5d2925460a49c9ed (patch) | |
tree | 4802e764c3c7789d22a50bd51a157930505c81b3 | |
parent | Fix formatting (diff) | |
download | opensim-SC-523213060b315c677bf3142b5d2925460a49c9ed.zip opensim-SC-523213060b315c677bf3142b5d2925460a49c9ed.tar.gz opensim-SC-523213060b315c677bf3142b5d2925460a49c9ed.tar.bz2 opensim-SC-523213060b315c677bf3142b5d2925460a49c9ed.tar.xz |
Add WaitForEventCompletionOnScriptStop [XEngine] config param to OpenSimDefaults.ini to allow change of the wait time for an event to complete on script removal before aborting its thread
Default is 1000, as has previously been the case.
This parameter exists for further debug work concerning mono 2.10 crashes that may be related to locks not being removed on Thread.Abort
-rw-r--r-- | OpenSim/Region/ScriptEngine/XEngine/XEngine.cs | 34 | ||||
-rw-r--r-- | bin/OpenSimDefaults.ini | 4 |
2 files changed, 28 insertions, 10 deletions
diff --git a/OpenSim/Region/ScriptEngine/XEngine/XEngine.cs b/OpenSim/Region/ScriptEngine/XEngine/XEngine.cs index 828f2fb..1dd50c7 100644 --- a/OpenSim/Region/ScriptEngine/XEngine/XEngine.cs +++ b/OpenSim/Region/ScriptEngine/XEngine/XEngine.cs | |||
@@ -107,6 +107,24 @@ namespace OpenSim.Region.ScriptEngine.XEngine | |||
107 | private IXmlRpcRouter m_XmlRpcRouter; | 107 | private IXmlRpcRouter m_XmlRpcRouter; |
108 | private int m_EventLimit; | 108 | private int m_EventLimit; |
109 | private bool m_KillTimedOutScripts; | 109 | private bool m_KillTimedOutScripts; |
110 | |||
111 | /// <summary> | ||
112 | /// Number of milliseconds we will wait for a script event to complete on script stop before we forcibly abort | ||
113 | /// its thread. | ||
114 | /// </summary> | ||
115 | /// <remarks> | ||
116 | /// It appears that if a script thread is aborted whilst it is holding ReaderWriterLockSlim (possibly the write | ||
117 | /// lock) then the lock is not properly released. This causes mono 2.6, 2.10 and possibly | ||
118 | /// later to crash, sometimes with symptoms such as a leap to 100% script usage and a vm thead dump showing | ||
119 | /// all threads waiting on release of ReaderWriterLockSlim write thread which none of the threads listed | ||
120 | /// actually hold. | ||
121 | /// | ||
122 | /// Pausing for event completion reduces the risk of this happening. However, it may be that aborting threads | ||
123 | /// is not a mono issue per se but rather a risky activity in itself in an AppDomain that is not immediately | ||
124 | /// shutting down. | ||
125 | /// </remarks> | ||
126 | private int m_WaitForEventCompletionOnScriptStop = 1000; | ||
127 | |||
110 | private string m_ScriptEnginesPath = null; | 128 | private string m_ScriptEnginesPath = null; |
111 | 129 | ||
112 | private ExpiringCache<UUID, bool> m_runFlags = new ExpiringCache<UUID, bool>(); | 130 | private ExpiringCache<UUID, bool> m_runFlags = new ExpiringCache<UUID, bool>(); |
@@ -249,6 +267,9 @@ namespace OpenSim.Region.ScriptEngine.XEngine | |||
249 | m_EventLimit = m_ScriptConfig.GetInt("EventLimit", 30); | 267 | m_EventLimit = m_ScriptConfig.GetInt("EventLimit", 30); |
250 | m_KillTimedOutScripts = m_ScriptConfig.GetBoolean("KillTimedOutScripts", false); | 268 | m_KillTimedOutScripts = m_ScriptConfig.GetBoolean("KillTimedOutScripts", false); |
251 | m_SaveTime = m_ScriptConfig.GetInt("SaveInterval", 120) * 1000; | 269 | m_SaveTime = m_ScriptConfig.GetInt("SaveInterval", 120) * 1000; |
270 | m_WaitForEventCompletionOnScriptStop | ||
271 | = m_ScriptConfig.GetInt("WaitForEventCompletionOnScriptStop", m_WaitForEventCompletionOnScriptStop); | ||
272 | |||
252 | m_ScriptEnginesPath = m_ScriptConfig.GetString("ScriptEnginesPath", "ScriptEngines"); | 273 | m_ScriptEnginesPath = m_ScriptConfig.GetString("ScriptEnginesPath", "ScriptEngines"); |
253 | 274 | ||
254 | m_Prio = ThreadPriority.BelowNormal; | 275 | m_Prio = ThreadPriority.BelowNormal; |
@@ -1335,9 +1356,7 @@ namespace OpenSim.Region.ScriptEngine.XEngine | |||
1335 | 1356 | ||
1336 | instance.ClearQueue(); | 1357 | instance.ClearQueue(); |
1337 | 1358 | ||
1338 | // Give the script some time to finish processing its last event. Simply aborting the script thread can | 1359 | instance.Stop(m_WaitForEventCompletionOnScriptStop); |
1339 | // cause issues on mono 2.6, 2.10 and possibly later where locks are not released properly on abort. | ||
1340 | instance.Stop(1000); | ||
1341 | 1360 | ||
1342 | // bool objectRemoved = false; | 1361 | // bool objectRemoved = false; |
1343 | 1362 | ||
@@ -1687,16 +1706,11 @@ namespace OpenSim.Region.ScriptEngine.XEngine | |||
1687 | public void StopScript(UUID itemID) | 1706 | public void StopScript(UUID itemID) |
1688 | { | 1707 | { |
1689 | IScriptInstance instance = GetInstance(itemID); | 1708 | IScriptInstance instance = GetInstance(itemID); |
1709 | |||
1690 | if (instance != null) | 1710 | if (instance != null) |
1691 | { | 1711 | instance.Stop(m_WaitForEventCompletionOnScriptStop); |
1692 | // Give the script some time to finish processing its last event. Simply aborting the script thread can | ||
1693 | // cause issues on mono 2.6, 2.10 and possibly later where locks are not released properly on abort. | ||
1694 | instance.Stop(1000); | ||
1695 | } | ||
1696 | else | 1712 | else |
1697 | { | ||
1698 | m_runFlags.AddOrUpdate(itemID, false, 240); | 1713 | m_runFlags.AddOrUpdate(itemID, false, 240); |
1699 | } | ||
1700 | } | 1714 | } |
1701 | 1715 | ||
1702 | public DetectParams GetDetectParams(UUID itemID, int idx) | 1716 | public DetectParams GetDetectParams(UUID itemID, int idx) |
diff --git a/bin/OpenSimDefaults.ini b/bin/OpenSimDefaults.ini index e9bdabc..284adfe 100644 --- a/bin/OpenSimDefaults.ini +++ b/bin/OpenSimDefaults.ini | |||
@@ -1368,6 +1368,10 @@ | |||
1368 | ; If a script overruns it's event limit, kill the script? | 1368 | ; If a script overruns it's event limit, kill the script? |
1369 | KillTimedOutScripts = false | 1369 | KillTimedOutScripts = false |
1370 | 1370 | ||
1371 | ; Amount of time in milliseconds we will wait for an event to completely normally when a script stop is requested | ||
1372 | ; before aborting the thread (such as when an object containing scripts is taken into inventory). | ||
1373 | WaitForEventCompletionOnScriptStop = 1000; | ||
1374 | |||
1371 | ; Sets the multiplier for the scripting delays | 1375 | ; Sets the multiplier for the scripting delays |
1372 | ScriptDelayFactor = 1.0 | 1376 | ScriptDelayFactor = 1.0 |
1373 | 1377 | ||