* fixed a race condition where several UDP-generated threads would collide on accessing AckList

* introduced __TryGetValue__ (learn to love it!) instead of ugly ifs and catch
ThreadPoolClientBranch
lbsa71 2008-01-16 12:38:08 +00:00
parent f2ca9c1d05
commit b12f56d1d0
1 changed files with 18 additions and 19 deletions

View File

@ -2355,10 +2355,15 @@ namespace OpenSim.Region.ClientStack
{ {
lock (m_needAck) lock (m_needAck)
{ {
foreach (uint ack in NewPack.Header.AckList) foreach (uint ackedPacketId in NewPack.Header.AckList)
{ {
m_unAckedBytes -= m_needAck[ack].ToBytes().Length; Packet ackedPacket;
m_needAck.Remove(ack);
if (m_needAck.TryGetValue(ackedPacketId, out ackedPacket))
{
m_unAckedBytes -= ackedPacket.ToBytes().Length;
m_needAck.Remove(ackedPacketId);
}
} }
} }
} }
@ -2373,18 +2378,12 @@ namespace OpenSim.Region.ClientStack
{ {
foreach (PacketAckPacket.PacketsBlock block in ackPacket.Packets) foreach (PacketAckPacket.PacketsBlock block in ackPacket.Packets)
{ {
if (m_needAck.ContainsKey(block.ID)) uint ackedPackId = block.ID;
Packet ackedPacket;
if (m_needAck.TryGetValue(ackedPackId, out ackedPacket))
{ {
try m_unAckedBytes -= ackedPacket.ToBytes().Length;
{ m_needAck.Remove(ackedPackId);
m_unAckedBytes -= m_needAck[block.ID].ToBytes().Length;
m_needAck.Remove(block.ID);
}
catch (System.Collections.Generic.KeyNotFoundException)
{
// Did another packet come in with the ack already?
// apparently so!
}
} }
} }
} }