partially revert commit 42a9afdc43cc.. of 06-12 not allowing more updates to be enqueued on deleted objects. Keep the catch up on deenqueue, so preserving the race condition safe guard. Let Scene sendkillObject work even if object is flaged as deleted. Still not clear how this are related to mantis 7858 or even less to 7990.

LSLKeyTest
UbitUmarov 2016-08-12 03:58:04 +01:00
parent cfab2675ff
commit c04792142f
4 changed files with 26 additions and 41 deletions

View File

@ -4007,7 +4007,6 @@ namespace OpenSim.Region.ClientStack.LindenUDP
bool doCulling = m_scene.ObjectsCullingByDistance;
float cullingrange = 64.0f;
HashSet<SceneObjectGroup> GroupsNeedFullUpdate = new HashSet<SceneObjectGroup>();
List<SceneObjectGroup> kills = new List<SceneObjectGroup>();
// Vector3 mycamera = Vector3.Zero;
Vector3 mypos = Vector3.Zero;
ScenePresence mysp = (ScenePresence)SceneAgent;
@ -4048,7 +4047,10 @@ namespace OpenSim.Region.ClientStack.LindenUDP
// Instead send another kill object, because the first one may have gotten
// into a race condition
if (!m_killRecord.Contains(grp.LocalId))
{
m_killRecord.Add(grp.LocalId);
maxUpdatesBytes -= 30;
}
continue;
}
@ -4336,16 +4338,6 @@ namespace OpenSim.Region.ClientStack.LindenUDP
m_killRecord.Clear();
}
if (kills.Count > 0)
{
foreach(SceneObjectGroup grp in kills)
{
foreach(SceneObjectPart p in grp.Parts)
SendEntityUpdate(p,PrimUpdateFlags.Kill);
}
kills.Clear();
}
if(GroupsNeedFullUpdate.Count > 0)
{
foreach(SceneObjectGroup grp in GroupsNeedFullUpdate)

View File

@ -3866,15 +3866,9 @@ namespace OpenSim.Region.Framework.Scenes
foreach (uint localID in localIDs)
{
SceneObjectPart part = GetSceneObjectPart(localID);
if (part != null) // It is a prim
{
if (part.ParentGroup != null && !part.ParentGroup.IsDeleted) // Valid
{
if (part.ParentGroup.RootPart != part) // Child part
continue;
}
}
deleteIDs.Add(localID);
if (part != null && part.ParentGroup != null &&
part.ParentGroup.RootPart == part)
deleteIDs.Add(localID);
}
ForEachClient(c => c.SendKillObject(deleteIDs));

View File

@ -2065,41 +2065,37 @@ namespace OpenSim.Region.Framework.Scenes
{
// We need to keep track of this state in case this group is still queued for backup.
IsDeleted = true;
HasGroupChanged = true;
DetachFromBackup();
if(Scene == null) // should not happen unless restart/shutdown ?
return;
SceneObjectPart[] parts = m_parts.GetArray();
for (int i = 0; i < parts.Length; i++)
{
SceneObjectPart part = parts[i];
if (Scene != null)
Scene.ForEachScenePresence(delegate(ScenePresence avatar)
{
Scene.ForEachScenePresence(delegate(ScenePresence avatar)
{
if (!avatar.IsChildAgent && avatar.ParentID == LocalId)
avatar.StandUp();
if (!avatar.IsChildAgent && avatar.ParentID == LocalId)
avatar.StandUp();
if (!silent)
if (!silent)
{
part.ClearUpdateSchedule();
if (part == m_rootPart)
{
part.ClearUpdateSchedule();
if (part == m_rootPart)
if (!IsAttachment
|| AttachedAvatar == avatar.ControllingClient.AgentId
|| !HasPrivateAttachmentPoint)
{
if (!IsAttachment
|| AttachedAvatar == avatar.ControllingClient.AgentId
|| !HasPrivateAttachmentPoint)
{
// Send a kill object immediately
avatar.ControllingClient.SendKillObject(new List<uint> { part.LocalId });
// Also, send a terse update; in case race conditions make the object pop again in the client,
// this update will send another kill object
m_rootPart.SendTerseUpdateToClient(avatar.ControllingClient);
}
// Send a kill object immediately
avatar.ControllingClient.SendKillObject(new List<uint> { part.LocalId });
}
}
});
}
}
});
}
}

View File

@ -5420,6 +5420,9 @@ SendFullUpdateToClient(remoteClient, Position) ignores position parameter
public void SendTerseUpdateToClient(IClientAPI remoteClient)
{
if (ParentGroup.IsDeleted)
return;
if (ParentGroup.IsAttachment
&& (ParentGroup.RootPart != this
|| ParentGroup.AttachedAvatar != remoteClient.AgentId && ParentGroup.HasPrivateAttachmentPoint))