Remove entities from updates queues on kill. Do it sync so enqueues after

UbitUmarov [2014-08-23 19:59:11]
Remove entities from updates queues on kill. Do it sync so enqueues after
the kill work
Filename
OpenSim/Framework/PriorityQueue.cs
OpenSim/Region/ClientStack/Linden/UDP/LLClientView.cs
diff --git a/OpenSim/Framework/PriorityQueue.cs b/OpenSim/Framework/PriorityQueue.cs
index d6c39a7..4f05f65 100644
--- a/OpenSim/Framework/PriorityQueue.cs
+++ b/OpenSim/Framework/PriorityQueue.cs
@@ -134,6 +134,21 @@ namespace OpenSim.Framework
             return true;
         }

+
+        public void Remove(List<uint> ids)
+        {
+            LookupItem lookup;
+
+            foreach (uint localid in ids)
+            {
+                if (m_lookupTable.TryGetValue(localid, out lookup))
+                {
+                    lookup.Heap.Remove(lookup.Handle);
+                    m_lookupTable.Remove(localid);
+                }
+            }
+        }
+
         /// <summary>
         /// Remove an item from one of the queues. Specifically, it removes the
         /// oldest item from the next queue in order to provide fair access to
diff --git a/OpenSim/Region/ClientStack/Linden/UDP/LLClientView.cs b/OpenSim/Region/ClientStack/Linden/UDP/LLClientView.cs
index 06f1301..3d02f36 100644
--- a/OpenSim/Region/ClientStack/Linden/UDP/LLClientView.cs
+++ b/OpenSim/Region/ClientStack/Linden/UDP/LLClientView.cs
@@ -1660,6 +1660,12 @@ namespace OpenSim.Region.ClientStack.LindenUDP
 //            foreach (uint id in localIDs)
 //                m_log.DebugFormat("[CLIENT]: Sending KillObjectPacket to {0} for {1} in {2}", Name, id, regionHandle);

+            // remove pending entities
+            lock (m_entityProps.SyncRoot)
+                m_entityProps.Remove(localIDs);
+            lock (m_entityUpdates.SyncRoot)
+                m_entityUpdates.Remove(localIDs);
+
             KillObjectPacket kill = (KillObjectPacket)PacketPool.Instance.GetPacket(PacketType.KillObject);
             // TODO: don't create new blocks if recycling an old packet
             kill.ObjectData = new KillObjectPacket.ObjectDataBlock[localIDs.Count];
ViewGit