aboutsummaryrefslogtreecommitdiffstatshomepage
path: root/OpenSim/Region/Framework/Scenes/SceneObjectGroup.cs
diff options
context:
space:
mode:
authorJustin Clark-Casey (justincc)2014-04-03 00:19:53 +0100
committerJustin Clark-Casey (justincc)2014-04-03 00:19:53 +0100
commite6d0dcd4e80275b96322eb10b31a2b339e4a2d17 (patch)
tree2563e97bad5770551262be0dacdc0dca771777b1 /OpenSim/Region/Framework/Scenes/SceneObjectGroup.cs
parentString matching in REST handlers: must allow '-' as a separator, because the ... (diff)
downloadopensim-SC-e6d0dcd4e80275b96322eb10b31a2b339e4a2d17.zip
opensim-SC-e6d0dcd4e80275b96322eb10b31a2b339e4a2d17.tar.gz
opensim-SC-e6d0dcd4e80275b96322eb10b31a2b339e4a2d17.tar.bz2
opensim-SC-e6d0dcd4e80275b96322eb10b31a2b339e4a2d17.tar.xz
Fix bug where crossing to a neighbouring region and back again would trigger an exception, and a second recross would stop the user moving until relog
Also fixes an issue where sitting avatar counts became inaccurate after any cross. Part of the problem was due to cloning code using MemberwiseClone() but not resetting certain collection structures. Adds regression test for this case. In relation to http://opensimulator.org/mantis/view.php?id=7050
Diffstat (limited to 'OpenSim/Region/Framework/Scenes/SceneObjectGroup.cs')
-rw-r--r--OpenSim/Region/Framework/Scenes/SceneObjectGroup.cs31
1 files changed, 25 insertions, 6 deletions
diff --git a/OpenSim/Region/Framework/Scenes/SceneObjectGroup.cs b/OpenSim/Region/Framework/Scenes/SceneObjectGroup.cs
index b70e9df..4dc724d 100644
--- a/OpenSim/Region/Framework/Scenes/SceneObjectGroup.cs
+++ b/OpenSim/Region/Framework/Scenes/SceneObjectGroup.cs
@@ -552,12 +552,29 @@ namespace OpenSim.Region.Framework.Scenes
552 552
553 av.IsInTransit = true; 553 av.IsInTransit = true;
554 554
555 CrossAgentToNewRegionDelegate d = entityTransfer.CrossAgentToNewRegionAsync; 555 // A temporary measure to allow regression tests to work.
556 d.BeginInvoke(av, val, destination, av.Flying, version, CrossAgentToNewRegionCompleted, d); 556 // Quite possibly, all BeginInvoke() calls should be replaced by Util.FireAndForget
557 // or similar since BeginInvoke() always uses the system threadpool to launch
558 // threads rather than any replace threadpool that we might be using.
559 if (Util.FireAndForgetMethod == FireAndForgetMethod.RegressionTest)
560 {
561 entityTransfer.CrossAgentToNewRegionAsync(av, val, destination, av.Flying, version);
562 CrossAgentToNewRegionCompleted(av);
563 }
564 else
565 {
566 CrossAgentToNewRegionDelegate d = entityTransfer.CrossAgentToNewRegionAsync;
567 d.BeginInvoke(
568 av, val, destination, av.Flying, version,
569 ar => CrossAgentToNewRegionCompleted(d.EndInvoke(ar)), null);
570 }
557 } 571 }
558 else 572 else
573 {
559 m_log.DebugFormat("[SCENE OBJECT]: Crossing avatar alreasy in transit {0} to {1}", av.Name, val); 574 m_log.DebugFormat("[SCENE OBJECT]: Crossing avatar alreasy in transit {0} to {1}", av.Name, val);
575 }
560 } 576 }
577
561 avsToCross.Clear(); 578 avsToCross.Clear();
562 return; 579 return;
563 } 580 }
@@ -630,11 +647,8 @@ namespace OpenSim.Region.Framework.Scenes
630 set { RootPart.Velocity = value; } 647 set { RootPart.Velocity = value; }
631 } 648 }
632 649
633 private void CrossAgentToNewRegionCompleted(IAsyncResult iar) 650 private void CrossAgentToNewRegionCompleted(ScenePresence agent)
634 { 651 {
635 CrossAgentToNewRegionDelegate icon = (CrossAgentToNewRegionDelegate)iar.AsyncState;
636 ScenePresence agent = icon.EndInvoke(iar);
637
638 //// If the cross was successful, this agent is a child agent 652 //// If the cross was successful, this agent is a child agent
639 if (agent.IsChildAgent) 653 if (agent.IsChildAgent)
640 { 654 {
@@ -1698,10 +1712,15 @@ namespace OpenSim.Region.Framework.Scenes
1698 /// <returns></returns> 1712 /// <returns></returns>
1699 public SceneObjectGroup Copy(bool userExposed) 1713 public SceneObjectGroup Copy(bool userExposed)
1700 { 1714 {
1715 // FIXME: This is dangerous since it's easy to forget to reset some references when necessary and end up
1716 // with bugs that only occur in some circumstances (e.g. crossing between regions on the same simulator
1717 // but not between regions on different simulators). Really, all copying should be done explicitly.
1701 SceneObjectGroup dupe = (SceneObjectGroup)MemberwiseClone(); 1718 SceneObjectGroup dupe = (SceneObjectGroup)MemberwiseClone();
1719
1702 dupe.Backup = false; 1720 dupe.Backup = false;
1703 dupe.m_parts = new MapAndArray<OpenMetaverse.UUID, SceneObjectPart>(); 1721 dupe.m_parts = new MapAndArray<OpenMetaverse.UUID, SceneObjectPart>();
1704 dupe.m_sittingAvatars = new List<UUID>(); 1722 dupe.m_sittingAvatars = new List<UUID>();
1723 dupe.m_linkedAvatars = new List<ScenePresence>();
1705 dupe.CopyRootPart(m_rootPart, OwnerID, GroupID, userExposed); 1724 dupe.CopyRootPart(m_rootPart, OwnerID, GroupID, userExposed);
1706 dupe.m_rootPart.LinkNum = m_rootPart.LinkNum; 1725 dupe.m_rootPart.LinkNum = m_rootPart.LinkNum;
1707 1726