diff options
author | Justin Clark-Casey (justincc) | 2012-07-27 23:58:53 +0100 |
---|---|---|
committer | Justin Clark-Casey (justincc) | 2012-07-27 23:58:53 +0100 |
commit | 7e89b99e6ad93a313338099f9033adafa26ee426 (patch) | |
tree | 9182af5e8407917eafbe0976a6a877bd221cc84f /OpenSim/Region/Framework | |
parent | making first run more resilient to bad input (loop until good input, rather t... (diff) | |
download | opensim-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.
Diffstat (limited to 'OpenSim/Region/Framework')
-rw-r--r-- | OpenSim/Region/Framework/Scenes/Scene.cs | 8 |
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 | ||