aboutsummaryrefslogtreecommitdiffstatshomepage
diff options
context:
space:
mode:
-rw-r--r--OpenSim/Region/ScriptEngine/XEngine/XEngine.cs34
-rw-r--r--bin/OpenSimDefaults.ini4
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