aboutsummaryrefslogtreecommitdiffstatshomepage
path: root/OpenSim/Region/ClientStack/LindenUDP/LLPacketHandler.cs
diff options
context:
space:
mode:
authorMelanie Thielker2008-12-17 18:56:47 +0000
committerMelanie Thielker2008-12-17 18:56:47 +0000
commit0d3a9b45aecdccf5920f1100a407be25c4324b88 (patch)
tree2422d0fc04698a3a6c2f983214ce13886466ef5a /OpenSim/Region/ClientStack/LindenUDP/LLPacketHandler.cs
parent* remove mono compiler warnings (diff)
downloadopensim-SC_OLD-0d3a9b45aecdccf5920f1100a407be25c4324b88.zip
opensim-SC_OLD-0d3a9b45aecdccf5920f1100a407be25c4324b88.tar.gz
opensim-SC_OLD-0d3a9b45aecdccf5920f1100a407be25c4324b88.tar.bz2
opensim-SC_OLD-0d3a9b45aecdccf5920f1100a407be25c4324b88.tar.xz
Marry AckData to LLQueItem, and store packet data and length there for
use everywhere. Each packet gets serialized only once now in PacketHandler
Diffstat (limited to 'OpenSim/Region/ClientStack/LindenUDP/LLPacketHandler.cs')
-rw-r--r--OpenSim/Region/ClientStack/LindenUDP/LLPacketHandler.cs64
1 files changed, 28 insertions, 36 deletions
diff --git a/OpenSim/Region/ClientStack/LindenUDP/LLPacketHandler.cs b/OpenSim/Region/ClientStack/LindenUDP/LLPacketHandler.cs
index 4e8d4f9..83e77b7 100644
--- a/OpenSim/Region/ClientStack/LindenUDP/LLPacketHandler.cs
+++ b/OpenSim/Region/ClientStack/LindenUDP/LLPacketHandler.cs
@@ -99,26 +99,8 @@ namespace OpenSim.Region.ClientStack.LindenUDP
99 // 99 //
100 private Dictionary<uint, uint> m_PendingAcks = new Dictionary<uint, uint>(); 100 private Dictionary<uint, uint> m_PendingAcks = new Dictionary<uint, uint>();
101 101
102 // Dictionary of the packets that need acks from the client. 102 private Dictionary<uint, LLQueItem> m_NeedAck =
103 // 103 new Dictionary<uint, LLQueItem>();
104 private class AckData
105 {
106 public AckData(Packet packet, Object identifier, int tickCount, int resends)
107 {
108 Packet = packet;
109 Identifier = identifier;
110 TickCount = tickCount;
111 Resends = resends;
112 }
113
114 public Packet Packet;
115 public Object Identifier;
116 public int TickCount;
117 public int Resends;
118 }
119
120 private Dictionary<uint, AckData> m_NeedAck =
121 new Dictionary<uint, AckData>();
122 104
123 /// <summary> 105 /// <summary>
124 /// The number of milliseconds that can pass before a packet that needs an ack is resent. 106 /// The number of milliseconds that can pass before a packet that needs an ack is resent.
@@ -314,6 +296,9 @@ namespace OpenSim.Region.ClientStack.LindenUDP
314 item.throttleType = throttlePacketType; 296 item.throttleType = throttlePacketType;
315 item.TickCount = System.Environment.TickCount; 297 item.TickCount = System.Environment.TickCount;
316 item.Identifier = id; 298 item.Identifier = id;
299 item.Resends = 0;
300 item.Bytes = packet.ToBytes();
301 item.Length = item.Bytes.Length;
317 302
318 m_PacketQueue.Enqueue(item); 303 m_PacketQueue.Enqueue(item);
319 m_PacketsSent++; 304 m_PacketsSent++;
@@ -333,7 +318,7 @@ namespace OpenSim.Region.ClientStack.LindenUDP
333 if (m_DropSafeTimeout > now || 318 if (m_DropSafeTimeout > now ||
334 intervalMs > 500) // We were frozen! 319 intervalMs > 500) // We were frozen!
335 { 320 {
336 foreach (AckData data in new List<AckData> 321 foreach (LLQueItem data in new List<LLQueItem>
337 (m_NeedAck.Values)) 322 (m_NeedAck.Values))
338 { 323 {
339 if (m_DropSafeTimeout > now) 324 if (m_DropSafeTimeout > now)
@@ -364,7 +349,7 @@ namespace OpenSim.Region.ClientStack.LindenUDP
364 349
365 int resent = 0; 350 int resent = 0;
366 351
367 foreach (AckData data in new List<AckData>(m_NeedAck.Values)) 352 foreach (LLQueItem data in new List<LLQueItem>(m_NeedAck.Values))
368 { 353 {
369 Packet packet = data.Packet; 354 Packet packet = data.Packet;
370 355
@@ -629,7 +614,7 @@ namespace OpenSim.Region.ClientStack.LindenUDP
629 614
630 private void ProcessAck(uint id) 615 private void ProcessAck(uint id)
631 { 616 {
632 AckData data; 617 LLQueItem data;
633 Packet packet; 618 Packet packet;
634 619
635 lock (m_NeedAck) 620 lock (m_NeedAck)
@@ -639,10 +624,8 @@ namespace OpenSim.Region.ClientStack.LindenUDP
639 if (!m_NeedAck.TryGetValue(id, out data)) 624 if (!m_NeedAck.TryGetValue(id, out data))
640 return; 625 return;
641 626
642 packet = data.Packet;
643
644 m_NeedAck.Remove(id); 627 m_NeedAck.Remove(id);
645 m_UnackedBytes -= packet.ToBytes().Length; 628 m_UnackedBytes -= data.Length;
646 } 629 }
647 } 630 }
648 631
@@ -676,7 +659,7 @@ namespace OpenSim.Region.ClientStack.LindenUDP
676 lock (m_NeedAck) 659 lock (m_NeedAck)
677 { 660 {
678 foreach (uint key in m_NeedAck.Keys) 661 foreach (uint key in m_NeedAck.Keys)
679 info.needAck.Add(key, m_NeedAck[key].Packet.ToBytes()); 662 info.needAck.Add(key, m_NeedAck[key].Bytes);
680 } 663 }
681 664
682 LLQueItem[] queitems = m_PacketQueue.GetQueueArray(); 665 LLQueItem[] queitems = m_PacketQueue.GetQueueArray();
@@ -684,7 +667,7 @@ namespace OpenSim.Region.ClientStack.LindenUDP
684 for (int i = 0; i < queitems.Length; i++) 667 for (int i = 0; i < queitems.Length; i++)
685 { 668 {
686 if (queitems[i].Incoming == false) 669 if (queitems[i].Incoming == false)
687 info.out_packets.Add(queitems[i].Packet.ToBytes()); 670 info.out_packets.Add(queitems[i].Bytes);
688 } 671 }
689 672
690 info.sequence = m_Sequence; 673 info.sequence = m_Sequence;
@@ -695,7 +678,7 @@ namespace OpenSim.Region.ClientStack.LindenUDP
695 public void SetClientInfo(ClientInfo info) 678 public void SetClientInfo(ClientInfo info)
696 { 679 {
697 m_PendingAcks = info.pendingAcks; 680 m_PendingAcks = info.pendingAcks;
698 m_NeedAck = new Dictionary<uint, AckData>(); 681 m_NeedAck = new Dictionary<uint, LLQueItem>();
699 682
700 Packet packet = null; 683 Packet packet = null;
701 int packetEnd = 0; 684 int packetEnd = 0;
@@ -714,7 +697,16 @@ namespace OpenSim.Region.ClientStack.LindenUDP
714 { 697 {
715 } 698 }
716 699
717 m_NeedAck.Add(key, new AckData(packet, null, System.Environment.TickCount, 0)); 700 LLQueItem item = new LLQueItem();
701 item.Packet = packet;
702 item.Incoming = false;
703 item.throttleType = 0;
704 item.TickCount = System.Environment.TickCount;
705 item.Identifier = 0;
706 item.Resends = 0;
707 item.Bytes = packet.ToBytes();
708 item.Length = item.Bytes.Length;
709 m_NeedAck.Add(key, item);
718 } 710 }
719 711
720 m_Sequence = info.sequence; 712 m_Sequence = info.sequence;
@@ -738,7 +730,7 @@ namespace OpenSim.Region.ClientStack.LindenUDP
738 730
739 private void DropResend(Object id) 731 private void DropResend(Object id)
740 { 732 {
741 foreach (AckData data in new List<AckData>(m_NeedAck.Values)) 733 foreach (LLQueItem data in new List<LLQueItem>(m_NeedAck.Values))
742 { 734 {
743 if (data.Identifier != null && data.Identifier == id) 735 if (data.Identifier != null && data.Identifier == id)
744 { 736 {
@@ -774,12 +766,12 @@ namespace OpenSim.Region.ClientStack.LindenUDP
774 // We want to see that packet arrive if it's reliable 766 // We want to see that packet arrive if it's reliable
775 if (packet.Header.Reliable) 767 if (packet.Header.Reliable)
776 { 768 {
777 m_UnackedBytes += packet.ToBytes().Length; 769 m_UnackedBytes += item.Length;
778 770
779 // Keep track of when this packet was sent out 771 // Keep track of when this packet was sent out
780 m_NeedAck[packet.Header.Sequence] = new AckData(packet, 772 item.TickCount = System.Environment.TickCount;
781 item.Identifier, System.Environment.TickCount, 773
782 0); 774 m_NeedAck[packet.Header.Sequence] = item;
783 } 775 }
784 } 776 }
785 } 777 }
@@ -789,7 +781,7 @@ namespace OpenSim.Region.ClientStack.LindenUDP
789 Abort(); 781 Abort();
790 782
791 // Actually make the byte array and send it 783 // Actually make the byte array and send it
792 byte[] sendbuffer = packet.ToBytes(); 784 byte[] sendbuffer = item.Bytes;
793 785
794 //m_log.DebugFormat( 786 //m_log.DebugFormat(
795 // "[CLIENT]: In {0} sending packet {1}", 787 // "[CLIENT]: In {0} sending packet {1}",