diff options
author | Tom Grimshaw | 2010-05-18 03:24:43 -0700 |
---|---|---|
committer | Tom Grimshaw | 2010-05-18 03:24:43 -0700 |
commit | 1c040d8c1ed5ee1ba1e80aa1d248a9b06d1790a5 (patch) | |
tree | c85d36357a2ae9f7a81d8e81b23039b5bdf06d08 /OpenSim/Region | |
parent | Missed a nullref in the previous commit (diff) | |
download | opensim-SC_OLD-1c040d8c1ed5ee1ba1e80aa1d248a9b06d1790a5.zip opensim-SC_OLD-1c040d8c1ed5ee1ba1e80aa1d248a9b06d1790a5.tar.gz opensim-SC_OLD-1c040d8c1ed5ee1ba1e80aa1d248a9b06d1790a5.tar.bz2 opensim-SC_OLD-1c040d8c1ed5ee1ba1e80aa1d248a9b06d1790a5.tar.xz |
Fix to the scenario where we send an agent to a neighbouring sim (via teleport), then tell our neighbours to close the agents.. thereby disconnecting the user. Added a new CloseChildAgent method in lieu of CloseAgent. This has been a long standing problem - with any luck this will cure it.
Diffstat (limited to 'OpenSim/Region')
5 files changed, 59 insertions, 6 deletions
diff --git a/OpenSim/Region/CoreModules/ServiceConnectorsOut/Simulation/LocalSimulationConnector.cs b/OpenSim/Region/CoreModules/ServiceConnectorsOut/Simulation/LocalSimulationConnector.cs index e32dbb3..329a259 100644 --- a/OpenSim/Region/CoreModules/ServiceConnectorsOut/Simulation/LocalSimulationConnector.cs +++ b/OpenSim/Region/CoreModules/ServiceConnectorsOut/Simulation/LocalSimulationConnector.cs | |||
@@ -290,6 +290,23 @@ namespace OpenSim.Region.CoreModules.ServiceConnectorsOut.Simulation | |||
290 | return false; | 290 | return false; |
291 | } | 291 | } |
292 | 292 | ||
293 | public bool CloseChildAgent(GridRegion destination, UUID id) | ||
294 | { | ||
295 | if (destination == null) | ||
296 | return false; | ||
297 | |||
298 | foreach (Scene s in m_sceneList) | ||
299 | { | ||
300 | if (s.RegionInfo.RegionID == destination.RegionID) | ||
301 | { | ||
302 | //m_log.Debug("[LOCAL COMMS]: Found region to SendCloseAgent"); | ||
303 | return s.IncomingCloseChildAgent(id); | ||
304 | } | ||
305 | } | ||
306 | //m_log.Debug("[LOCAL COMMS]: region not found in SendCloseAgent"); | ||
307 | return false; | ||
308 | } | ||
309 | |||
293 | /** | 310 | /** |
294 | * Object-related communications | 311 | * Object-related communications |
295 | */ | 312 | */ |
diff --git a/OpenSim/Region/CoreModules/ServiceConnectorsOut/Simulation/RemoteSimulationConnector.cs b/OpenSim/Region/CoreModules/ServiceConnectorsOut/Simulation/RemoteSimulationConnector.cs index 9e8454f..377c868 100644 --- a/OpenSim/Region/CoreModules/ServiceConnectorsOut/Simulation/RemoteSimulationConnector.cs +++ b/OpenSim/Region/CoreModules/ServiceConnectorsOut/Simulation/RemoteSimulationConnector.cs | |||
@@ -253,6 +253,21 @@ namespace OpenSim.Region.CoreModules.ServiceConnectorsOut.Simulation | |||
253 | return false; | 253 | return false; |
254 | } | 254 | } |
255 | 255 | ||
256 | public bool CloseChildAgent(GridRegion destination, UUID id) | ||
257 | { | ||
258 | if (destination == null) | ||
259 | return false; | ||
260 | |||
261 | // Try local first | ||
262 | if (m_localBackend.CloseChildAgent(destination, id)) | ||
263 | return true; | ||
264 | |||
265 | // else do the remote thing | ||
266 | if (!m_localBackend.IsLocalRegion(destination.RegionHandle)) | ||
267 | return m_remoteConnector.CloseChildAgent(destination, id); | ||
268 | |||
269 | return false; | ||
270 | } | ||
256 | 271 | ||
257 | public bool CloseAgent(GridRegion destination, UUID id) | 272 | public bool CloseAgent(GridRegion destination, UUID id) |
258 | { | 273 | { |
diff --git a/OpenSim/Region/Framework/Interfaces/IInterregionComms.cs b/OpenSim/Region/Framework/Interfaces/IInterregionComms.cs index 2d6287f..67a500f 100644 --- a/OpenSim/Region/Framework/Interfaces/IInterregionComms.cs +++ b/OpenSim/Region/Framework/Interfaces/IInterregionComms.cs | |||
@@ -68,6 +68,14 @@ namespace OpenSim.Region.Framework.Interfaces | |||
68 | bool SendReleaseAgent(ulong regionHandle, UUID id, string uri); | 68 | bool SendReleaseAgent(ulong regionHandle, UUID id, string uri); |
69 | 69 | ||
70 | /// <summary> | 70 | /// <summary> |
71 | /// Close chid agent. | ||
72 | /// </summary> | ||
73 | /// <param name="regionHandle"></param> | ||
74 | /// <param name="id"></param> | ||
75 | /// <returns></returns> | ||
76 | bool SendCloseChildAgent(ulong regionHandle, UUID id); | ||
77 | |||
78 | /// <summary> | ||
71 | /// Close agent. | 79 | /// Close agent. |
72 | /// </summary> | 80 | /// </summary> |
73 | /// <param name="regionHandle"></param> | 81 | /// <param name="regionHandle"></param> |
diff --git a/OpenSim/Region/Framework/Scenes/Scene.cs b/OpenSim/Region/Framework/Scenes/Scene.cs index 1b08c50..f331984 100644 --- a/OpenSim/Region/Framework/Scenes/Scene.cs +++ b/OpenSim/Region/Framework/Scenes/Scene.cs | |||
@@ -3914,12 +3914,22 @@ namespace OpenSim.Region.Framework.Scenes | |||
3914 | return false; | 3914 | return false; |
3915 | } | 3915 | } |
3916 | 3916 | ||
3917 | public bool IncomingCloseAgent(UUID agentID) | ||
3918 | { | ||
3919 | return IncomingCloseAgent(agentID, false); | ||
3920 | } | ||
3921 | |||
3922 | public bool IncomingCloseChildAgent(UUID agentID) | ||
3923 | { | ||
3924 | return IncomingCloseAgent(agentID, true); | ||
3925 | } | ||
3926 | |||
3917 | /// <summary> | 3927 | /// <summary> |
3918 | /// Tell a single agent to disconnect from the region. | 3928 | /// Tell a single agent to disconnect from the region. |
3919 | /// </summary> | 3929 | /// </summary> |
3920 | /// <param name="regionHandle"></param> | ||
3921 | /// <param name="agentID"></param> | 3930 | /// <param name="agentID"></param> |
3922 | public bool IncomingCloseAgent(UUID agentID) | 3931 | /// <param name="childOnly"></param> |
3932 | public bool IncomingCloseAgent(UUID agentID, bool childOnly) | ||
3923 | { | 3933 | { |
3924 | //m_log.DebugFormat("[SCENE]: Processing incoming close agent for {0}", agentID); | 3934 | //m_log.DebugFormat("[SCENE]: Processing incoming close agent for {0}", agentID); |
3925 | 3935 | ||
@@ -3931,7 +3941,7 @@ namespace OpenSim.Region.Framework.Scenes | |||
3931 | { | 3941 | { |
3932 | m_sceneGraph.removeUserCount(false); | 3942 | m_sceneGraph.removeUserCount(false); |
3933 | } | 3943 | } |
3934 | else | 3944 | else if (!childOnly) |
3935 | { | 3945 | { |
3936 | m_sceneGraph.removeUserCount(true); | 3946 | m_sceneGraph.removeUserCount(true); |
3937 | } | 3947 | } |
@@ -3947,9 +3957,12 @@ namespace OpenSim.Region.Framework.Scenes | |||
3947 | } | 3957 | } |
3948 | else | 3958 | else |
3949 | presence.ControllingClient.SendShutdownConnectionNotice(); | 3959 | presence.ControllingClient.SendShutdownConnectionNotice(); |
3960 | presence.ControllingClient.Close(); | ||
3961 | } | ||
3962 | else if (!childOnly) | ||
3963 | { | ||
3964 | presence.ControllingClient.Close(); | ||
3950 | } | 3965 | } |
3951 | |||
3952 | presence.ControllingClient.Close(); | ||
3953 | return true; | 3966 | return true; |
3954 | } | 3967 | } |
3955 | 3968 | ||
diff --git a/OpenSim/Region/Framework/Scenes/SceneCommunicationService.cs b/OpenSim/Region/Framework/Scenes/SceneCommunicationService.cs index 9d0e6f4..6309cd9 100644 --- a/OpenSim/Region/Framework/Scenes/SceneCommunicationService.cs +++ b/OpenSim/Region/Framework/Scenes/SceneCommunicationService.cs | |||
@@ -281,7 +281,7 @@ namespace OpenSim.Region.Framework.Scenes | |||
281 | uint x = 0, y = 0; | 281 | uint x = 0, y = 0; |
282 | Utils.LongToUInts(regionHandle, out x, out y); | 282 | Utils.LongToUInts(regionHandle, out x, out y); |
283 | GridRegion destination = m_scene.GridService.GetRegionByPosition(UUID.Zero, (int)x, (int)y); | 283 | GridRegion destination = m_scene.GridService.GetRegionByPosition(UUID.Zero, (int)x, (int)y); |
284 | m_scene.SimulationService.CloseAgent(destination, agentID); | 284 | m_scene.SimulationService.CloseChildAgent(destination, agentID); |
285 | } | 285 | } |
286 | 286 | ||
287 | private void SendCloseChildAgentCompleted(IAsyncResult iar) | 287 | private void SendCloseChildAgentCompleted(IAsyncResult iar) |