refactor: rename Scene.IncomingCloseAgent() to CloseAgent() in order to make it clear that all non-clientstack callers should be using this rather than RemoveClient() in order to step through the ScenePresence state machine properly.
Adds IScene.CloseAgent() to replace RemoveClient()0.7.6-extended
							parent
							
								
									753cc93af5
								
							
						
					
					
						commit
						e6c0267def
					
				|  | @ -86,7 +86,7 @@ namespace OpenSim.Framework | |||
|         event restart OnRestart; | ||||
| 
 | ||||
|         /// <summary> | ||||
|         /// Add a new client and create a presence for it.  All clients except initial login clients will starts off as a child agent | ||||
|         /// Add a new agent.  All agents except initial login clients will starts off as a child agent | ||||
|         /// - the later agent crossing will promote it to a root agent. | ||||
|         /// </summary> | ||||
|         /// <param name="client"></param> | ||||
|  | @ -96,14 +96,16 @@ namespace OpenSim.Framework | |||
|         ISceneAgent AddNewClient(IClientAPI client, PresenceType type); | ||||
| 
 | ||||
|         /// <summary> | ||||
|         /// Remove the given client from the scene. | ||||
|         /// Tell a single agent to disconnect from the region. | ||||
|         /// </summary> | ||||
|         /// <param name="agentID"></param> | ||||
|         /// <param name="closeChildAgents">Close the neighbour child agents associated with this client.</param> | ||||
|         void RemoveClient(UUID agentID, bool closeChildAgents); | ||||
|         /// <param name="force"> | ||||
|         /// Force the agent to close even if it might be in the middle of some other operation.  You do not want to | ||||
|         /// force unless you are absolutely sure that the agent is dead and a normal close is not working. | ||||
|         /// </param> | ||||
|         bool CloseAgent(UUID agentID, bool force); | ||||
| 
 | ||||
|         void Restart(); | ||||
|         //RegionInfo OtherRegionUp(RegionInfo thisRegion); | ||||
| 
 | ||||
|         string GetSimulatorVersion(); | ||||
| 
 | ||||
|  |  | |||
|  | @ -452,7 +452,7 @@ namespace OpenSim | |||
|                     else | ||||
|                         presence.ControllingClient.Kick("\nThe OpenSim manager kicked you out.\n"); | ||||
| 
 | ||||
|                     presence.Scene.IncomingCloseAgent(presence.UUID, force); | ||||
|                     presence.Scene.CloseAgent(presence.UUID, force); | ||||
|                     break; | ||||
|                 } | ||||
|             } | ||||
|  |  | |||
|  | @ -96,7 +96,7 @@ namespace OpenSim.Region.ClientStack.Linden.Tests | |||
|             UUID spId = TestHelpers.ParseTail(0x1); | ||||
| 
 | ||||
|             SceneHelpers.AddScenePresence(m_scene, spId); | ||||
|             m_scene.IncomingCloseAgent(spId, false); | ||||
|             m_scene.CloseAgent(spId, false); | ||||
| 
 | ||||
|             // TODO: Add more assertions for the other aspects of event queues | ||||
|             Assert.That(MainServer.Instance.GetPollServiceHandlerKeys().Count, Is.EqualTo(0)); | ||||
|  |  | |||
|  | @ -1893,7 +1893,7 @@ namespace OpenSim.Region.ClientStack.LindenUDP | |||
|                      client.Kick("Simulator logged you out due to connection timeout."); | ||||
|             } | ||||
| 
 | ||||
|             m_scene.IncomingCloseAgent(client.AgentId, true); | ||||
|             m_scene.CloseAgent(client.AgentId, true); | ||||
|         } | ||||
| 
 | ||||
|         private void IncomingPacketHandler() | ||||
|  | @ -2234,7 +2234,7 @@ namespace OpenSim.Region.ClientStack.LindenUDP | |||
|             if (!client.IsLoggingOut) | ||||
|             { | ||||
|                 client.IsLoggingOut = true; | ||||
|                 m_scene.IncomingCloseAgent(client.AgentId, false); | ||||
|                 m_scene.CloseAgent(client.AgentId, false); | ||||
|             } | ||||
|         } | ||||
|     } | ||||
|  |  | |||
|  | @ -60,9 +60,9 @@ namespace OpenSim.Region.ClientStack.LindenUDP.Tests | |||
|             return null; | ||||
|         } | ||||
| 
 | ||||
|         public override void RemoveClient(UUID agentID, bool someReason) {} | ||||
| //        public override void CloseAllAgents(uint circuitcode) {} | ||||
|         public override bool CloseAgent(UUID agentID, bool force) { return true; } | ||||
|         public override bool CheckClient(UUID clientId, IPEndPoint endPoint) { return true; } | ||||
| 
 | ||||
|         public override void OtherRegionUp(GridRegion otherRegion) {  } | ||||
| 
 | ||||
|         public override bool TryGetScenePresence(UUID uuid, out ScenePresence sp) { sp = null; return false; } | ||||
|  |  | |||
|  | @ -719,7 +719,7 @@ namespace OpenSim.Region.CoreModules.Avatar.Attachments.Tests | |||
|             SceneObjectGroup rezzedAtt = presence.GetAttachments()[0]; | ||||
| 
 | ||||
|             m_numberOfAttachEventsFired = 0; | ||||
|             scene.IncomingCloseAgent(presence.UUID, false); | ||||
|             scene.CloseAgent(presence.UUID, false); | ||||
| 
 | ||||
|             // Check that we can't retrieve this attachment from the scene. | ||||
|             Assert.That(scene.GetSceneObjectGroup(rezzedAtt.UUID), Is.Null); | ||||
|  |  | |||
|  | @ -272,7 +272,7 @@ namespace OpenSim.Region.CoreModules.Avatar.Gods | |||
|             if (sp.IsChildAgent) | ||||
|                 return; | ||||
|             sp.ControllingClient.Kick(reason); | ||||
|             sp.Scene.IncomingCloseAgent(sp.UUID, true);  | ||||
|             sp.Scene.CloseAgent(sp.UUID, true);  | ||||
|         } | ||||
| 
 | ||||
|         private void OnIncomingInstantMessage(GridInstantMessage msg) | ||||
|  |  | |||
|  | @ -972,7 +972,7 @@ namespace OpenSim.Region.CoreModules.Framework.EntityTransfer | |||
| 
 | ||||
|             if (NeedsClosing(sp.DrawDistance, oldRegionX, newRegionX, oldRegionY, newRegionY, reg)) | ||||
|             { | ||||
|                 if (!sp.Scene.IncomingPreCloseAgent(sp)) | ||||
|                 if (!sp.Scene.IncomingPreCloseClient(sp)) | ||||
|                     return; | ||||
| 
 | ||||
|                 // We need to delay here because Imprudence viewers, unlike v1 or v3, have a short (<200ms, <500ms) delay before | ||||
|  | @ -983,7 +983,7 @@ namespace OpenSim.Region.CoreModules.Framework.EntityTransfer | |||
|                 // an agent cannot teleport back to this region if it has teleported away. | ||||
|                 Thread.Sleep(2000); | ||||
| 
 | ||||
|                 sp.Scene.IncomingCloseAgent(sp.UUID, false); | ||||
|                 sp.Scene.CloseAgent(sp.UUID, false); | ||||
|             } | ||||
|             else | ||||
|             { | ||||
|  | @ -1137,7 +1137,7 @@ namespace OpenSim.Region.CoreModules.Framework.EntityTransfer | |||
|             // Finally, let's close this previously-known-as-root agent, when the jump is outside the view zone | ||||
|             if (NeedsClosing(sp.DrawDistance, oldRegionX, newRegionX, oldRegionY, newRegionY, reg)) | ||||
|             { | ||||
|                 if (!sp.Scene.IncomingPreCloseAgent(sp)) | ||||
|                 if (!sp.Scene.IncomingPreCloseClient(sp)) | ||||
|                     return; | ||||
| 
 | ||||
|                 // RED ALERT!!!! | ||||
|  | @ -1154,7 +1154,7 @@ namespace OpenSim.Region.CoreModules.Framework.EntityTransfer | |||
|                 m_log.DebugFormat( | ||||
|                     "[ENTITY TRANSFER MODULE]: Closing agent {0} in {1} after teleport", sp.Name, Scene.Name); | ||||
| 
 | ||||
|                 sp.Scene.IncomingCloseAgent(sp.UUID, false); | ||||
|                 sp.Scene.CloseAgent(sp.UUID, false); | ||||
|             } | ||||
|             else | ||||
|             { | ||||
|  |  | |||
|  | @ -311,7 +311,7 @@ namespace OpenSim.Region.CoreModules.ServiceConnectorsOut.Simulation | |||
| //                        "[LOCAL SIMULATION CONNECTOR]: Found region {0} {1} to send AgentUpdate", | ||||
| //                        s.RegionInfo.RegionName, destination.RegionHandle); | ||||
| 
 | ||||
|                 m_scenes[destination.RegionID].IncomingCloseAgent(id, false, auth_token); | ||||
|                 m_scenes[destination.RegionID].CloseAgent(id, false, auth_token); | ||||
|                 return true; | ||||
|             } | ||||
| 
 | ||||
|  |  | |||
|  | @ -562,7 +562,7 @@ namespace OpenSim.Region.CoreModules.World.Estate | |||
|                                 if (!Scene.TeleportClientHome(user, s.ControllingClient)) | ||||
|                                 { | ||||
|                                     s.ControllingClient.Kick("Your access to the region was revoked and TP home failed - you have been logged out."); | ||||
|                                     Scene.IncomingCloseAgent(s.UUID, false); | ||||
|                                     Scene.CloseAgent(s.UUID, false); | ||||
|                                 } | ||||
|                             } | ||||
|                         } | ||||
|  | @ -797,7 +797,7 @@ namespace OpenSim.Region.CoreModules.World.Estate | |||
|                     if (!Scene.TeleportClientHome(prey, s.ControllingClient)) | ||||
|                     { | ||||
|                         s.ControllingClient.Kick("You were teleported home by the region owner, but the TP failed - you have been logged out."); | ||||
|                         Scene.IncomingCloseAgent(s.UUID, false); | ||||
|                         Scene.CloseAgent(s.UUID, false); | ||||
|                     } | ||||
|                 } | ||||
|             } | ||||
|  | @ -820,7 +820,7 @@ namespace OpenSim.Region.CoreModules.World.Estate | |||
|                         if (!Scene.TeleportClientHome(p.UUID, p.ControllingClient)) | ||||
|                         { | ||||
|                             p.ControllingClient.Kick("You were teleported home by the region owner, but the TP failed - you have been logged out."); | ||||
|                             Scene.IncomingCloseAgent(p.UUID, false); | ||||
|                             Scene.CloseAgent(p.UUID, false); | ||||
|                         } | ||||
|                     } | ||||
|                 } | ||||
|  |  | |||
|  | @ -1313,7 +1313,7 @@ namespace OpenSim.Region.Framework.Scenes | |||
|             Thread.Sleep(500); | ||||
| 
 | ||||
|             // Stop all client threads. | ||||
|             ForEachScenePresence(delegate(ScenePresence avatar) { IncomingCloseAgent(avatar.UUID, false); }); | ||||
|             ForEachScenePresence(delegate(ScenePresence avatar) { CloseAgent(avatar.UUID, false); }); | ||||
| 
 | ||||
|             m_log.Debug("[SCENE]: Persisting changed objects"); | ||||
|             EventManager.TriggerSceneShuttingDown(this); | ||||
|  | @ -2976,7 +2976,7 @@ namespace OpenSim.Region.Framework.Scenes | |||
|                         { | ||||
|                             PresenceService.LogoutAgent(sp.ControllingClient.SessionId); | ||||
| 
 | ||||
|                             IncomingCloseAgent(sp.UUID, false); | ||||
|                             CloseAgent(sp.UUID, false); | ||||
|                         } | ||||
|                         else | ||||
|                         { | ||||
|  | @ -3398,7 +3398,7 @@ namespace OpenSim.Region.Framework.Scenes | |||
|         /// <param name='closeChildAgents'> | ||||
|         /// Close the neighbour child agents associated with this client. | ||||
|         /// </param> | ||||
|         public override void RemoveClient(UUID agentID, bool closeChildAgents) | ||||
|         public void RemoveClient(UUID agentID, bool closeChildAgents) | ||||
|         { | ||||
|             AgentCircuitData acd = m_authenticateHandler.GetAgentCircuitData(agentID); | ||||
| 
 | ||||
|  | @ -3783,7 +3783,7 @@ namespace OpenSim.Region.Framework.Scenes | |||
|                             sp.Name, sp.UUID, RegionInfo.RegionName); | ||||
| 
 | ||||
|                         if (sp.ControllingClient != null) | ||||
|                             IncomingCloseAgent(sp.UUID, true); | ||||
|                             CloseAgent(sp.UUID, true); | ||||
| 
 | ||||
|                         sp = null; | ||||
|                     } | ||||
|  | @ -4424,7 +4424,7 @@ namespace OpenSim.Region.Framework.Scenes | |||
|         /// <param name="force"></param> | ||||
|         /// <param name="auth_token"></param> | ||||
|         /// <returns></returns> | ||||
|         public bool IncomingCloseAgent(UUID agentID, bool force, string auth_token) | ||||
|         public bool CloseAgent(UUID agentID, bool force, string auth_token) | ||||
|         { | ||||
|             //m_log.DebugFormat("[SCENE]: Processing incoming close agent {0} in region {1} with auth_token {2}", agentID, RegionInfo.RegionName, auth_token); | ||||
| 
 | ||||
|  | @ -4442,7 +4442,7 @@ namespace OpenSim.Region.Framework.Scenes | |||
| 
 | ||||
|             if (acd.SessionID.ToString() == auth_token) | ||||
|             { | ||||
|                 return IncomingCloseAgent(agentID, force); | ||||
|                 return CloseAgent(agentID, force); | ||||
|             } | ||||
|             else | ||||
|             { | ||||
|  | @ -4455,16 +4455,16 @@ namespace OpenSim.Region.Framework.Scenes | |||
|         } | ||||
| 
 | ||||
|         /// <summary> | ||||
|         /// Tell a single agent to prepare to close. | ||||
|         /// Tell a single client to prepare to close. | ||||
|         /// </summary> | ||||
|         /// <remarks> | ||||
|         /// This should only be called if we may close the agent but there will be some delay in so doing.  Meant for | ||||
|         /// internal use - other callers should almost certainly called IncomingCloseAgent(). | ||||
|         /// This should only be called if we may close the client but there will be some delay in so doing.  Meant for | ||||
|         /// internal use - other callers should almost certainly called CloseClient(). | ||||
|         /// </remarks> | ||||
|         /// <param name="sp"></param> | ||||
|         /// <returns>true if pre-close state notification was successful.  false if the agent | ||||
|         /// was not in a state where it could transition to pre-close.</returns> | ||||
|         public bool IncomingPreCloseAgent(ScenePresence sp) | ||||
|         public bool IncomingPreCloseClient(ScenePresence sp) | ||||
|         { | ||||
|             lock (m_removeClientLock) | ||||
|             { | ||||
|  | @ -4506,7 +4506,7 @@ namespace OpenSim.Region.Framework.Scenes | |||
|         /// Force the agent to close even if it might be in the middle of some other operation.  You do not want to | ||||
|         /// force unless you are absolutely sure that the agent is dead and a normal close is not working. | ||||
|         /// </param> | ||||
|         public bool IncomingCloseAgent(UUID agentID, bool force) | ||||
|         public override bool CloseAgent(UUID agentID, bool force) | ||||
|         { | ||||
|             ScenePresence sp; | ||||
| 
 | ||||
|  | @ -4517,7 +4517,7 @@ namespace OpenSim.Region.Framework.Scenes | |||
|                 if (sp == null) | ||||
|                 { | ||||
|                     m_log.DebugFormat( | ||||
|                         "[SCENE]: Called IncomingCloseAgent() with agent ID {0} but no such presence is in {1}",  | ||||
|                         "[SCENE]: Called CloseClient() with agent ID {0} but no such presence is in {1}",  | ||||
|                         agentID, Name); | ||||
|      | ||||
|                     return false; | ||||
|  | @ -4526,7 +4526,7 @@ namespace OpenSim.Region.Framework.Scenes | |||
|                 if (sp.LifecycleState != ScenePresenceState.Running && sp.LifecycleState != ScenePresenceState.PreRemove) | ||||
|                 { | ||||
|                     m_log.DebugFormat( | ||||
|                         "[SCENE]: Called IncomingCloseAgent() for {0} in {1} but presence is already in state {2}", | ||||
|                         "[SCENE]: Called CloseClient() for {0} in {1} but presence is already in state {2}", | ||||
|                         sp.Name, Name, sp.LifecycleState); | ||||
| 
 | ||||
|                     return false; | ||||
|  |  | |||
|  | @ -218,19 +218,7 @@ namespace OpenSim.Region.Framework.Scenes | |||
| 
 | ||||
|         public abstract ISceneAgent AddNewClient(IClientAPI client, PresenceType type); | ||||
| 
 | ||||
|         /// <summary> | ||||
|         /// Remove the given client from the scene.  | ||||
|         /// </summary> | ||||
|         /// <remarks> | ||||
|         /// Only clientstack code should call this directly.  All other code should call IncomingCloseAgent() instead | ||||
|         /// to properly operate the state machine and avoid race conditions with other close requests (such as directly | ||||
|         /// from viewers). | ||||
|         /// </remarks> | ||||
|         /// <param name='agentID'>ID of agent to close</param> | ||||
|         /// <param name='closeChildAgents'> | ||||
|         /// Close the neighbour child agents associated with this client. | ||||
|         /// </param> | ||||
|         public abstract void RemoveClient(UUID agentID, bool closeChildAgents); | ||||
|         public abstract bool CloseAgent(UUID agentID, bool force); | ||||
| 
 | ||||
|         public bool TryGetScenePresence(UUID agentID, out object scenePresence) | ||||
|         { | ||||
|  |  | |||
|  | @ -146,7 +146,7 @@ namespace OpenSim.Region.Framework.Scenes.Tests | |||
|         } | ||||
| 
 | ||||
|         [Test] | ||||
|         public void TestCloseAgent() | ||||
|         public void TestCloseClient() | ||||
|         { | ||||
|             TestHelpers.InMethod(); | ||||
| //            TestHelpers.EnableLogging(); | ||||
|  | @ -154,7 +154,7 @@ namespace OpenSim.Region.Framework.Scenes.Tests | |||
|             TestScene scene = new SceneHelpers().SetupScene(); | ||||
|             ScenePresence sp = SceneHelpers.AddScenePresence(scene, TestHelpers.ParseTail(0x1)); | ||||
| 
 | ||||
|             scene.IncomingCloseAgent(sp.UUID, false); | ||||
|             scene.CloseAgent(sp.UUID, false); | ||||
| 
 | ||||
|             Assert.That(scene.GetScenePresence(sp.UUID), Is.Null); | ||||
|             Assert.That(scene.AuthenticateHandler.GetAgentCircuitData(sp.UUID), Is.Null); | ||||
|  |  | |||
|  | @ -79,7 +79,7 @@ namespace OpenSim.Region.Framework.Scenes.Tests | |||
| 
 | ||||
|             // TODO: Need to add tests for other ICapabiltiesModule methods. | ||||
| 
 | ||||
|             scene.IncomingCloseAgent(sp.UUID, false); | ||||
|             scene.CloseAgent(sp.UUID, false); | ||||
|             Assert.That(capsMod.GetCapsForUser(spUuid), Is.Null); | ||||
| 
 | ||||
|             // TODO: Need to add tests for other ICapabiltiesModule methods. | ||||
|  |  | |||
|  | @ -384,7 +384,7 @@ namespace OpenSim.Region.OptionalModules.World.NPC | |||
|                             agentID, av.Name); | ||||
|                     */ | ||||
| 
 | ||||
|                     scene.IncomingCloseAgent(agentID, false); | ||||
|                     scene.CloseAgent(agentID, false); | ||||
| 
 | ||||
|                     m_avatars.Remove(agentID); | ||||
| 
 | ||||
|  |  | |||
|  | @ -2964,7 +2964,7 @@ namespace OpenSim.Region.ScriptEngine.Shared.Api | |||
|                         sp.ControllingClient.Kick(alert); | ||||
| 
 | ||||
|                     // ...and close on our side | ||||
|                     sp.Scene.IncomingCloseAgent(sp.UUID, false); | ||||
|                     sp.Scene.CloseAgent(sp.UUID, false); | ||||
|                 } | ||||
|             }); | ||||
|         } | ||||
|  |  | |||
		Loading…
	
		Reference in New Issue
	
	 Justin Clark-Casey (justincc)
						Justin Clark-Casey (justincc)