Add some nullref checks to the UnackedPacketCollection.
parent
b58a47c373
commit
b017d985ab
|
@ -139,28 +139,43 @@ namespace OpenSim.Region.ClientStack.LindenUDP
|
||||||
private void ProcessQueues()
|
private void ProcessQueues()
|
||||||
{
|
{
|
||||||
// Process all the pending adds
|
// Process all the pending adds
|
||||||
|
|
||||||
OutgoingPacket pendingAdd;
|
OutgoingPacket pendingAdd;
|
||||||
while (m_pendingAdds.Dequeue(out pendingAdd))
|
if (m_pendingAdds != null)
|
||||||
m_packets[pendingAdd.SequenceNumber] = pendingAdd;
|
{
|
||||||
|
while (m_pendingAdds.Dequeue(out pendingAdd))
|
||||||
|
{
|
||||||
|
if (pendingAdd != null && m_packets != null)
|
||||||
|
{
|
||||||
|
m_packets[pendingAdd.SequenceNumber] = pendingAdd;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
// Process all the pending removes, including updating statistics and round-trip times
|
// Process all the pending removes, including updating statistics and round-trip times
|
||||||
PendingAck pendingRemove;
|
PendingAck pendingRemove;
|
||||||
OutgoingPacket ackedPacket;
|
OutgoingPacket ackedPacket;
|
||||||
while (m_pendingRemoves.Dequeue(out pendingRemove))
|
if (m_pendingRemoves != null)
|
||||||
{
|
{
|
||||||
if (m_packets.TryGetValue(pendingRemove.SequenceNumber, out ackedPacket))
|
while (m_pendingRemoves.Dequeue(out pendingRemove))
|
||||||
{
|
{
|
||||||
m_packets.Remove(pendingRemove.SequenceNumber);
|
if (m_pendingRemoves != null && m_packets != null)
|
||||||
|
|
||||||
// Update stats
|
|
||||||
System.Threading.Interlocked.Add(ref ackedPacket.Client.UnackedBytes, -ackedPacket.Buffer.DataLength);
|
|
||||||
|
|
||||||
if (!pendingRemove.FromResend)
|
|
||||||
{
|
{
|
||||||
// Calculate the round-trip time for this packet and its ACK
|
if (m_packets.TryGetValue(pendingRemove.SequenceNumber, out ackedPacket))
|
||||||
int rtt = pendingRemove.RemoveTime - ackedPacket.TickCount;
|
{
|
||||||
if (rtt > 0)
|
m_packets.Remove(pendingRemove.SequenceNumber);
|
||||||
ackedPacket.Client.UpdateRoundTrip(rtt);
|
|
||||||
|
// Update stats
|
||||||
|
System.Threading.Interlocked.Add(ref ackedPacket.Client.UnackedBytes, -ackedPacket.Buffer.DataLength);
|
||||||
|
|
||||||
|
if (!pendingRemove.FromResend)
|
||||||
|
{
|
||||||
|
// Calculate the round-trip time for this packet and its ACK
|
||||||
|
int rtt = pendingRemove.RemoveTime - ackedPacket.TickCount;
|
||||||
|
if (rtt > 0)
|
||||||
|
ackedPacket.Client.UpdateRoundTrip(rtt);
|
||||||
|
}
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
Loading…
Reference in New Issue