diff options
Diffstat (limited to 'OpenSim/Region')
-rw-r--r-- | OpenSim/Region/ClientStack/LindenUDP/LLPacketTracker.cs | 526 |
1 files changed, 263 insertions, 263 deletions
diff --git a/OpenSim/Region/ClientStack/LindenUDP/LLPacketTracker.cs b/OpenSim/Region/ClientStack/LindenUDP/LLPacketTracker.cs index ce9c527..690fadb 100644 --- a/OpenSim/Region/ClientStack/LindenUDP/LLPacketTracker.cs +++ b/OpenSim/Region/ClientStack/LindenUDP/LLPacketTracker.cs | |||
@@ -1,263 +1,263 @@ | |||
1 | using System; | 1 | using System; |
2 | using System.Collections.Generic; | 2 | using System.Collections.Generic; |
3 | using System.Text; | 3 | using System.Text; |
4 | using System.Threading; | 4 | using System.Threading; |
5 | using libsecondlife; | 5 | using libsecondlife; |
6 | using libsecondlife.Packets; | 6 | using libsecondlife.Packets; |
7 | using OpenSim.Framework; | 7 | using OpenSim.Framework; |
8 | 8 | ||
9 | namespace OpenSim.Region.ClientStack.LindenUDP | 9 | namespace OpenSim.Region.ClientStack.LindenUDP |
10 | { | 10 | { |
11 | 11 | ||
12 | public class LLPacketTracker | 12 | public class LLPacketTracker |
13 | { | 13 | { |
14 | public delegate void PacketAcked(uint sequenceNumber); | 14 | public delegate void PacketAcked(uint sequenceNumber); |
15 | public event PacketAcked OnPacketAcked; | 15 | public event PacketAcked OnPacketAcked; |
16 | 16 | ||
17 | protected List<uint> m_beenAcked = new List<uint>(); | 17 | protected List<uint> m_beenAcked = new List<uint>(); |
18 | 18 | ||
19 | protected TerrainPacketTracker[,] m_sentTerrainPackets = new TerrainPacketTracker[16, 16]; | 19 | protected TerrainPacketTracker[,] m_sentTerrainPackets = new TerrainPacketTracker[16, 16]; |
20 | protected Dictionary<LLUUID, PrimPacketTracker> m_sendPrimPackets = new Dictionary<LLUUID, PrimPacketTracker>(); | 20 | protected Dictionary<LLUUID, PrimPacketTracker> m_sendPrimPackets = new Dictionary<LLUUID, PrimPacketTracker>(); |
21 | 21 | ||
22 | protected LLClientView m_parentClient; | 22 | protected LLClientView m_parentClient; |
23 | 23 | ||
24 | public LLPacketTracker(LLClientView parent) | 24 | public LLPacketTracker(LLClientView parent) |
25 | { | 25 | { |
26 | m_parentClient = parent; | 26 | m_parentClient = parent; |
27 | OnPacketAcked += TerrainPacketAcked; | 27 | OnPacketAcked += TerrainPacketAcked; |
28 | //OnPacketAcked += PrimPacketAcked; | 28 | //OnPacketAcked += PrimPacketAcked; |
29 | } | 29 | } |
30 | 30 | ||
31 | public void PacketAck(uint sequenceNumber) | 31 | public void PacketAck(uint sequenceNumber) |
32 | { | 32 | { |
33 | lock (m_beenAcked) | 33 | lock (m_beenAcked) |
34 | { | 34 | { |
35 | m_beenAcked.Add(sequenceNumber); | 35 | m_beenAcked.Add(sequenceNumber); |
36 | } | 36 | } |
37 | } | 37 | } |
38 | 38 | ||
39 | public void TrackTerrainPacket(uint sequenceNumber, int patchX, int patchY) | 39 | public void TrackTerrainPacket(uint sequenceNumber, int patchX, int patchY) |
40 | { | 40 | { |
41 | TrackTerrainPacket(sequenceNumber, patchX, patchY, false, null); | 41 | TrackTerrainPacket(sequenceNumber, patchX, patchY, false, null); |
42 | } | 42 | } |
43 | 43 | ||
44 | public void TrackTerrainPacket(uint sequenceNumber, int patchX, int patchY, bool keepResending, LayerDataPacket packet) | 44 | public void TrackTerrainPacket(uint sequenceNumber, int patchX, int patchY, bool keepResending, LayerDataPacket packet) |
45 | { | 45 | { |
46 | TerrainPacketTracker tracker = new TerrainPacketTracker(); | 46 | TerrainPacketTracker tracker = new TerrainPacketTracker(); |
47 | tracker.X = patchX; | 47 | tracker.X = patchX; |
48 | tracker.Y = patchY; | 48 | tracker.Y = patchY; |
49 | tracker.SeqNumber = sequenceNumber; | 49 | tracker.SeqNumber = sequenceNumber; |
50 | tracker.TimeSent = DateTime.Now; | 50 | tracker.TimeSent = DateTime.Now; |
51 | tracker.KeepResending = keepResending; | 51 | tracker.KeepResending = keepResending; |
52 | tracker.Packet = packet; | 52 | tracker.Packet = packet; |
53 | lock (m_sentTerrainPackets) | 53 | lock (m_sentTerrainPackets) |
54 | { | 54 | { |
55 | m_sentTerrainPackets[patchX, patchY] = tracker; | 55 | m_sentTerrainPackets[patchX, patchY] = tracker; |
56 | } | 56 | } |
57 | } | 57 | } |
58 | 58 | ||
59 | public void TrackPrimPacket(uint sequenceNumber, LLUUID primID) | 59 | public void TrackPrimPacket(uint sequenceNumber, LLUUID primID) |
60 | { | 60 | { |
61 | PrimPacketTracker tracker = new PrimPacketTracker(); | 61 | PrimPacketTracker tracker = new PrimPacketTracker(); |
62 | tracker.PrimID = primID; | 62 | tracker.PrimID = primID; |
63 | tracker.TimeSent = DateTime.Now; | 63 | tracker.TimeSent = DateTime.Now; |
64 | tracker.SeqNumber = sequenceNumber; | 64 | tracker.SeqNumber = sequenceNumber; |
65 | lock (m_sendPrimPackets) | 65 | lock (m_sendPrimPackets) |
66 | { | 66 | { |
67 | m_sendPrimPackets[primID] = tracker; | 67 | m_sendPrimPackets[primID] = tracker; |
68 | } | 68 | } |
69 | } | 69 | } |
70 | 70 | ||
71 | public void TerrainPacketCheck() | 71 | public void TerrainPacketCheck() |
72 | { | 72 | { |
73 | DateTime now = DateTime.Now; | 73 | DateTime now = DateTime.Now; |
74 | List<TerrainPacketTracker> resendList = new List<TerrainPacketTracker>(); | 74 | List<TerrainPacketTracker> resendList = new List<TerrainPacketTracker>(); |
75 | lock (m_sentTerrainPackets) | 75 | lock (m_sentTerrainPackets) |
76 | { | 76 | { |
77 | for (int y = 0; y < 16; y++) | 77 | for (int y = 0; y < 16; y++) |
78 | { | 78 | { |
79 | for (int x = 0; x < 16; x++) | 79 | for (int x = 0; x < 16; x++) |
80 | { | 80 | { |
81 | if (m_sentTerrainPackets[x, y] != null) | 81 | if (m_sentTerrainPackets[x, y] != null) |
82 | { | 82 | { |
83 | TerrainPacketTracker tracker = m_sentTerrainPackets[x, y]; | 83 | TerrainPacketTracker tracker = m_sentTerrainPackets[x, y]; |
84 | if ((now - tracker.TimeSent) > TimeSpan.FromMinutes(1)) | 84 | if ((now - tracker.TimeSent) > TimeSpan.FromMinutes(1)) |
85 | { | 85 | { |
86 | tracker.TimeSent = now; | 86 | tracker.TimeSent = now; |
87 | m_sentTerrainPackets[x, y] = null; | 87 | m_sentTerrainPackets[x, y] = null; |
88 | resendList.Add(tracker); | 88 | resendList.Add(tracker); |
89 | } | 89 | } |
90 | } | 90 | } |
91 | } | 91 | } |
92 | } | 92 | } |
93 | } | 93 | } |
94 | 94 | ||
95 | foreach (TerrainPacketTracker tracker in resendList) | 95 | foreach (TerrainPacketTracker tracker in resendList) |
96 | { | 96 | { |
97 | if (!tracker.KeepResending) | 97 | if (!tracker.KeepResending) |
98 | { | 98 | { |
99 | m_parentClient.TriggerTerrainUnackedEvent(tracker.X, tracker.Y); | 99 | m_parentClient.TriggerTerrainUnackedEvent(tracker.X, tracker.Y); |
100 | } | 100 | } |
101 | else | 101 | else |
102 | { | 102 | { |
103 | if (tracker.Packet != null) | 103 | if (tracker.Packet != null) |
104 | { | 104 | { |
105 | tracker.Packet.Header.Resent = true; | 105 | tracker.Packet.Header.Resent = true; |
106 | m_parentClient.OutPacket(tracker.Packet, ThrottleOutPacketType.Resend); | 106 | m_parentClient.OutPacket(tracker.Packet, ThrottleOutPacketType.Resend); |
107 | tracker.TimeSent = DateTime.Now; | 107 | tracker.TimeSent = DateTime.Now; |
108 | lock (m_sentTerrainPackets) | 108 | lock (m_sentTerrainPackets) |
109 | { | 109 | { |
110 | if (m_sentTerrainPackets[tracker.X, tracker.Y] == null) | 110 | if (m_sentTerrainPackets[tracker.X, tracker.Y] == null) |
111 | { | 111 | { |
112 | m_sentTerrainPackets[tracker.X, tracker.Y] = tracker; | 112 | m_sentTerrainPackets[tracker.X, tracker.Y] = tracker; |
113 | } | 113 | } |
114 | } | 114 | } |
115 | } | 115 | } |
116 | } | 116 | } |
117 | } | 117 | } |
118 | } | 118 | } |
119 | 119 | ||
120 | public void PrimPacketCheck() | 120 | public void PrimPacketCheck() |
121 | { | 121 | { |
122 | DateTime now = DateTime.Now; | 122 | DateTime now = DateTime.Now; |
123 | List<PrimPacketTracker> resendList = new List<PrimPacketTracker>(); | 123 | List<PrimPacketTracker> resendList = new List<PrimPacketTracker>(); |
124 | List<PrimPacketTracker> ackedList = new List<PrimPacketTracker>(); | 124 | List<PrimPacketTracker> ackedList = new List<PrimPacketTracker>(); |
125 | 125 | ||
126 | lock (m_sendPrimPackets) | 126 | lock (m_sendPrimPackets) |
127 | { | 127 | { |
128 | foreach (PrimPacketTracker tracker in m_sendPrimPackets.Values) | 128 | foreach (PrimPacketTracker tracker in m_sendPrimPackets.Values) |
129 | { | 129 | { |
130 | if (tracker.Acked) | 130 | if (tracker.Acked) |
131 | { | 131 | { |
132 | ackedList.Add(tracker); | 132 | ackedList.Add(tracker); |
133 | } | 133 | } |
134 | else if (((now - tracker.TimeSent) > TimeSpan.FromMinutes(1)) && (!tracker.Acked)) | 134 | else if (((now - tracker.TimeSent) > TimeSpan.FromMinutes(1)) && (!tracker.Acked)) |
135 | { | 135 | { |
136 | resendList.Add(tracker); | 136 | resendList.Add(tracker); |
137 | } | 137 | } |
138 | } | 138 | } |
139 | } | 139 | } |
140 | 140 | ||
141 | foreach (PrimPacketTracker tracker in resendList) | 141 | foreach (PrimPacketTracker tracker in resendList) |
142 | { | 142 | { |
143 | lock (m_sendPrimPackets) | 143 | lock (m_sendPrimPackets) |
144 | { | 144 | { |
145 | m_sendPrimPackets.Remove(tracker.PrimID); | 145 | m_sendPrimPackets.Remove(tracker.PrimID); |
146 | } | 146 | } |
147 | //call event | 147 | //call event |
148 | Console.WriteLine("Prim packet not acked, " + tracker.PrimID.ToString()); | 148 | Console.WriteLine("Prim packet not acked, " + tracker.PrimID.ToString()); |
149 | } | 149 | } |
150 | 150 | ||
151 | 151 | ||
152 | RemovePrimTrackers(ackedList); | 152 | RemovePrimTrackers(ackedList); |
153 | } | 153 | } |
154 | 154 | ||
155 | public void PrimTrackerCleanup() | 155 | public void PrimTrackerCleanup() |
156 | { | 156 | { |
157 | List<PrimPacketTracker> ackedList = new List<PrimPacketTracker>(); | 157 | List<PrimPacketTracker> ackedList = new List<PrimPacketTracker>(); |
158 | 158 | ||
159 | lock (m_sendPrimPackets) | 159 | lock (m_sendPrimPackets) |
160 | { | 160 | { |
161 | foreach (PrimPacketTracker tracker in m_sendPrimPackets.Values) | 161 | foreach (PrimPacketTracker tracker in m_sendPrimPackets.Values) |
162 | { | 162 | { |
163 | if (tracker.Acked) | 163 | if (tracker.Acked) |
164 | { | 164 | { |
165 | ackedList.Add(tracker); | 165 | ackedList.Add(tracker); |
166 | } | 166 | } |
167 | } | 167 | } |
168 | } | 168 | } |
169 | Thread.Sleep(15); //give a little bit of time for other code to access list before we lock it again | 169 | Thread.Sleep(15); //give a little bit of time for other code to access list before we lock it again |
170 | 170 | ||
171 | RemovePrimTrackers(ackedList); | 171 | RemovePrimTrackers(ackedList); |
172 | } | 172 | } |
173 | 173 | ||
174 | protected void RemovePrimTrackers(List<PrimPacketTracker> ackedList) | 174 | protected void RemovePrimTrackers(List<PrimPacketTracker> ackedList) |
175 | { | 175 | { |
176 | lock (m_sendPrimPackets) | 176 | lock (m_sendPrimPackets) |
177 | { | 177 | { |
178 | foreach (PrimPacketTracker tracker in ackedList) | 178 | foreach (PrimPacketTracker tracker in ackedList) |
179 | { | 179 | { |
180 | m_sendPrimPackets.Remove(tracker.PrimID); | 180 | m_sendPrimPackets.Remove(tracker.PrimID); |
181 | } | 181 | } |
182 | } | 182 | } |
183 | } | 183 | } |
184 | 184 | ||
185 | protected void TerrainPacketAcked(uint sequence) | 185 | protected void TerrainPacketAcked(uint sequence) |
186 | { | 186 | { |
187 | lock (m_sentTerrainPackets) | 187 | lock (m_sentTerrainPackets) |
188 | { | 188 | { |
189 | for (int y = 0; y < 16; y++) | 189 | for (int y = 0; y < 16; y++) |
190 | { | 190 | { |
191 | for (int x = 0; x < 16; x++) | 191 | for (int x = 0; x < 16; x++) |
192 | { | 192 | { |
193 | if (m_sentTerrainPackets[x, y] != null) | 193 | if (m_sentTerrainPackets[x, y] != null) |
194 | { | 194 | { |
195 | if (m_sentTerrainPackets[x, y].SeqNumber == sequence) | 195 | if (m_sentTerrainPackets[x, y].SeqNumber == sequence) |
196 | { | 196 | { |
197 | m_sentTerrainPackets[x, y] = null; | 197 | m_sentTerrainPackets[x, y] = null; |
198 | return; | 198 | return; |
199 | } | 199 | } |
200 | } | 200 | } |
201 | } | 201 | } |
202 | } | 202 | } |
203 | } | 203 | } |
204 | } | 204 | } |
205 | 205 | ||
206 | protected void PrimPacketAcked(uint sequence) | 206 | protected void PrimPacketAcked(uint sequence) |
207 | { | 207 | { |
208 | lock (m_sendPrimPackets) | 208 | lock (m_sendPrimPackets) |
209 | { | 209 | { |
210 | foreach (PrimPacketTracker tracker in m_sendPrimPackets.Values) | 210 | foreach (PrimPacketTracker tracker in m_sendPrimPackets.Values) |
211 | { | 211 | { |
212 | if (tracker.SeqNumber == sequence) | 212 | if (tracker.SeqNumber == sequence) |
213 | { | 213 | { |
214 | tracker.Acked = true; | 214 | tracker.Acked = true; |
215 | break; | 215 | break; |
216 | } | 216 | } |
217 | } | 217 | } |
218 | } | 218 | } |
219 | } | 219 | } |
220 | 220 | ||
221 | public void Process() | 221 | public void Process() |
222 | { | 222 | { |
223 | List<uint> ackedPackets = null; | 223 | List<uint> ackedPackets = null; |
224 | lock (m_beenAcked) | 224 | lock (m_beenAcked) |
225 | { | 225 | { |
226 | ackedPackets = new List<uint>(m_beenAcked); | 226 | ackedPackets = new List<uint>(m_beenAcked); |
227 | m_beenAcked.Clear(); | 227 | m_beenAcked.Clear(); |
228 | } | 228 | } |
229 | 229 | ||
230 | if (ackedPackets != null) | 230 | if (ackedPackets != null) |
231 | { | 231 | { |
232 | foreach (uint packetId in ackedPackets) | 232 | foreach (uint packetId in ackedPackets) |
233 | { | 233 | { |
234 | if (OnPacketAcked != null) | 234 | if (OnPacketAcked != null) |
235 | { | 235 | { |
236 | OnPacketAcked(packetId); | 236 | OnPacketAcked(packetId); |
237 | } | 237 | } |
238 | } | 238 | } |
239 | } | 239 | } |
240 | 240 | ||
241 | // ackedPackets.Clear(); | 241 | // ackedPackets.Clear(); |
242 | ackedPackets = null; | 242 | ackedPackets = null; |
243 | } | 243 | } |
244 | 244 | ||
245 | public class TerrainPacketTracker | 245 | public class TerrainPacketTracker |
246 | { | 246 | { |
247 | public uint SeqNumber = 0; | 247 | public uint SeqNumber = 0; |
248 | public int X; | 248 | public int X; |
249 | public int Y; | 249 | public int Y; |
250 | public DateTime TimeSent; | 250 | public DateTime TimeSent; |
251 | public LayerDataPacket Packet; | 251 | public LayerDataPacket Packet; |
252 | public bool KeepResending; | 252 | public bool KeepResending; |
253 | } | 253 | } |
254 | 254 | ||
255 | public class PrimPacketTracker | 255 | public class PrimPacketTracker |
256 | { | 256 | { |
257 | public uint SeqNumber = 0; | 257 | public uint SeqNumber = 0; |
258 | public DateTime TimeSent; | 258 | public DateTime TimeSent; |
259 | public LLUUID PrimID; | 259 | public LLUUID PrimID; |
260 | public bool Acked = false; | 260 | public bool Acked = false; |
261 | } | 261 | } |
262 | } | 262 | } |
263 | } | 263 | } |