aboutsummaryrefslogtreecommitdiffstatshomepage
diff options
context:
space:
mode:
authorJustin Clark-Casey (justincc)2012-07-27 23:58:53 +0100
committerJustin Clark-Casey (justincc)2012-07-27 23:58:53 +0100
commit7e89b99e6ad93a313338099f9033adafa26ee426 (patch)
tree9182af5e8407917eafbe0976a6a877bd221cc84f
parentmaking first run more resilient to bad input (loop until good input, rather t... (diff)
downloadopensim-SC_OLD-7e89b99e6ad93a313338099f9033adafa26ee426.zip
opensim-SC_OLD-7e89b99e6ad93a313338099f9033adafa26ee426.tar.gz
opensim-SC_OLD-7e89b99e6ad93a313338099f9033adafa26ee426.tar.bz2
opensim-SC_OLD-7e89b99e6ad93a313338099f9033adafa26ee426.tar.xz
Avoid a race condition between the scene shutdown thread and the update thread since commit c150320 (Thu Jul 26 15:27:18 2012)
c150320 started explicitly disposing of the physics scene and nulling it out on region shutdown. However, the update loop may not have yet checked Scene.ShuttingDown, particularly if avatars were not in the scene, causing failure when it tried to lookup time dilation. This commit moves the setting of m_shuttingDown above the existing 500ms pause to notify avatars that they are being kicked. This should not affect the few other places that use this flag.
-rw-r--r--OpenSim/Region/Framework/Scenes/Scene.cs8
1 files changed, 5 insertions, 3 deletions
diff --git a/OpenSim/Region/Framework/Scenes/Scene.cs b/OpenSim/Region/Framework/Scenes/Scene.cs
index 1734704..eb4ba41 100644
--- a/OpenSim/Region/Framework/Scenes/Scene.cs
+++ b/OpenSim/Region/Framework/Scenes/Scene.cs
@@ -1199,15 +1199,17 @@ namespace OpenSim.Region.Framework.Scenes
1199 avatar.ControllingClient.SendShutdownConnectionNotice(); 1199 avatar.ControllingClient.SendShutdownConnectionNotice();
1200 }); 1200 });
1201 1201
1202 // Stop updating the scene objects and agents.
1203 m_shuttingDown = true;
1204
1202 // Wait here, or the kick messages won't actually get to the agents before the scene terminates. 1205 // Wait here, or the kick messages won't actually get to the agents before the scene terminates.
1206 // We also need to wait to avoid a race condition with the scene update loop which might not yet
1207 // have checked ShuttingDown.
1203 Thread.Sleep(500); 1208 Thread.Sleep(500);
1204 1209
1205 // Stop all client threads. 1210 // Stop all client threads.
1206 ForEachScenePresence(delegate(ScenePresence avatar) { avatar.ControllingClient.Close(); }); 1211 ForEachScenePresence(delegate(ScenePresence avatar) { avatar.ControllingClient.Close(); });
1207 1212
1208 // Stop updating the scene objects and agents.
1209 m_shuttingDown = true;
1210
1211 m_log.Debug("[SCENE]: Persisting changed objects"); 1213 m_log.Debug("[SCENE]: Persisting changed objects");
1212 EventManager.TriggerSceneShuttingDown(this); 1214 EventManager.TriggerSceneShuttingDown(this);
1213 1215