diff options
author | Justin Clark-Casey (justincc) | 2012-03-15 00:06:52 +0000 |
---|---|---|
committer | Justin Clark-Casey (justincc) | 2012-03-15 00:06:52 +0000 |
commit | 12cebb12d5b095fc8d1a2936b9537ad0e0e7dbe7 (patch) | |
tree | 2d1b84505fadf96df72eddd5a76e0348fe0579ad /OpenSim/Region/ScriptEngine/XEngine | |
parent | Merge branch 'master' of ssh://opensimulator.org/var/git/opensim (diff) | |
download | opensim-SC_OLD-12cebb12d5b095fc8d1a2936b9537ad0e0e7dbe7.zip opensim-SC_OLD-12cebb12d5b095fc8d1a2936b9537ad0e0e7dbe7.tar.gz opensim-SC_OLD-12cebb12d5b095fc8d1a2936b9537ad0e0e7dbe7.tar.bz2 opensim-SC_OLD-12cebb12d5b095fc8d1a2936b9537ad0e0e7dbe7.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 'OpenSim/Region/ScriptEngine/XEngine')
-rw-r--r-- | OpenSim/Region/ScriptEngine/XEngine/XEngine.cs | 6 |
1 files changed, 5 insertions, 1 deletions
diff --git a/OpenSim/Region/ScriptEngine/XEngine/XEngine.cs b/OpenSim/Region/ScriptEngine/XEngine/XEngine.cs index ab41873..44397b7 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) |