diff options
Diffstat (limited to 'OpenSim/Region/ClientStack')
-rw-r--r-- | OpenSim/Region/ClientStack/Linden/UDP/LLClientView.cs | 111 | ||||
-rw-r--r-- | OpenSim/Region/ClientStack/Linden/UDP/LLUDPClient.cs | 32 |
2 files changed, 18 insertions, 125 deletions
diff --git a/OpenSim/Region/ClientStack/Linden/UDP/LLClientView.cs b/OpenSim/Region/ClientStack/Linden/UDP/LLClientView.cs index 7087bb7..e82f1d7 100644 --- a/OpenSim/Region/ClientStack/Linden/UDP/LLClientView.cs +++ b/OpenSim/Region/ClientStack/Linden/UDP/LLClientView.cs | |||
@@ -3694,7 +3694,7 @@ namespace OpenSim.Region.ClientStack.LindenUDP | |||
3694 | // avp.AppearanceData[0].CofVersion = 0; | 3694 | // avp.AppearanceData[0].CofVersion = 0; |
3695 | 3695 | ||
3696 | //m_log.DebugFormat("[CLIENT]: Sending appearance for {0} to {1}", agentID.ToString(), AgentId.ToString()); | 3696 | //m_log.DebugFormat("[CLIENT]: Sending appearance for {0} to {1}", agentID.ToString(), AgentId.ToString()); |
3697 | OutPacket(avp, ThrottleOutPacketType.Task); | 3697 | OutPacket(avp, ThrottleOutPacketType.Task | ThrottleOutPacketType.HighPriority); |
3698 | } | 3698 | } |
3699 | 3699 | ||
3700 | public void SendAnimations(UUID[] animations, int[] seqs, UUID sourceAgentId, UUID[] objectIDs) | 3700 | public void SendAnimations(UUID[] animations, int[] seqs, UUID sourceAgentId, UUID[] objectIDs) |
@@ -3722,7 +3722,7 @@ namespace OpenSim.Region.ClientStack.LindenUDP | |||
3722 | ani.AnimationSourceList[i].ObjectID = objectIDs[i]; | 3722 | ani.AnimationSourceList[i].ObjectID = objectIDs[i]; |
3723 | } | 3723 | } |
3724 | ani.Header.Reliable = false; | 3724 | ani.Header.Reliable = false; |
3725 | OutPacket(ani, ThrottleOutPacketType.Task); | 3725 | OutPacket(ani, ThrottleOutPacketType.Task | ThrottleOutPacketType.HighPriority); |
3726 | } | 3726 | } |
3727 | 3727 | ||
3728 | #endregion | 3728 | #endregion |
@@ -3751,7 +3751,7 @@ namespace OpenSim.Region.ClientStack.LindenUDP | |||
3751 | objupdate.ObjectData = new ObjectUpdatePacket.ObjectDataBlock[1]; | 3751 | objupdate.ObjectData = new ObjectUpdatePacket.ObjectDataBlock[1]; |
3752 | objupdate.ObjectData[0] = CreateAvatarUpdateBlock(presence); | 3752 | objupdate.ObjectData[0] = CreateAvatarUpdateBlock(presence); |
3753 | 3753 | ||
3754 | OutPacket(objupdate, ThrottleOutPacketType.Task); | 3754 | OutPacket(objupdate, ThrottleOutPacketType.Task | ThrottleOutPacketType.HighPriority); |
3755 | 3755 | ||
3756 | // We need to record the avatar local id since the root prim of an attachment points to this. | 3756 | // We need to record the avatar local id since the root prim of an attachment points to this. |
3757 | // m_attachmentsSent.Add(avatar.LocalId); | 3757 | // m_attachmentsSent.Add(avatar.LocalId); |
@@ -3824,65 +3824,6 @@ 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 | /* dont use this | ||
3828 | udp packet resent must be done at udp level only | ||
3829 | re map from a packet to original updates just doesnt work | ||
3830 | |||
3831 | /// <summary> | ||
3832 | /// Requeue an EntityUpdate when it was not acknowledged by the client. | ||
3833 | /// We will update the priority and put it in the correct queue, merging update flags | ||
3834 | /// with any other updates that may be queued for the same entity. | ||
3835 | /// The original update time is used for the merged update. | ||
3836 | /// </summary> | ||
3837 | private void ResendPrimUpdate(EntityUpdate update) | ||
3838 | { | ||
3839 | // If the update exists in priority queue, it will be updated. | ||
3840 | // If it does not exist then it will be added with the current (rather than its original) priority | ||
3841 | uint priority = m_prioritizer.GetUpdatePriority(this, update.Entity); | ||
3842 | |||
3843 | lock (m_entityUpdates.SyncRoot) | ||
3844 | m_entityUpdates.Enqueue(priority, update); | ||
3845 | } | ||
3846 | |||
3847 | |||
3848 | /// <summary> | ||
3849 | /// Requeue a list of EntityUpdates when they were not acknowledged by the client. | ||
3850 | /// We will update the priority and put it in the correct queue, merging update flags | ||
3851 | /// with any other updates that may be queued for the same entity. | ||
3852 | /// The original update time is used for the merged update. | ||
3853 | /// </summary> | ||
3854 | private void ResendPrimUpdates(List<EntityUpdate> updates, OutgoingPacket oPacket) | ||
3855 | { | ||
3856 | // m_log.WarnFormat("[CLIENT] resending prim updates {0}, packet sequence number {1}", updates[0].UpdateTime, oPacket.SequenceNumber); | ||
3857 | |||
3858 | // Remove the update packet from the list of packets waiting for acknowledgement | ||
3859 | // because we are requeuing the list of updates. They will be resent in new packets | ||
3860 | // with the most recent state and priority. | ||
3861 | m_udpClient.NeedAcks.Remove(oPacket.SequenceNumber); | ||
3862 | |||
3863 | // Count this as a resent packet since we are going to requeue all of the updates contained in it | ||
3864 | Interlocked.Increment(ref m_udpClient.PacketsResent); | ||
3865 | |||
3866 | // We're not going to worry about interlock yet since its not currently critical that this total count | ||
3867 | // is 100% correct | ||
3868 | m_udpServer.PacketsResentCount++; | ||
3869 | |||
3870 | foreach (EntityUpdate update in updates) | ||
3871 | ResendPrimUpdate(update); | ||
3872 | } | ||
3873 | */ | ||
3874 | |||
3875 | // OpenSim.Framework.Lazy<List<ObjectUpdatePacket.ObjectDataBlock>> objectUpdateBlocks = new OpenSim.Framework.Lazy<List<ObjectUpdatePacket.ObjectDataBlock>>(); | ||
3876 | // OpenSim.Framework.Lazy<List<ObjectUpdateCompressedPacket.ObjectDataBlock>> compressedUpdateBlocks = new OpenSim.Framework.Lazy<List<ObjectUpdateCompressedPacket.ObjectDataBlock>>(); | ||
3877 | // OpenSim.Framework.Lazy<List<ImprovedTerseObjectUpdatePacket.ObjectDataBlock>> terseUpdateBlocks = new OpenSim.Framework.Lazy<List<ImprovedTerseObjectUpdatePacket.ObjectDataBlock>>(); | ||
3878 | // OpenSim.Framework.Lazy<List<ImprovedTerseObjectUpdatePacket.ObjectDataBlock>> terseAgentUpdateBlocks = new OpenSim.Framework.Lazy<List<ImprovedTerseObjectUpdatePacket.ObjectDataBlock>>(); | ||
3879 | // | ||
3880 | // OpenSim.Framework.Lazy<List<EntityUpdate>> objectUpdates = new OpenSim.Framework.Lazy<List<EntityUpdate>>(); | ||
3881 | // OpenSim.Framework.Lazy<List<EntityUpdate>> compressedUpdates = new OpenSim.Framework.Lazy<List<EntityUpdate>>(); | ||
3882 | // OpenSim.Framework.Lazy<List<EntityUpdate>> terseUpdates = new OpenSim.Framework.Lazy<List<EntityUpdate>>(); | ||
3883 | // OpenSim.Framework.Lazy<List<EntityUpdate>> terseAgentUpdates = new OpenSim.Framework.Lazy<List<EntityUpdate>>(); | ||
3884 | |||
3885 | |||
3886 | private void ProcessEntityUpdates(int maxUpdates) | 3827 | private void ProcessEntityUpdates(int maxUpdates) |
3887 | { | 3828 | { |
3888 | OpenSim.Framework.Lazy<List<ObjectUpdatePacket.ObjectDataBlock>> objectUpdateBlocks = new OpenSim.Framework.Lazy<List<ObjectUpdatePacket.ObjectDataBlock>>(); | 3829 | OpenSim.Framework.Lazy<List<ObjectUpdatePacket.ObjectDataBlock>> objectUpdateBlocks = new OpenSim.Framework.Lazy<List<ObjectUpdatePacket.ObjectDataBlock>>(); |
@@ -3895,15 +3836,6 @@ namespace OpenSim.Region.ClientStack.LindenUDP | |||
3895 | OpenSim.Framework.Lazy<List<EntityUpdate>> terseUpdates = new OpenSim.Framework.Lazy<List<EntityUpdate>>(); | 3836 | OpenSim.Framework.Lazy<List<EntityUpdate>> terseUpdates = new OpenSim.Framework.Lazy<List<EntityUpdate>>(); |
3896 | OpenSim.Framework.Lazy<List<EntityUpdate>> terseAgentUpdates = new OpenSim.Framework.Lazy<List<EntityUpdate>>(); | 3837 | OpenSim.Framework.Lazy<List<EntityUpdate>> terseAgentUpdates = new OpenSim.Framework.Lazy<List<EntityUpdate>>(); |
3897 | 3838 | ||
3898 | // objectUpdateBlocks.Value.Clear(); | ||
3899 | // compressedUpdateBlocks.Value.Clear(); | ||
3900 | // terseUpdateBlocks.Value.Clear(); | ||
3901 | // terseAgentUpdateBlocks.Value.Clear(); | ||
3902 | // objectUpdates.Value.Clear(); | ||
3903 | // compressedUpdates.Value.Clear(); | ||
3904 | // terseUpdates.Value.Clear(); | ||
3905 | // terseAgentUpdates.Value.Clear(); | ||
3906 | |||
3907 | // Check to see if this is a flush | 3839 | // Check to see if this is a flush |
3908 | if (maxUpdates <= 0) | 3840 | if (maxUpdates <= 0) |
3909 | { | 3841 | { |
@@ -3970,36 +3902,6 @@ namespace OpenSim.Region.ClientStack.LindenUDP | |||
3970 | if (sp.IsChildAgent) | 3902 | if (sp.IsChildAgent) |
3971 | continue; | 3903 | continue; |
3972 | 3904 | ||
3973 | // If the object is an attachment we don't want it to be in the kill | ||
3974 | // record. Else attaching from inworld and subsequently dropping | ||
3975 | // it will no longer work. | ||
3976 | // lock (m_killRecord) | ||
3977 | // { | ||
3978 | // m_killRecord.Remove(part.LocalId); | ||
3979 | // m_killRecord.Remove(part.ParentGroup.RootPart.LocalId); | ||
3980 | // } | ||
3981 | } | ||
3982 | else | ||
3983 | { | ||
3984 | // Please do not remove this unless you can demonstrate on the OpenSim mailing list that a client | ||
3985 | // will never receive an update after a prim kill. Even then, keeping the kill record may be a good | ||
3986 | // safety measure. | ||
3987 | // | ||
3988 | // If a Linden Lab 1.23.5 client (and possibly later and earlier) receives an object update | ||
3989 | // after a kill, it will keep displaying the deleted object until relog. OpenSim currently performs | ||
3990 | // updates and kills on different threads with different scheduling strategies, hence this protection. | ||
3991 | // | ||
3992 | // This doesn't appear to apply to child prims - a client will happily ignore these updates | ||
3993 | // after the root prim has been deleted. | ||
3994 | // | ||
3995 | // We ignore this for attachments because attaching something from inworld breaks unless we do. | ||
3996 | // lock (m_killRecord) | ||
3997 | // { | ||
3998 | // if (m_killRecord.Contains(part.LocalId)) | ||
3999 | // continue; | ||
4000 | // if (m_killRecord.Contains(part.ParentGroup.RootPart.LocalId)) | ||
4001 | // continue; | ||
4002 | // } | ||
4003 | } | 3905 | } |
4004 | 3906 | ||
4005 | if (part.ParentGroup.IsAttachment && m_disableFacelights) | 3907 | if (part.ParentGroup.IsAttachment && m_disableFacelights) |
@@ -4188,16 +4090,11 @@ namespace OpenSim.Region.ClientStack.LindenUDP | |||
4188 | 4090 | ||
4189 | for (int i = 0; i < blocks.Count; i++) | 4091 | for (int i = 0; i < blocks.Count; i++) |
4190 | packet.ObjectData[i] = blocks[i]; | 4092 | packet.ObjectData[i] = blocks[i]; |
4191 | 4093 | ||
4192 | // OutPacket(packet, ThrottleOutPacketType.Task, true, delegate(OutgoingPacket oPacket) { ResendPrimUpdates(terseUpdates.Value, oPacket); }); | ||
4193 | // use default udp retry | ||
4194 | OutPacket(packet, ThrottleOutPacketType.Task, true); | 4094 | OutPacket(packet, ThrottleOutPacketType.Task, true); |
4195 | } | 4095 | } |
4196 | 4096 | ||
4197 | |||
4198 | |||
4199 | #endregion Packet Sending | 4097 | #endregion Packet Sending |
4200 | |||
4201 | } | 4098 | } |
4202 | 4099 | ||
4203 | // hack.. dont use | 4100 | // hack.. dont use |
diff --git a/OpenSim/Region/ClientStack/Linden/UDP/LLUDPClient.cs b/OpenSim/Region/ClientStack/Linden/UDP/LLUDPClient.cs index 8852715..bb68921 100644 --- a/OpenSim/Region/ClientStack/Linden/UDP/LLUDPClient.cs +++ b/OpenSim/Region/ClientStack/Linden/UDP/LLUDPClient.cs | |||
@@ -364,9 +364,6 @@ namespace OpenSim.Region.ClientStack.LindenUDP | |||
364 | int texture = (int)(BitConverter.ToSingle(adjData, pos) * 0.125f); pos += 4; | 364 | int texture = (int)(BitConverter.ToSingle(adjData, pos) * 0.125f); pos += 4; |
365 | int asset = (int)(BitConverter.ToSingle(adjData, pos) * 0.125f); | 365 | int asset = (int)(BitConverter.ToSingle(adjData, pos) * 0.125f); |
366 | 366 | ||
367 | int total = resend + land + wind + cloud + task + texture + asset; | ||
368 | total /= 128; | ||
369 | |||
370 | // Make sure none of the throttles are set below our packet MTU, | 367 | // Make sure none of the throttles are set below our packet MTU, |
371 | // otherwise a throttle could become permanently clogged | 368 | // otherwise a throttle could become permanently clogged |
372 | resend = Math.Max(resend, LLUDPServer.MTU); | 369 | resend = Math.Max(resend, LLUDPServer.MTU); |
@@ -383,8 +380,8 @@ namespace OpenSim.Region.ClientStack.LindenUDP | |||
383 | task = task + (int)(m_cannibalrate * texture); | 380 | task = task + (int)(m_cannibalrate * texture); |
384 | texture = (int)((1 - m_cannibalrate) * texture); | 381 | texture = (int)((1 - m_cannibalrate) * texture); |
385 | 382 | ||
386 | total = resend + land + wind + cloud + task + texture + asset; | 383 | // int total = resend + land + wind + cloud + task + texture + asset; |
387 | total /= 128; | 384 | |
388 | //m_log.DebugFormat("[LLUDPCLIENT]: {0} is setting throttles. Resend={1}, Land={2}, Wind={3}, Cloud={4}, Task={5}, Texture={6}, Asset={7}, Total={8}", | 385 | //m_log.DebugFormat("[LLUDPCLIENT]: {0} is setting throttles. Resend={1}, Land={2}, Wind={3}, Cloud={4}, Task={5}, Texture={6}, Asset={7}, Total={8}", |
389 | // AgentID, resend, land, wind, cloud, task, texture, asset, total); | 386 | // AgentID, resend, land, wind, cloud, task, texture, asset, total); |
390 | 387 | ||
@@ -428,25 +425,27 @@ namespace OpenSim.Region.ClientStack.LindenUDP | |||
428 | int i = 0; | 425 | int i = 0; |
429 | 426 | ||
430 | // multiply by 8 to convert bytes back to bits | 427 | // multiply by 8 to convert bytes back to bits |
431 | rate = (float)m_throttleCategories[(int)ThrottleOutPacketType.Resend].RequestedDripRate * 8 * multiplier; | 428 | multiplier *= 8; |
429 | |||
430 | rate = (float)m_throttleCategories[(int)ThrottleOutPacketType.Resend].RequestedDripRate * multiplier; | ||
432 | Buffer.BlockCopy(Utils.FloatToBytes(rate), 0, data, i, 4); i += 4; | 431 | Buffer.BlockCopy(Utils.FloatToBytes(rate), 0, data, i, 4); i += 4; |
433 | 432 | ||
434 | rate = (float)m_throttleCategories[(int)ThrottleOutPacketType.Land].RequestedDripRate * 8 * multiplier; | 433 | rate = (float)m_throttleCategories[(int)ThrottleOutPacketType.Land].RequestedDripRate * multiplier; |
435 | Buffer.BlockCopy(Utils.FloatToBytes(rate), 0, data, i, 4); i += 4; | 434 | Buffer.BlockCopy(Utils.FloatToBytes(rate), 0, data, i, 4); i += 4; |
436 | 435 | ||
437 | rate = (float)m_throttleCategories[(int)ThrottleOutPacketType.Wind].RequestedDripRate * 8 * multiplier; | 436 | rate = (float)m_throttleCategories[(int)ThrottleOutPacketType.Wind].RequestedDripRate * multiplier; |
438 | Buffer.BlockCopy(Utils.FloatToBytes(rate), 0, data, i, 4); i += 4; | 437 | Buffer.BlockCopy(Utils.FloatToBytes(rate), 0, data, i, 4); i += 4; |
439 | 438 | ||
440 | rate = (float)m_throttleCategories[(int)ThrottleOutPacketType.Cloud].RequestedDripRate * 8 * multiplier; | 439 | rate = (float)m_throttleCategories[(int)ThrottleOutPacketType.Cloud].RequestedDripRate * multiplier; |
441 | Buffer.BlockCopy(Utils.FloatToBytes(rate), 0, data, i, 4); i += 4; | 440 | Buffer.BlockCopy(Utils.FloatToBytes(rate), 0, data, i, 4); i += 4; |
442 | 441 | ||
443 | rate = (float)m_throttleCategories[(int)ThrottleOutPacketType.Task].RequestedDripRate * 8 * multiplier; | 442 | rate = (float)m_throttleCategories[(int)ThrottleOutPacketType.Task].RequestedDripRate * multiplier; |
444 | Buffer.BlockCopy(Utils.FloatToBytes(rate), 0, data, i, 4); i += 4; | 443 | Buffer.BlockCopy(Utils.FloatToBytes(rate), 0, data, i, 4); i += 4; |
445 | 444 | ||
446 | rate = (float)m_throttleCategories[(int)ThrottleOutPacketType.Texture].RequestedDripRate * 8 * multiplier; | 445 | rate = (float)m_throttleCategories[(int)ThrottleOutPacketType.Texture].RequestedDripRate * multiplier; |
447 | Buffer.BlockCopy(Utils.FloatToBytes(rate), 0, data, i, 4); i += 4; | 446 | Buffer.BlockCopy(Utils.FloatToBytes(rate), 0, data, i, 4); i += 4; |
448 | 447 | ||
449 | rate = (float)m_throttleCategories[(int)ThrottleOutPacketType.Asset].RequestedDripRate * 8 * multiplier; | 448 | rate = (float)m_throttleCategories[(int)ThrottleOutPacketType.Asset].RequestedDripRate * multiplier; |
450 | Buffer.BlockCopy(Utils.FloatToBytes(rate), 0, data, i, 4); i += 4; | 449 | Buffer.BlockCopy(Utils.FloatToBytes(rate), 0, data, i, 4); i += 4; |
451 | 450 | ||
452 | m_packedThrottles = data; | 451 | m_packedThrottles = data; |
@@ -485,19 +484,16 @@ namespace OpenSim.Region.ClientStack.LindenUDP | |||
485 | 484 | ||
486 | TokenBucket bucket = m_throttleCategories[category]; | 485 | TokenBucket bucket = m_throttleCategories[category]; |
487 | 486 | ||
488 | // Don't send this packet if there is already a packet waiting in the queue | 487 | // Don't send this packet if queue is not empty |
489 | // even if we have the tokens to send it, tokens should go to the already | ||
490 | // queued packets | ||
491 | if (queue.Count > 0 || m_nextPackets[category] != null) | 488 | if (queue.Count > 0 || m_nextPackets[category] != null) |
492 | { | 489 | { |
493 | queue.Enqueue(packet, highPriority); | 490 | queue.Enqueue(packet, highPriority); |
494 | return true; | 491 | return true; |
495 | } | 492 | } |
496 | 493 | ||
497 | |||
498 | if (!forceQueue && bucket.RemoveTokens(packet.Buffer.DataLength)) | 494 | if (!forceQueue && bucket.RemoveTokens(packet.Buffer.DataLength)) |
499 | { | 495 | { |
500 | // Enough tokens were removed from the bucket, the packet will not be queued | 496 | // enough tokens so it can be sent imediatly by caller |
501 | return false; | 497 | return false; |
502 | } | 498 | } |
503 | else | 499 | else |