diff options
author | Justin Clark-Casey (justincc) | 2012-07-18 00:14:02 +0100 |
---|---|---|
committer | Justin Clark-Casey (justincc) | 2012-07-18 00:14:02 +0100 |
commit | eb590becf03d94d9afeef471c000c46b044d0c5b (patch) | |
tree | 3a888d62d31c009851977627b7cdc12779b92949 | |
parent | Merge branch 'master' of ssh://opensimulator.org/var/git/opensim (diff) | |
download | opensim-SC-eb590becf03d94d9afeef471c000c46b044d0c5b.zip opensim-SC-eb590becf03d94d9afeef471c000c46b044d0c5b.tar.gz opensim-SC-eb590becf03d94d9afeef471c000c46b044d0c5b.tar.bz2 opensim-SC-eb590becf03d94d9afeef471c000c46b044d0c5b.tar.xz |
Close() the ScenePresence after we've removed it from the scene graph, to cut down race conditions when another thread manages the grab the presence after some SP structures have been reset.
-rw-r--r-- | OpenSim/Region/Framework/Scenes/Scene.cs | 26 |
1 files changed, 16 insertions, 10 deletions
diff --git a/OpenSim/Region/Framework/Scenes/Scene.cs b/OpenSim/Region/Framework/Scenes/Scene.cs index 3e9583c..de2b192 100644 --- a/OpenSim/Region/Framework/Scenes/Scene.cs +++ b/OpenSim/Region/Framework/Scenes/Scene.cs | |||
@@ -3317,24 +3317,30 @@ namespace OpenSim.Region.Framework.Scenes | |||
3317 | if (AgentTransactionsModule != null) | 3317 | if (AgentTransactionsModule != null) |
3318 | AgentTransactionsModule.RemoveAgentAssetTransactions(agentID); | 3318 | AgentTransactionsModule.RemoveAgentAssetTransactions(agentID); |
3319 | 3319 | ||
3320 | avatar.Close(); | ||
3321 | |||
3322 | m_authenticateHandler.RemoveCircuit(avatar.ControllingClient.CircuitCode); | 3320 | m_authenticateHandler.RemoveCircuit(avatar.ControllingClient.CircuitCode); |
3323 | } | 3321 | } |
3324 | catch (Exception e) | 3322 | catch (Exception e) |
3325 | { | 3323 | { |
3326 | m_log.Error( | 3324 | m_log.Error( |
3327 | string.Format("[SCENE]: Exception removing {0} from {1}, ", avatar.Name, RegionInfo.RegionName), e); | 3325 | string.Format("[SCENE]: Exception removing {0} from {1}. Cleaning up. Exception ", avatar.Name, Name), e); |
3328 | } | 3326 | } |
3329 | finally | 3327 | finally |
3330 | { | 3328 | { |
3331 | // Always clean these structures up so that any failure above doesn't cause them to remain in the | 3329 | try |
3332 | // scene with possibly bad effects (e.g. continually timing out on unacked packets and triggering | 3330 | { |
3333 | // the same cleanup exception continually. | 3331 | // Always clean these structures up so that any failure above doesn't cause them to remain in the |
3334 | // TODO: This should probably extend to the whole method, but we don't want to also catch the NRE | 3332 | // scene with possibly bad effects (e.g. continually timing out on unacked packets and triggering |
3335 | // since this would hide the underlying failure and other associated problems. | 3333 | // the same cleanup exception continually. |
3336 | m_sceneGraph.RemoveScenePresence(agentID); | 3334 | m_sceneGraph.RemoveScenePresence(agentID); |
3337 | m_clientManager.Remove(agentID); | 3335 | m_clientManager.Remove(agentID); |
3336 | |||
3337 | avatar.Close(); | ||
3338 | } | ||
3339 | catch (Exception e) | ||
3340 | { | ||
3341 | m_log.Error( | ||
3342 | string.Format("[SCENE]: Exception in final clean up of {0} in {1}. Exception ", avatar.Name, Name), e); | ||
3343 | } | ||
3338 | } | 3344 | } |
3339 | 3345 | ||
3340 | //m_log.InfoFormat("[SCENE] Memory pre GC {0}", System.GC.GetTotalMemory(false)); | 3346 | //m_log.InfoFormat("[SCENE] Memory pre GC {0}", System.GC.GetTotalMemory(false)); |