aboutsummaryrefslogtreecommitdiffstatshomepage
diff options
context:
space:
mode:
-rw-r--r--OpenSim/Region/CoreModules/Framework/EntityTransfer/EntityTransferModule.cs2
-rw-r--r--OpenSim/Region/Framework/Scenes/Scene.cs19
-rw-r--r--OpenSim/Region/Framework/Scenes/SceneCommunicationService.cs2
-rw-r--r--OpenSim/Region/Framework/Scenes/ScenePresence.cs134
-rw-r--r--OpenSim/Region/Framework/Scenes/Tests/ScenePresenceAgentTests.cs11
5 files changed, 79 insertions, 89 deletions
diff --git a/OpenSim/Region/CoreModules/Framework/EntityTransfer/EntityTransferModule.cs b/OpenSim/Region/CoreModules/Framework/EntityTransfer/EntityTransferModule.cs
index 9306ace..7263b51 100644
--- a/OpenSim/Region/CoreModules/Framework/EntityTransfer/EntityTransferModule.cs
+++ b/OpenSim/Region/CoreModules/Framework/EntityTransfer/EntityTransferModule.cs
@@ -352,7 +352,7 @@ namespace OpenSim.Region.CoreModules.Framework.EntityTransfer
352 352
353 // the avatar.Close below will clear the child region list. We need this below for (possibly) 353 // the avatar.Close below will clear the child region list. We need this below for (possibly)
354 // closing the child agents, so save it here (we need a copy as it is Clear()-ed). 354 // closing the child agents, so save it here (we need a copy as it is Clear()-ed).
355 //List<ulong> childRegions = new List<ulong>(avatar.GetKnownRegionList()); 355 //List<ulong> childRegions = avatar.KnownRegionHandles;
356 // Compared to ScenePresence.CrossToNewRegion(), there's no obvious code to handle a teleport 356 // Compared to ScenePresence.CrossToNewRegion(), there's no obvious code to handle a teleport
357 // failure at this point (unlike a border crossing failure). So perhaps this can never fail 357 // failure at this point (unlike a border crossing failure). So perhaps this can never fail
358 // once we reach here... 358 // once we reach here...
diff --git a/OpenSim/Region/Framework/Scenes/Scene.cs b/OpenSim/Region/Framework/Scenes/Scene.cs
index cd4b14d..a432b6f 100644
--- a/OpenSim/Region/Framework/Scenes/Scene.cs
+++ b/OpenSim/Region/Framework/Scenes/Scene.cs
@@ -1135,9 +1135,8 @@ namespace OpenSim.Region.Framework.Scenes
1135 1135
1136 // Kick all ROOT agents with the message, 'The simulator is going down' 1136 // Kick all ROOT agents with the message, 'The simulator is going down'
1137 ForEachScenePresence(delegate(ScenePresence avatar) 1137 ForEachScenePresence(delegate(ScenePresence avatar)
1138 { 1138 {
1139 if (avatar.KnownChildRegionHandles.Contains(RegionInfo.RegionHandle)) 1139 avatar.RemoveNeighbourRegion(RegionInfo.RegionHandle);
1140 avatar.KnownChildRegionHandles.Remove(RegionInfo.RegionHandle);
1141 1140
1142 if (!avatar.IsChildAgent) 1141 if (!avatar.IsChildAgent)
1143 avatar.ControllingClient.Kick("The simulator is going down."); 1142 avatar.ControllingClient.Kick("The simulator is going down.");
@@ -3225,14 +3224,8 @@ namespace OpenSim.Region.Framework.Scenes
3225 avatar.Scene.NeedSceneCacheClear(avatar.UUID); 3224 avatar.Scene.NeedSceneCacheClear(avatar.UUID);
3226 3225
3227 if (closeChildAgents && !avatar.IsChildAgent) 3226 if (closeChildAgents && !avatar.IsChildAgent)
3228 { 3227 {
3229 //List<ulong> childknownRegions = new List<ulong>(); 3228 List<ulong> regions = avatar.KnownRegionHandles;
3230 //List<ulong> ckn = avatar.KnownChildRegionHandles;
3231 //for (int i = 0; i < ckn.Count; i++)
3232 //{
3233 // childknownRegions.Add(ckn[i]);
3234 //}
3235 List<ulong> regions = new List<ulong>(avatar.KnownChildRegionHandles);
3236 regions.Remove(RegionInfo.RegionHandle); 3229 regions.Remove(RegionInfo.RegionHandle);
3237 m_sceneGridService.SendCloseChildAgentConnections(agentID, regions); 3230 m_sceneGridService.SendCloseChildAgentConnections(agentID, regions);
3238 } 3231 }
@@ -3313,7 +3306,7 @@ namespace OpenSim.Region.Framework.Scenes
3313 { 3306 {
3314 for (int i = 0; i < regionslst.Count; i++) 3307 for (int i = 0; i < regionslst.Count; i++)
3315 { 3308 {
3316 av.KnownChildRegionHandles.Remove(regionslst[i]); 3309 av.RemoveNeighbourRegion(regionslst[i]);
3317 } 3310 }
3318 } 3311 }
3319 } 3312 }
@@ -3827,7 +3820,7 @@ namespace OpenSim.Region.Framework.Scenes
3827 3820
3828 if (RegionSecret == loggingOffUser.ControllingClient.SecureSessionId || (parsedsecret && RegionSecret == localRegionSecret)) 3821 if (RegionSecret == loggingOffUser.ControllingClient.SecureSessionId || (parsedsecret && RegionSecret == localRegionSecret))
3829 { 3822 {
3830 m_sceneGridService.SendCloseChildAgentConnections(loggingOffUser.UUID, new List<ulong>(loggingOffUser.KnownRegions.Keys)); 3823 m_sceneGridService.SendCloseChildAgentConnections(loggingOffUser.UUID, loggingOffUser.KnownRegionHandles);
3831 loggingOffUser.ControllingClient.Kick(message); 3824 loggingOffUser.ControllingClient.Kick(message);
3832 // Give them a second to receive the message! 3825 // Give them a second to receive the message!
3833 Thread.Sleep(1000); 3826 Thread.Sleep(1000);
diff --git a/OpenSim/Region/Framework/Scenes/SceneCommunicationService.cs b/OpenSim/Region/Framework/Scenes/SceneCommunicationService.cs
index 19cb0c1..fe9fe31 100644
--- a/OpenSim/Region/Framework/Scenes/SceneCommunicationService.cs
+++ b/OpenSim/Region/Framework/Scenes/SceneCommunicationService.cs
@@ -225,7 +225,7 @@ namespace OpenSim.Region.Framework.Scenes
225 { 225 {
226 uint x = 0, y = 0; 226 uint x = 0, y = 0;
227 List<string> simulatorList = new List<string>(); 227 List<string> simulatorList = new List<string>();
228 foreach (ulong regionHandle in presence.KnownChildRegionHandles) 228 foreach (ulong regionHandle in presence.KnownRegionHandles)
229 { 229 {
230 if (regionHandle != m_regionInfo.RegionHandle) 230 if (regionHandle != m_regionInfo.RegionHandle)
231 { 231 {
diff --git a/OpenSim/Region/Framework/Scenes/ScenePresence.cs b/OpenSim/Region/Framework/Scenes/ScenePresence.cs
index 925a4f3..9e04aa1 100644
--- a/OpenSim/Region/Framework/Scenes/ScenePresence.cs
+++ b/OpenSim/Region/Framework/Scenes/ScenePresence.cs
@@ -243,11 +243,6 @@ namespace OpenSim.Region.Framework.Scenes
243 } 243 }
244 } 244 }
245 245
246
247 // neighbouring regions we have enabled a child agent in
248 // holds the seed cap for the child agent in that region
249 private Dictionary<ulong, string> m_knownChildRegions = new Dictionary<ulong, string>();
250
251 /// <summary> 246 /// <summary>
252 /// Copy of the script states while the agent is in transit. This state may 247 /// Copy of the script states while the agent is in transit. This state may
253 /// need to be placed back in case of transfer fail. 248 /// need to be placed back in case of transfer fail.
@@ -699,29 +694,6 @@ namespace OpenSim.Region.Framework.Scenes
699 set { m_health = value; } 694 set { m_health = value; }
700 } 695 }
701 696
702 /// <summary>
703 /// These are the region handles known by the avatar.
704 /// </summary>
705 public List<ulong> KnownChildRegionHandles
706 {
707 get
708 {
709 if (m_knownChildRegions.Count == 0)
710 return new List<ulong>();
711 else
712 return new List<ulong>(m_knownChildRegions.Keys);
713 }
714 }
715
716 public Dictionary<ulong, string> KnownRegions
717 {
718 get { return m_knownChildRegions; }
719 set
720 {
721 m_knownChildRegions = value;
722 }
723 }
724
725 private ISceneViewer m_sceneViewer; 697 private ISceneViewer m_sceneViewer;
726 698
727 public ISceneViewer SceneViewer 699 public ISceneViewer SceneViewer
@@ -1253,7 +1225,11 @@ namespace OpenSim.Region.Framework.Scenes
1253 public void StopFlying() 1225 public void StopFlying()
1254 { 1226 {
1255 ControllingClient.StopFlying(this); 1227 ControllingClient.StopFlying(this);
1256 } 1228 }
1229
1230 // neighbouring regions we have enabled a child agent in
1231 // holds the seed cap for the child agent in that region
1232 private Dictionary<ulong, string> m_knownChildRegions = new Dictionary<ulong, string>();
1257 1233
1258 public void AddNeighbourRegion(ulong regionHandle, string cap) 1234 public void AddNeighbourRegion(ulong regionHandle, string cap)
1259 { 1235 {
@@ -1269,14 +1245,14 @@ namespace OpenSim.Region.Framework.Scenes
1269 } 1245 }
1270 1246
1271 public void RemoveNeighbourRegion(ulong regionHandle) 1247 public void RemoveNeighbourRegion(ulong regionHandle)
1272 { 1248 {
1273 lock (m_knownChildRegions) 1249 lock (m_knownChildRegions)
1274 { 1250 {
1275 if (m_knownChildRegions.ContainsKey(regionHandle)) 1251 // Checking ContainsKey is redundant as Remove works either way and returns a bool
1276 { 1252 // This is here to allow the Debug output to be conditional on removal
1277 m_knownChildRegions.Remove(regionHandle); 1253 //if (m_knownChildRegions.ContainsKey(regionHandle))
1278 //m_log.Debug(" !!! removing known region {0} in {1}. Count = {2}", regionHandle, Scene.RegionInfo.RegionName, m_knownChildRegions.Count); 1254 // m_log.DebugFormat(" !!! removing known region {0} in {1}. Count = {2}", regionHandle, Scene.RegionInfo.RegionName, m_knownChildRegions.Count);
1279 } 1255 m_knownChildRegions.Remove(regionHandle);
1280 } 1256 }
1281 } 1257 }
1282 1258
@@ -1287,11 +1263,39 @@ namespace OpenSim.Region.Framework.Scenes
1287 RemoveNeighbourRegion(handle); 1263 RemoveNeighbourRegion(handle);
1288 Scene.CapsModule.DropChildSeed(UUID, handle); 1264 Scene.CapsModule.DropChildSeed(UUID, handle);
1289 } 1265 }
1290 } 1266 }
1291 1267
1292 public List<ulong> GetKnownRegionList() 1268 public Dictionary<ulong, string> KnownRegions
1293 { 1269 {
1294 return new List<ulong>(m_knownChildRegions.Keys); 1270 get
1271 {
1272 lock (m_knownChildRegions)
1273 return new Dictionary<ulong, string>(m_knownChildRegions);
1274 }
1275 set
1276 {
1277 // Replacing the reference is atomic but we still need to lock on
1278 // the original dictionary object which may be in use elsewhere
1279 lock (m_knownChildRegions)
1280 m_knownChildRegions = value;
1281 }
1282 }
1283
1284 public List<ulong> KnownRegionHandles
1285 {
1286 get
1287 {
1288 return new List<ulong>(KnownRegions.Keys);
1289 }
1290 }
1291
1292 public int KnownRegionCount
1293 {
1294 get
1295 {
1296 lock (m_knownChildRegions)
1297 return m_knownChildRegions.Count;
1298 }
1295 } 1299 }
1296 1300
1297 #endregion 1301 #endregion
@@ -3082,7 +3086,7 @@ namespace OpenSim.Region.Framework.Scenes
3082 3086
3083 // Throttles 3087 // Throttles
3084 float multiplier = 1; 3088 float multiplier = 1;
3085 int childRegions = m_knownChildRegions.Count; 3089 int childRegions = KnownRegionCount;
3086 if (childRegions != 0) 3090 if (childRegions != 0)
3087 multiplier = 1f / childRegions; 3091 multiplier = 1f / childRegions;
3088 3092
@@ -3334,30 +3338,28 @@ namespace OpenSim.Region.Framework.Scenes
3334 /// <returns></returns> 3338 /// <returns></returns>
3335 public void CloseChildAgents(uint newRegionX, uint newRegionY) 3339 public void CloseChildAgents(uint newRegionX, uint newRegionY)
3336 { 3340 {
3337 List<ulong> byebyeRegions = new List<ulong>(); 3341 List<ulong> byebyeRegions = new List<ulong>();
3342 List<ulong> knownRegions = KnownRegionHandles;
3338 m_log.DebugFormat( 3343 m_log.DebugFormat(
3339 "[SCENE PRESENCE]: Closing child agents. Checking {0} regions in {1}", 3344 "[SCENE PRESENCE]: Closing child agents. Checking {0} regions in {1}",
3340 m_knownChildRegions.Keys.Count, Scene.RegionInfo.RegionName); 3345 knownRegions.Count, Scene.RegionInfo.RegionName);
3341 //DumpKnownRegions(); 3346 //DumpKnownRegions();
3342 3347
3343 lock (m_knownChildRegions) 3348 foreach (ulong handle in knownRegions)
3344 { 3349 {
3345 foreach (ulong handle in m_knownChildRegions.Keys) 3350 // Don't close the agent on this region yet
3351 if (handle != Scene.RegionInfo.RegionHandle)
3346 { 3352 {
3347 // Don't close the agent on this region yet 3353 uint x, y;
3348 if (handle != Scene.RegionInfo.RegionHandle) 3354 Utils.LongToUInts(handle, out x, out y);
3355 x = x / Constants.RegionSize;
3356 y = y / Constants.RegionSize;
3357
3358 //m_log.Debug("---> x: " + x + "; newx:" + newRegionX + "; Abs:" + (int)Math.Abs((int)(x - newRegionX)));
3359 //m_log.Debug("---> y: " + y + "; newy:" + newRegionY + "; Abs:" + (int)Math.Abs((int)(y - newRegionY)));
3360 if (Util.IsOutsideView(DrawDistance, x, newRegionX, y, newRegionY))
3349 { 3361 {
3350 uint x, y; 3362 byebyeRegions.Add(handle);
3351 Utils.LongToUInts(handle, out x, out y);
3352 x = x / Constants.RegionSize;
3353 y = y / Constants.RegionSize;
3354
3355 //m_log.Debug("---> x: " + x + "; newx:" + newRegionX + "; Abs:" + (int)Math.Abs((int)(x - newRegionX)));
3356 //m_log.Debug("---> y: " + y + "; newy:" + newRegionY + "; Abs:" + (int)Math.Abs((int)(y - newRegionY)));
3357 if (Util.IsOutsideView(DrawDistance, x, newRegionX, y, newRegionY))
3358 {
3359 byebyeRegions.Add(handle);
3360 }
3361 } 3363 }
3362 } 3364 }
3363 } 3365 }
@@ -3475,7 +3477,7 @@ namespace OpenSim.Region.Framework.Scenes
3475 3477
3476 // Throttles 3478 // Throttles
3477 float multiplier = 1; 3479 float multiplier = 1;
3478 int childRegions = m_knownChildRegions.Count; 3480 int childRegions = KnownRegionCount;
3479 if (childRegions != 0) 3481 if (childRegions != 0)
3480 multiplier = 1f / childRegions; 3482 multiplier = 1f / childRegions;
3481 3483
@@ -3939,12 +3941,10 @@ namespace OpenSim.Region.Framework.Scenes
3939 public void Close() 3941 public void Close()
3940 { 3942 {
3941 if (!IsChildAgent) 3943 if (!IsChildAgent)
3942 m_scene.AttachmentsModule.DeleteAttachmentsFromScene(this, false); 3944 m_scene.AttachmentsModule.DeleteAttachmentsFromScene(this, false);
3943 3945
3944 lock (m_knownChildRegions) 3946 // Clear known regions
3945 { 3947 KnownRegions = new Dictionary<ulong, string>();
3946 m_knownChildRegions.Clear();
3947 }
3948 3948
3949 lock (m_reprioritization_timer) 3949 lock (m_reprioritization_timer)
3950 { 3950 {
diff --git a/OpenSim/Region/Framework/Scenes/Tests/ScenePresenceAgentTests.cs b/OpenSim/Region/Framework/Scenes/Tests/ScenePresenceAgentTests.cs
index ce9d418..119eb1f 100644
--- a/OpenSim/Region/Framework/Scenes/Tests/ScenePresenceAgentTests.cs
+++ b/OpenSim/Region/Framework/Scenes/Tests/ScenePresenceAgentTests.cs
@@ -215,11 +215,9 @@ namespace OpenSim.Region.Framework.Scenes.Tests
215 string cap = presence.ControllingClient.RequestClientInfo().CapsPath; 215 string cap = presence.ControllingClient.RequestClientInfo().CapsPath;
216 216
217 presence.AddNeighbourRegion(region2, cap); 217 presence.AddNeighbourRegion(region2, cap);
218 presence.AddNeighbourRegion(region3, cap); 218 presence.AddNeighbourRegion(region3, cap);
219 219
220 List<ulong> neighbours = presence.GetKnownRegionList(); 220 Assert.That(presence.KnownRegionCount, Is.EqualTo(2));
221
222 Assert.That(neighbours.Count, Is.EqualTo(2));
223 } 221 }
224 222
225 [Test] 223 [Test]
@@ -230,8 +228,7 @@ namespace OpenSim.Region.Framework.Scenes.Tests
230 ScenePresence presence = scene.GetScenePresence(agent1); 228 ScenePresence presence = scene.GetScenePresence(agent1);
231 presence.RemoveNeighbourRegion(region3); 229 presence.RemoveNeighbourRegion(region3);
232 230
233 List<ulong> neighbours = presence.GetKnownRegionList(); 231 Assert.That(presence.KnownRegionCount,Is.EqualTo(1));
234 Assert.That(neighbours.Count,Is.EqualTo(1));
235 /* 232 /*
236 presence.MakeChildAgent; 233 presence.MakeChildAgent;
237 presence.MakeRootAgent; 234 presence.MakeRootAgent;