aboutsummaryrefslogtreecommitdiffstatshomepage
path: root/OpenSim/Region/ScriptEngine/XEngine/XEngine.cs
diff options
context:
space:
mode:
authorJustin Clark-Casey (justincc)2012-03-15 00:06:52 +0000
committerJustin Clark-Casey (justincc)2012-03-19 21:29:24 +0000
commit9ecbcb787c426aa0093355609651ead7eb14b4f1 (patch)
tree112e410d7576becae22cbc1bc38b85a8ffe9d27b /OpenSim/Region/ScriptEngine/XEngine/XEngine.cs
parentrefactor: rename ScriptInstance.m_CurrentResult to m_CurrentWorkItem to make ... (diff)
downloadopensim-SC_OLD-9ecbcb787c426aa0093355609651ead7eb14b4f1.zip
opensim-SC_OLD-9ecbcb787c426aa0093355609651ead7eb14b4f1.tar.gz
opensim-SC_OLD-9ecbcb787c426aa0093355609651ead7eb14b4f1.tar.bz2
opensim-SC_OLD-9ecbcb787c426aa0093355609651ead7eb14b4f1.tar.xz
Alleviate an issue where calling Thread.Abort() on script WorkItems can fail to release locks, resulting in a crippled simulator.
This seems to be a particular problem with ReaderWriterLockSlim, though other locks can be affected as well. It has been seen to happen when llDie() is called in a linkset running more than one script. Alleviation here means supplying a ScriptInstance.Stop() timeout of 1000ms rather than 0ms, to give events a chance to complete. Also, we check the IsRunning status at the top of the ScriptInstance.EventProcessor() so that another event doesn't start in the mean time. Ultimately, a better solution may have to be found since a long-running event would still exceed the timeout and be aborted.
Diffstat (limited to '')
-rw-r--r--OpenSim/Region/ScriptEngine/XEngine/XEngine.cs6
1 files changed, 5 insertions, 1 deletions
diff --git a/OpenSim/Region/ScriptEngine/XEngine/XEngine.cs b/OpenSim/Region/ScriptEngine/XEngine/XEngine.cs
index 1a9131e..5095037 100644
--- a/OpenSim/Region/ScriptEngine/XEngine/XEngine.cs
+++ b/OpenSim/Region/ScriptEngine/XEngine/XEngine.cs
@@ -1118,7 +1118,11 @@ namespace OpenSim.Region.ScriptEngine.XEngine
1118 } 1118 }
1119 1119
1120 instance.ClearQueue(); 1120 instance.ClearQueue();
1121 instance.Stop(0); 1121
1122 // Give the script some time to finish processing its last event. Simply aborting the script thread can
1123 // cause issues on mono 2.6, 2.10 and possibly later where locks are not released properly on abort.
1124 instance.Stop(1000);
1125
1122// bool objectRemoved = false; 1126// bool objectRemoved = false;
1123 1127
1124 lock (m_PrimObjects) 1128 lock (m_PrimObjects)