diff options
author | Justin Clarke Casey | 2008-03-13 00:22:38 +0000 |
---|---|---|
committer | Justin Clarke Casey | 2008-03-13 00:22:38 +0000 |
commit | a4304fb9e6ec94b9a2aa70db85a68b9b102d4c33 (patch) | |
tree | 0b98401a00ff68bebdf2f7de385386e6a5060fff /OpenSim | |
parent | * Updated LibSL _packets_.cs to latest revision. AKA New Packets. (diff) | |
download | opensim-SC-a4304fb9e6ec94b9a2aa70db85a68b9b102d4c33.zip opensim-SC-a4304fb9e6ec94b9a2aa70db85a68b9b102d4c33.tar.gz opensim-SC-a4304fb9e6ec94b9a2aa70db85a68b9b102d4c33.tar.bz2 opensim-SC-a4304fb9e6ec94b9a2aa70db85a68b9b102d4c33.tar.xz |
* Fix Mantis 761 (linking and delinking prims rapidly caused prims to 'disappear')
* Root cause was that if two updates occurred in the same second of time, the second one was never sent
* Linking/delinking appears to be okay now
Diffstat (limited to 'OpenSim')
-rw-r--r-- | OpenSim/Region/Environment/Scenes/InnerScene.cs | 6 | ||||
-rw-r--r-- | OpenSim/Region/Environment/Scenes/Scene.cs | 2 | ||||
-rw-r--r-- | OpenSim/Region/Environment/Scenes/SceneObjectGroup.cs | 14 | ||||
-rw-r--r-- | OpenSim/Region/Environment/Scenes/SceneObjectPart.cs | 22 | ||||
-rw-r--r-- | OpenSim/Region/Environment/Scenes/ScenePresence.cs | 30 |
5 files changed, 55 insertions, 19 deletions
diff --git a/OpenSim/Region/Environment/Scenes/InnerScene.cs b/OpenSim/Region/Environment/Scenes/InnerScene.cs index e195c92..0272a7e 100644 --- a/OpenSim/Region/Environment/Scenes/InnerScene.cs +++ b/OpenSim/Region/Environment/Scenes/InnerScene.cs | |||
@@ -206,6 +206,12 @@ namespace OpenSim.Region.Environment.Scenes | |||
206 | } | 206 | } |
207 | } | 207 | } |
208 | 208 | ||
209 | /// <summary> | ||
210 | /// Add an entity to the list of prims to process on the next update | ||
211 | /// </summary> | ||
212 | /// <param name="obj"> | ||
213 | /// A <see cref="EntityBase"/> | ||
214 | /// </param> | ||
209 | internal void AddToUpdateList(EntityBase obj) | 215 | internal void AddToUpdateList(EntityBase obj) |
210 | { | 216 | { |
211 | lock (m_updateList) | 217 | lock (m_updateList) |
diff --git a/OpenSim/Region/Environment/Scenes/Scene.cs b/OpenSim/Region/Environment/Scenes/Scene.cs index 1a73e78..7ea528c 100644 --- a/OpenSim/Region/Environment/Scenes/Scene.cs +++ b/OpenSim/Region/Environment/Scenes/Scene.cs | |||
@@ -614,7 +614,7 @@ namespace OpenSim.Region.Environment.Scenes | |||
614 | } | 614 | } |
615 | 615 | ||
616 | /// <summary> | 616 | /// <summary> |
617 | /// | 617 | /// Start the timer which triggers regular scene updates |
618 | /// </summary> | 618 | /// </summary> |
619 | public void StartTimer() | 619 | public void StartTimer() |
620 | { | 620 | { |
diff --git a/OpenSim/Region/Environment/Scenes/SceneObjectGroup.cs b/OpenSim/Region/Environment/Scenes/SceneObjectGroup.cs index 1a32460..50dc2ae 100644 --- a/OpenSim/Region/Environment/Scenes/SceneObjectGroup.cs +++ b/OpenSim/Region/Environment/Scenes/SceneObjectGroup.cs | |||
@@ -247,9 +247,11 @@ namespace OpenSim.Region.Environment.Scenes | |||
247 | public SceneObjectGroup(Scene scene, ulong regionHandle, SceneObjectPart part) | 247 | public SceneObjectGroup(Scene scene, ulong regionHandle, SceneObjectPart part) |
248 | { | 248 | { |
249 | m_scene = scene; | 249 | m_scene = scene; |
250 | |||
250 | part.SetParent(this); | 251 | part.SetParent(this); |
251 | part.ParentID = 0; | 252 | part.ParentID = 0; |
252 | part.LinkNum = 0; | 253 | part.LinkNum = 0; |
254 | |||
253 | m_parts.Add(part.UUID, part); | 255 | m_parts.Add(part.UUID, part); |
254 | 256 | ||
255 | SetPartAsRoot(part); | 257 | SetPartAsRoot(part); |
@@ -691,7 +693,7 @@ namespace OpenSim.Region.Environment.Scenes | |||
691 | #region Scheduling | 693 | #region Scheduling |
692 | 694 | ||
693 | /// <summary> | 695 | /// <summary> |
694 | /// | 696 | /// Examine this object's parts to see if they've changed sufficiently to warrant an update |
695 | /// </summary> | 697 | /// </summary> |
696 | public override void Update() | 698 | public override void Update() |
697 | { | 699 | { |
@@ -703,6 +705,7 @@ namespace OpenSim.Region.Environment.Scenes | |||
703 | } | 705 | } |
704 | lastPhysGroupPos = AbsolutePosition; | 706 | lastPhysGroupPos = AbsolutePosition; |
705 | } | 707 | } |
708 | |||
706 | if ((Math.Abs(lastPhysGroupRot.W - GroupRotation.W) > 0.1) | 709 | if ((Math.Abs(lastPhysGroupRot.W - GroupRotation.W) > 0.1) |
707 | || (Math.Abs(lastPhysGroupRot.X - GroupRotation.X) > 0.1) | 710 | || (Math.Abs(lastPhysGroupRot.X - GroupRotation.X) > 0.1) |
708 | || (Math.Abs(lastPhysGroupRot.Y - GroupRotation.Y) > 0.1) | 711 | || (Math.Abs(lastPhysGroupRot.Y - GroupRotation.Y) > 0.1) |
@@ -714,6 +717,7 @@ namespace OpenSim.Region.Environment.Scenes | |||
714 | } | 717 | } |
715 | lastPhysGroupRot = GroupRotation; | 718 | lastPhysGroupRot = GroupRotation; |
716 | } | 719 | } |
720 | |||
717 | foreach (SceneObjectPart part in m_parts.Values) | 721 | foreach (SceneObjectPart part in m_parts.Values) |
718 | { | 722 | { |
719 | part.SendScheduledUpdates(); | 723 | part.SendScheduledUpdates(); |
@@ -737,7 +741,7 @@ namespace OpenSim.Region.Environment.Scenes | |||
737 | } | 741 | } |
738 | 742 | ||
739 | /// <summary> | 743 | /// <summary> |
740 | /// | 744 | /// Schedule a full update for every part in this object |
741 | /// </summary> | 745 | /// </summary> |
742 | public void ScheduleGroupForFullUpdate() | 746 | public void ScheduleGroupForFullUpdate() |
743 | { | 747 | { |
@@ -910,6 +914,7 @@ namespace OpenSim.Region.Environment.Scenes | |||
910 | linkPart.RotationOffset = new LLQuaternion(newRot.x, newRot.y, newRot.z, newRot.w); | 914 | linkPart.RotationOffset = new LLQuaternion(newRot.x, newRot.y, newRot.z, newRot.w); |
911 | 915 | ||
912 | linkPart.ParentID = m_rootPart.LocalId; | 916 | linkPart.ParentID = m_rootPart.LocalId; |
917 | |||
913 | linkPart.LinkNum = m_parts.Count; | 918 | linkPart.LinkNum = m_parts.Count; |
914 | 919 | ||
915 | m_parts.Add(linkPart.UUID, linkPart); | 920 | m_parts.Add(linkPart.UUID, linkPart); |
@@ -1015,7 +1020,7 @@ namespace OpenSim.Region.Environment.Scenes | |||
1015 | //m_rootPart.DoPhysicsPropertyUpdate(m_rootPart.PhysActor.IsPhysical, true); | 1020 | //m_rootPart.DoPhysicsPropertyUpdate(m_rootPart.PhysActor.IsPhysical, true); |
1016 | //} | 1021 | //} |
1017 | 1022 | ||
1018 | SceneObjectGroup objectGroup = new SceneObjectGroup(m_scene, m_regionHandle, linkPart); | 1023 | SceneObjectGroup objectGroup = new SceneObjectGroup(m_scene, m_regionHandle, linkPart); |
1019 | 1024 | ||
1020 | m_scene.AddEntity(objectGroup); | 1025 | m_scene.AddEntity(objectGroup); |
1021 | 1026 | ||
@@ -1715,6 +1720,9 @@ namespace OpenSim.Region.Environment.Scenes | |||
1715 | m_scene.EventManager.TriggerGroupGrab(UUID, offsetPos, remoteClient.AgentId); | 1720 | m_scene.EventManager.TriggerGroupGrab(UUID, offsetPos, remoteClient.AgentId); |
1716 | } | 1721 | } |
1717 | 1722 | ||
1723 | /// <summary> | ||
1724 | /// Completely delete this group and tell all the scene presences about that deletion. | ||
1725 | /// </summary> | ||
1718 | public void DeleteGroup() | 1726 | public void DeleteGroup() |
1719 | { | 1727 | { |
1720 | DetachFromBackup(this); | 1728 | DetachFromBackup(this); |
diff --git a/OpenSim/Region/Environment/Scenes/SceneObjectPart.cs b/OpenSim/Region/Environment/Scenes/SceneObjectPart.cs index f20a638..b708d04 100644 --- a/OpenSim/Region/Environment/Scenes/SceneObjectPart.cs +++ b/OpenSim/Region/Environment/Scenes/SceneObjectPart.cs | |||
@@ -132,7 +132,12 @@ namespace OpenSim.Region.Environment.Scenes | |||
132 | [XmlIgnore] public uint TimeStampLastActivity = 0; // Will be used for AutoReturn | 132 | [XmlIgnore] public uint TimeStampLastActivity = 0; // Will be used for AutoReturn |
133 | 133 | ||
134 | /// <summary> | 134 | /// <summary> |
135 | /// Only used internally to schedule client updates | 135 | /// Only used internally to schedule client updates. |
136 | /// 0 - no update is scheduled | ||
137 | /// 1 - terse update scheduled | ||
138 | /// 2 - full update scheduled | ||
139 | /// | ||
140 | /// TODO - This should be an enumeration | ||
136 | /// </summary> | 141 | /// </summary> |
137 | private byte m_updateFlag; | 142 | private byte m_updateFlag; |
138 | 143 | ||
@@ -1090,7 +1095,7 @@ namespace OpenSim.Region.Environment.Scenes | |||
1090 | #region Update Scheduling | 1095 | #region Update Scheduling |
1091 | 1096 | ||
1092 | /// <summary> | 1097 | /// <summary> |
1093 | /// | 1098 | /// Clear all pending updates |
1094 | /// </summary> | 1099 | /// </summary> |
1095 | private void ClearUpdateSchedule() | 1100 | private void ClearUpdateSchedule() |
1096 | { | 1101 | { |
@@ -1098,7 +1103,7 @@ namespace OpenSim.Region.Environment.Scenes | |||
1098 | } | 1103 | } |
1099 | 1104 | ||
1100 | /// <summary> | 1105 | /// <summary> |
1101 | /// | 1106 | /// Schedules this prim for a full update |
1102 | /// </summary> | 1107 | /// </summary> |
1103 | public void ScheduleFullUpdate() | 1108 | public void ScheduleFullUpdate() |
1104 | { | 1109 | { |
@@ -1107,6 +1112,7 @@ namespace OpenSim.Region.Environment.Scenes | |||
1107 | m_parentGroup.HasGroupChanged = true; | 1112 | m_parentGroup.HasGroupChanged = true; |
1108 | m_parentGroup.QueueForUpdateCheck(); | 1113 | m_parentGroup.QueueForUpdateCheck(); |
1109 | } | 1114 | } |
1115 | |||
1110 | TimeStampFull = (uint) Util.UnixTimeSinceEpoch(); | 1116 | TimeStampFull = (uint) Util.UnixTimeSinceEpoch(); |
1111 | m_updateFlag = 2; | 1117 | m_updateFlag = 2; |
1112 | } | 1118 | } |
@@ -1156,7 +1162,7 @@ namespace OpenSim.Region.Environment.Scenes | |||
1156 | } | 1162 | } |
1157 | 1163 | ||
1158 | /// <summary> | 1164 | /// <summary> |
1159 | /// | 1165 | /// Tell all the prims which have had updates scheduled |
1160 | /// </summary> | 1166 | /// </summary> |
1161 | public void SendScheduledUpdates() | 1167 | public void SendScheduledUpdates() |
1162 | { | 1168 | { |
@@ -1688,7 +1694,10 @@ namespace OpenSim.Region.Environment.Scenes | |||
1688 | } | 1694 | } |
1689 | 1695 | ||
1690 | #region Client Update Methods | 1696 | #region Client Update Methods |
1691 | 1697 | ||
1698 | /// <summary> | ||
1699 | /// Tell all scene presences that they should send updates for this part to their clients | ||
1700 | /// </summary> | ||
1692 | public void AddFullUpdateToAllAvatars() | 1701 | public void AddFullUpdateToAllAvatars() |
1693 | { | 1702 | { |
1694 | List<ScenePresence> avatars = m_parentGroup.GetScenePresences(); | 1703 | List<ScenePresence> avatars = m_parentGroup.GetScenePresences(); |
@@ -1697,6 +1706,7 @@ namespace OpenSim.Region.Environment.Scenes | |||
1697 | avatars[i].QueuePartForUpdate(this); | 1706 | avatars[i].QueuePartForUpdate(this); |
1698 | } | 1707 | } |
1699 | } | 1708 | } |
1709 | |||
1700 | public void SendFullUpdateToAllClientsExcept(LLUUID agentID) | 1710 | public void SendFullUpdateToAllClientsExcept(LLUUID agentID) |
1701 | { | 1711 | { |
1702 | List<ScenePresence> avatars = m_parentGroup.GetScenePresences(); | 1712 | List<ScenePresence> avatars = m_parentGroup.GetScenePresences(); |
@@ -1710,6 +1720,8 @@ namespace OpenSim.Region.Environment.Scenes | |||
1710 | } | 1720 | } |
1711 | } | 1721 | } |
1712 | } | 1722 | } |
1723 | |||
1724 | |||
1713 | public void AddFullUpdateToAvatar(ScenePresence presence) | 1725 | public void AddFullUpdateToAvatar(ScenePresence presence) |
1714 | { | 1726 | { |
1715 | presence.QueuePartForUpdate(this); | 1727 | presence.QueuePartForUpdate(this); |
diff --git a/OpenSim/Region/Environment/Scenes/ScenePresence.cs b/OpenSim/Region/Environment/Scenes/ScenePresence.cs index fc13ebb..2f35fe3 100644 --- a/OpenSim/Region/Environment/Scenes/ScenePresence.cs +++ b/OpenSim/Region/Environment/Scenes/ScenePresence.cs | |||
@@ -418,6 +418,10 @@ namespace OpenSim.Region.Environment.Scenes | |||
418 | 418 | ||
419 | #endregion | 419 | #endregion |
420 | 420 | ||
421 | /// <summary> | ||
422 | /// Add the part to the queue of parts for which we need to send an update to the client | ||
423 | /// </summary> | ||
424 | /// <param name="part"></param> | ||
421 | public void QueuePartForUpdate(SceneObjectPart part) | 425 | public void QueuePartForUpdate(SceneObjectPart part) |
422 | { | 426 | { |
423 | //if (InterestList.Contains(part.ParentGroup)) | 427 | //if (InterestList.Contains(part.ParentGroup)) |
@@ -434,6 +438,11 @@ namespace OpenSim.Region.Environment.Scenes | |||
434 | return m_scene.PermissionsMngr.GenerateClientFlags(m_uuid, ObjectID); | 438 | return m_scene.PermissionsMngr.GenerateClientFlags(m_uuid, ObjectID); |
435 | } | 439 | } |
436 | 440 | ||
441 | /// <summary> | ||
442 | /// Send updates to the client about prims which have been placed on the update queue. We don't | ||
443 | /// necessarily send updates for all the parts on the queue, e.g. if an updates with a more recent | ||
444 | /// timestamp has already been sent. | ||
445 | /// </summary> | ||
437 | public void SendPrimUpdates() | 446 | public void SendPrimUpdates() |
438 | { | 447 | { |
439 | // if (m_scene.QuadTree.GetNodeID(this.AbsolutePosition.X, this.AbsolutePosition.Y) != m_currentQuadNode) | 448 | // if (m_scene.QuadTree.GetNodeID(this.AbsolutePosition.X, this.AbsolutePosition.Y) != m_currentQuadNode) |
@@ -446,13 +455,12 @@ namespace OpenSim.Region.Environment.Scenes | |||
446 | if (!m_gotAllObjectsInScene) | 455 | if (!m_gotAllObjectsInScene) |
447 | { | 456 | { |
448 | if (!m_isChildAgent || m_scene.m_seeIntoRegionFromNeighbor) | 457 | if (!m_isChildAgent || m_scene.m_seeIntoRegionFromNeighbor) |
449 | { | 458 | { |
450 | |||
451 | m_scene.SendAllSceneObjectsToClient(this); | 459 | m_scene.SendAllSceneObjectsToClient(this); |
452 | m_gotAllObjectsInScene = true; | 460 | m_gotAllObjectsInScene = true; |
453 | |||
454 | } | 461 | } |
455 | } | 462 | } |
463 | |||
456 | if (m_partsUpdateQueue.Count > 0) | 464 | if (m_partsUpdateQueue.Count > 0) |
457 | { | 465 | { |
458 | bool runUpdate = true; | 466 | bool runUpdate = true; |
@@ -465,16 +473,18 @@ namespace OpenSim.Region.Environment.Scenes | |||
465 | ScenePartUpdate update = m_updateTimes[part.UUID]; | 473 | ScenePartUpdate update = m_updateTimes[part.UUID]; |
466 | 474 | ||
467 | // Two updates can occur with the same timestamp (especially | 475 | // Two updates can occur with the same timestamp (especially |
468 | // since our timestamp resolution is to the nearest second). The first | 476 | // since our timestamp resolution is to the nearest second). Therefore, we still need |
469 | // could have been sent in the last update - we still need to send the | 477 | // to send an update even if the last full update time is identical to the part's |
470 | // second here. | 478 | // update timestamp. |
471 | 479 | // | |
472 | if (update.LastFullUpdateTime < part.TimeStampFull) | 480 | // If we don't do this, various events (such as linking and delinking in the same |
481 | // second), will stop working properly! | ||
482 | if (update.LastFullUpdateTime <= part.TimeStampFull) | ||
473 | { | 483 | { |
474 | //need to do a full update | 484 | //need to do a full update |
475 | part.SendFullUpdate(ControllingClient, GenerateClientFlags(part.UUID)); | 485 | part.SendFullUpdate(ControllingClient, GenerateClientFlags(part.UUID)); |
476 | 486 | ||
477 | // We'll update to the part's timestamp rather than the current to | 487 | // We'll update to the part's timestamp rather than the current time to |
478 | // avoid the race condition whereby the next tick occurs while we are | 488 | // avoid the race condition whereby the next tick occurs while we are |
479 | // doing this update. If this happened, then subsequent updates which occurred | 489 | // doing this update. If this happened, then subsequent updates which occurred |
480 | // on the same tick or the next tick of the last update would be ignored. | 490 | // on the same tick or the next tick of the last update would be ignored. |