From 87067bff1e499d9281b032862b0435f6d7f127f1 Mon Sep 17 00:00:00 2001
From: Justin Clarke Casey
Date: Fri, 14 Mar 2008 18:21:21 +0000
Subject: * The rest of the fix necessary for mantis #766 - terse updates
broken * Even very rapid linking/delinking should now behave normally. Terse
updates still occur as before * Hopefully this ends the recent linking
problems - please let us know if there are more
---
.../Region/Environment/Scenes/SceneObjectGroup.cs | 29 +++++++++++++++++++---
.../Region/Environment/Scenes/SceneObjectPart.cs | 18 +++++++++++---
OpenSim/Region/Environment/Scenes/ScenePresence.cs | 12 +++------
3 files changed, 43 insertions(+), 16 deletions(-)
(limited to 'OpenSim/Region/Environment')
diff --git a/OpenSim/Region/Environment/Scenes/SceneObjectGroup.cs b/OpenSim/Region/Environment/Scenes/SceneObjectGroup.cs
index 4c69930..69ef9b4 100644
--- a/OpenSim/Region/Environment/Scenes/SceneObjectGroup.cs
+++ b/OpenSim/Region/Environment/Scenes/SceneObjectGroup.cs
@@ -948,7 +948,18 @@ namespace OpenSim.Region.Environment.Scenes
public void LinkToGroup(SceneObjectGroup objectGroup)
{
if (objectGroup.RootPart.UpdateFlag > 0)
+ {
+ // I've never actually seen this happen, though I think it's theoretically possible
+ m_log.ErrorFormat(
+ "[SCENE OBJECT GROUP]: Aborted linking {0}, {1} to {2}, {3} as it has yet to finish delinking",
+ objectGroup.RootPart.Name, objectGroup.RootPart.UUID, RootPart.Name, RootPart.UUID);
+
return;
+ }
+
+// m_log.DebugFormat(
+// "[SCENE OBJECT GROUP]: Linking group with root part {0}, {1} to group with root part {2}, {3}",
+// objectGroup.RootPart.Name, objectGroup.RootPart.UUID, RootPart.Name, RootPart.UUID);
SceneObjectPart linkPart = objectGroup.m_rootPart;
@@ -1017,13 +1028,25 @@ namespace OpenSim.Region.Environment.Scenes
///
public void DelinkFromGroup(uint partID)
{
+ // Don't try and update if we're already in the middle of updating
if (RootPart.UpdateFlag > 0)
+ {
+ // I've never actually seen this happen, though I think it's theoretically possible
+ m_log.WarnFormat(
+ "[SCENE OBJECT GROUP]: Aborted delink update for {0}, {1} as it has yet to finish linking",
+ RootPart.Name, RootPart.UUID);
+
return;
+ }
SceneObjectPart linkPart = GetChildPart(partID);
if (null != linkPart)
- {
+ {
+// m_log.DebugFormat(
+// "[SCENE OBJECT GROUP]: Delinking part {0}, {1} from group with root part {2}, {3}",
+// linkPart.Name, linkPart.UUID, RootPart.Name, RootPart.UUID);
+
LLQuaternion worldRot = linkPart.GetWorldRotation();
// Remove the part from this object
@@ -1645,7 +1668,7 @@ namespace OpenSim.Region.Environment.Scenes
}
///
- ///
+ /// Send a full update to the client for the given part
///
///
///
@@ -1662,7 +1685,7 @@ namespace OpenSim.Region.Environment.Scenes
}
///
- ///
+ /// Send a terse update to the client for the given part
///
///
///
diff --git a/OpenSim/Region/Environment/Scenes/SceneObjectPart.cs b/OpenSim/Region/Environment/Scenes/SceneObjectPart.cs
index 4fc688a..6a19eb6 100644
--- a/OpenSim/Region/Environment/Scenes/SceneObjectPart.cs
+++ b/OpenSim/Region/Environment/Scenes/SceneObjectPart.cs
@@ -270,7 +270,6 @@ namespace OpenSim.Region.Environment.Scenes
m_groupPosition.Y = PhysActor.Position.Y;
m_groupPosition.Z = PhysActor.Position.Z;
}
-
return m_groupPosition;
}
set
@@ -1116,7 +1115,10 @@ namespace OpenSim.Region.Environment.Scenes
int timeNow = Util.UnixTimeSinceEpoch();
- if (timeNow == TimeStampFull)
+ // If multiple updates are scheduled on the same second, we still need to perform all of them
+ // So we'll force the issue by bumping up the timestamp so that later processing sees these need
+ // to be peformed.
+ if (timeNow <= TimeStampFull)
{
TimeStampFull += 1;
}
@@ -1126,6 +1128,10 @@ namespace OpenSim.Region.Environment.Scenes
}
m_updateFlag = 2;
+
+// m_log.DebugFormat(
+// "[SCENE OBJECT PART]: Scheduling full update for {0}, {1} at {2}",
+// UUID, Name, TimeStampFull);
}
public void AddFlag(LLObject.ObjectFlags flag)
@@ -1155,7 +1161,8 @@ namespace OpenSim.Region.Environment.Scenes
}
///
- ///
+ /// Schedule a terse update for this prim. Terse updates only send position,
+ /// rotation, velocity, rotational velocity and shape information.
///
public void ScheduleTerseUpdate()
{
@@ -1169,6 +1176,9 @@ namespace OpenSim.Region.Environment.Scenes
TimeStampTerse = (uint) Util.UnixTimeSinceEpoch();
m_updateFlag = 1;
+// m_log.DebugFormat(
+// "[SCENE OBJECT PART]: Scheduling terse update for {0}, {1} at {2}",
+// UUID, Name, TimeStampTerse);
}
}
@@ -1836,7 +1846,7 @@ namespace OpenSim.Region.Environment.Scenes
}
///
- ///
+ /// Send a terse update to the client.
///
///
public void SendTerseUpdate(IClientAPI remoteClient)
diff --git a/OpenSim/Region/Environment/Scenes/ScenePresence.cs b/OpenSim/Region/Environment/Scenes/ScenePresence.cs
index 44d2316..a3d528d 100644
--- a/OpenSim/Region/Environment/Scenes/ScenePresence.cs
+++ b/OpenSim/Region/Environment/Scenes/ScenePresence.cs
@@ -472,20 +472,14 @@ namespace OpenSim.Region.Environment.Scenes
{
ScenePartUpdate update = m_updateTimes[part.UUID];
- // Two updates can occur with the same timestamp (especially
- // since our timestamp resolution is to the nearest second). Therefore, we still need
- // to send an update even if the last full update time is identical to the part's
- // update timestamp.
- //
- // If we don't do this, various events (such as linking and delinking in the same
- // second), will stop working properly!
+ // We deal with the possibility that two updates occur at the same unix time
+ // at the update point itself.
if (update.LastFullUpdateTime < part.TimeStampFull)
{
// m_log.DebugFormat(
// "[SCENE PRESENCE]: Fully updating prim {0}, {1} - part timestamp {2}",
// part.Name, part.UUID, part.TimeStampFull);
- //need to do a full update
part.SendFullUpdate(ControllingClient, GenerateClientFlags(part.UUID));
// We'll update to the part's timestamp rather than the current time to
@@ -1658,7 +1652,7 @@ namespace OpenSim.Region.Environment.Scenes
gdb.GodLevel = (byte)0;
m_godlevel = 0;
}
-
+
gdb.Token = token;
//respondPacket.AgentData = (GrantGodlikePowersPacket.AgentDataBlock)ablock;
respondPacket.GrantData = gdb;
--
cgit v1.1