aboutsummaryrefslogtreecommitdiffstatshomepage
path: root/OpenSim/Region/ClientStack/Linden/UDP/LLClientView.cs
diff options
context:
space:
mode:
Diffstat (limited to 'OpenSim/Region/ClientStack/Linden/UDP/LLClientView.cs')
-rw-r--r--OpenSim/Region/ClientStack/Linden/UDP/LLClientView.cs53
1 files changed, 32 insertions, 21 deletions
diff --git a/OpenSim/Region/ClientStack/Linden/UDP/LLClientView.cs b/OpenSim/Region/ClientStack/Linden/UDP/LLClientView.cs
index a7f83f9..4a0b0c6 100644
--- a/OpenSim/Region/ClientStack/Linden/UDP/LLClientView.cs
+++ b/OpenSim/Region/ClientStack/Linden/UDP/LLClientView.cs
@@ -1531,38 +1531,49 @@ namespace OpenSim.Region.ClientStack.LindenUDP
1531 OutPacket(pc, ThrottleOutPacketType.Unknown); 1531 OutPacket(pc, ThrottleOutPacketType.Unknown);
1532 } 1532 }
1533 1533
1534 public void SendKillObject(ulong regionHandle, uint localID) 1534 public void SendKillObject(ulong regionHandle, List<uint> localIDs)
1535 { 1535 {
1536// m_log.DebugFormat("[CLIENT]: Sending KillObjectPacket to {0} for {1} in {2}", Name, localID, regionHandle); 1536// m_log.DebugFormat("[CLIENT]: Sending KillObjectPacket to {0} for {1} in {2}", Name, localID, regionHandle);
1537 1537
1538 KillObjectPacket kill = (KillObjectPacket)PacketPool.Instance.GetPacket(PacketType.KillObject); 1538 KillObjectPacket kill = (KillObjectPacket)PacketPool.Instance.GetPacket(PacketType.KillObject);
1539 // TODO: don't create new blocks if recycling an old packet 1539 // TODO: don't create new blocks if recycling an old packet
1540 kill.ObjectData = new KillObjectPacket.ObjectDataBlock[1]; 1540 kill.ObjectData = new KillObjectPacket.ObjectDataBlock[localIDs.Count];
1541 kill.ObjectData[0] = new KillObjectPacket.ObjectDataBlock(); 1541 for (int i = 0 ; i < localIDs.Count ; i++ )
1542 kill.ObjectData[0].ID = localID; 1542 {
1543 kill.ObjectData[i] = new KillObjectPacket.ObjectDataBlock();
1544 kill.ObjectData[i].ID = localIDs[i];
1545 }
1543 kill.Header.Reliable = true; 1546 kill.Header.Reliable = true;
1544 kill.Header.Zerocoded = true; 1547 kill.Header.Zerocoded = true;
1545 1548
1546 if (m_scene.GetScenePresence(localID) == null) 1549 lock (m_killRecord)
1547 { 1550 {
1548 // We must lock for both manipulating the kill record and sending the packet, in order to avoid a race 1551 if (localIDs.Count == 1)
1549 // condition where a kill can be processed before an out-of-date update for the same object.
1550 lock (m_killRecord)
1551 { 1552 {
1552 m_killRecord.Add(localID); 1553 if (m_scene.GetScenePresence(localIDs[0]) != null)
1553 1554 {
1554 // The throttle queue used here must match that being used for updates. Otherwise, there is a 1555 OutPacket(kill, ThrottleOutPacketType.State);
1555 // chance that a kill packet put on a separate queue will be sent to the client before an existing 1556 return;
1556 // update packet on another queue. Receiving updates after kills results in unowned and undeletable 1557 }
1557 // scene objects in a viewer until that viewer is relogged in. 1558 m_killRecord.Add(localIDs[0]);
1558 OutPacket(kill, ThrottleOutPacketType.Task); 1559 }
1560 else
1561 {
1562 lock (m_entityUpdates.SyncRoot)
1563 {
1564 foreach (uint localID in localIDs)
1565 m_killRecord.Add(localID);
1566 }
1559 } 1567 }
1560 } 1568 }
1561 else 1569
1562 { 1570 // The throttle queue used here must match that being used for
1563 // OutPacket(kill, ThrottleOutPacketType.State); 1571 // updates. Otherwise, there is a chance that a kill packet put
1564 OutPacket(kill, ThrottleOutPacketType.Task); 1572 // on a separate queue will be sent to the client before an
1565 } 1573 // existing update packet on another queue. Receiving updates
1574 // after kills results in unowned and undeletable
1575 // scene objects in a viewer until that viewer is relogged in.
1576 OutPacket(kill, ThrottleOutPacketType.Task);
1566 } 1577 }
1567 1578
1568 /// <summary> 1579 /// <summary>
@@ -11265,7 +11276,7 @@ namespace OpenSim.Region.ClientStack.LindenUDP
11265 { 11276 {
11266 // It's a ghost! tell the client to delete it from view. 11277 // It's a ghost! tell the client to delete it from view.
11267 simClient.SendKillObject(Scene.RegionInfo.RegionHandle, 11278 simClient.SendKillObject(Scene.RegionInfo.RegionHandle,
11268 localId); 11279 new List<uint> { localId });
11269 } 11280 }
11270 else 11281 else
11271 { 11282 {