aboutsummaryrefslogtreecommitdiffstatshomepage
path: root/OpenSim/Region
diff options
context:
space:
mode:
Diffstat (limited to 'OpenSim/Region')
-rw-r--r--OpenSim/Region/ClientStack/Linden/UDP/LLClientView.cs49
-rw-r--r--OpenSim/Region/ClientStack/Linden/UDP/LLUDPServer.cs2
2 files changed, 47 insertions, 4 deletions
diff --git a/OpenSim/Region/ClientStack/Linden/UDP/LLClientView.cs b/OpenSim/Region/ClientStack/Linden/UDP/LLClientView.cs
index 6f42990..da30a04 100644
--- a/OpenSim/Region/ClientStack/Linden/UDP/LLClientView.cs
+++ b/OpenSim/Region/ClientStack/Linden/UDP/LLClientView.cs
@@ -3824,6 +3824,49 @@ namespace OpenSim.Region.ClientStack.LindenUDP
3824 m_entityUpdates.Enqueue(priority, new EntityUpdate(entity, updateFlags, m_scene.TimeDilation)); 3824 m_entityUpdates.Enqueue(priority, new EntityUpdate(entity, updateFlags, m_scene.TimeDilation));
3825 } 3825 }
3826 3826
3827
3828 /// <summary>
3829 /// Requeue an EntityUpdate when it was not acknowledged by the client.
3830 /// We will update the priority and put it in the correct queue, merging update flags
3831 /// with any other updates that may be queued for the same entity.
3832 /// The original update time is used for the merged update.
3833 /// </summary>
3834 private void ResendPrimUpdate(EntityUpdate update)
3835 {
3836 // If the update exists in priority queue, it will be updated.
3837 // If it does not exist then it will be added with the current (rather than its original) priority
3838 uint priority = m_prioritizer.GetUpdatePriority(this, update.Entity);
3839
3840 lock (m_entityUpdates.SyncRoot)
3841 m_entityUpdates.Enqueue(priority, update);
3842 }
3843
3844 /// <summary>
3845 /// Requeue a list of EntityUpdates when they were not acknowledged by the client.
3846 /// We will update the priority and put it in the correct queue, merging update flags
3847 /// with any other updates that may be queued for the same entity.
3848 /// The original update time is used for the merged update.
3849 /// </summary>
3850 private void ResendPrimUpdates(List<EntityUpdate> updates, OutgoingPacket oPacket)
3851 {
3852 // m_log.WarnFormat("[CLIENT] resending prim updates {0}, packet sequence number {1}", updates[0].UpdateTime, oPacket.SequenceNumber);
3853
3854 // Remove the update packet from the list of packets waiting for acknowledgement
3855 // because we are requeuing the list of updates. They will be resent in new packets
3856 // with the most recent state and priority.
3857 m_udpClient.NeedAcks.Remove(oPacket.SequenceNumber);
3858
3859 // Count this as a resent packet since we are going to requeue all of the updates contained in it
3860 Interlocked.Increment(ref m_udpClient.PacketsResent);
3861
3862 // We're not going to worry about interlock yet since its not currently critical that this total count
3863 // is 100% correct
3864 m_udpServer.PacketsResentCount++;
3865
3866 foreach (EntityUpdate update in updates)
3867 ResendPrimUpdate(update);
3868 }
3869
3827 private void ProcessEntityUpdates(int maxUpdates) 3870 private void ProcessEntityUpdates(int maxUpdates)
3828 { 3871 {
3829 OpenSim.Framework.Lazy<List<ObjectUpdatePacket.ObjectDataBlock>> objectUpdateBlocks = new OpenSim.Framework.Lazy<List<ObjectUpdatePacket.ObjectDataBlock>>(); 3872 OpenSim.Framework.Lazy<List<ObjectUpdatePacket.ObjectDataBlock>> objectUpdateBlocks = new OpenSim.Framework.Lazy<List<ObjectUpdatePacket.ObjectDataBlock>>();
@@ -4044,7 +4087,7 @@ namespace OpenSim.Region.ClientStack.LindenUDP
4044 for (int i = 0; i < blocks.Count; i++) 4087 for (int i = 0; i < blocks.Count; i++)
4045 packet.ObjectData[i] = blocks[i]; 4088 packet.ObjectData[i] = blocks[i];
4046 4089
4047 OutPacket(packet, ThrottleOutPacketType.Unknown, true); 4090 OutPacket(packet, ThrottleOutPacketType.Unknown, true, delegate(OutgoingPacket oPacket) { ResendPrimUpdates(terseUpdates.Value, oPacket); });
4048 } 4091 }
4049 4092
4050 if (objectUpdateBlocks.IsValueCreated) 4093 if (objectUpdateBlocks.IsValueCreated)
@@ -4090,8 +4133,8 @@ namespace OpenSim.Region.ClientStack.LindenUDP
4090 4133
4091 for (int i = 0; i < blocks.Count; i++) 4134 for (int i = 0; i < blocks.Count; i++)
4092 packet.ObjectData[i] = blocks[i]; 4135 packet.ObjectData[i] = blocks[i];
4093 4136
4094 OutPacket(packet, ThrottleOutPacketType.Task, true); 4137 OutPacket(packet, ThrottleOutPacketType.Task, true, delegate(OutgoingPacket oPacket) { ResendPrimUpdates(terseUpdates.Value, oPacket); });
4095 } 4138 }
4096 4139
4097 #endregion Packet Sending 4140 #endregion Packet Sending
diff --git a/OpenSim/Region/ClientStack/Linden/UDP/LLUDPServer.cs b/OpenSim/Region/ClientStack/Linden/UDP/LLUDPServer.cs
index 99e7aba..f66534d 100644
--- a/OpenSim/Region/ClientStack/Linden/UDP/LLUDPServer.cs
+++ b/OpenSim/Region/ClientStack/Linden/UDP/LLUDPServer.cs
@@ -1245,7 +1245,7 @@ namespace OpenSim.Region.ClientStack.LindenUDP
1245 int dataLength = buffer.DataLength; 1245 int dataLength = buffer.DataLength;
1246 1246
1247 // NOTE: I'm seeing problems with some viewers when ACKs are appended to zerocoded packets so I've disabled that here 1247 // NOTE: I'm seeing problems with some viewers when ACKs are appended to zerocoded packets so I've disabled that here
1248 if (!isZerocoded && !isResend) 1248 if (!isZerocoded && !isResend && outgoingPacket.UnackedMethod == null)
1249 { 1249 {
1250 // Keep appending ACKs until there is no room left in the buffer or there are 1250 // Keep appending ACKs until there is no room left in the buffer or there are
1251 // no more ACKs to append 1251 // no more ACKs to append