aboutsummaryrefslogtreecommitdiffstatshomepage
path: root/OpenSim
diff options
context:
space:
mode:
authorlbsa712008-01-16 12:38:08 +0000
committerlbsa712008-01-16 12:38:08 +0000
commitb12f56d1d095cce8e2a11608e4ca8226356257c4 (patch)
tree96b3f4b939bd0c4a6e8b457f3e604ba143970c00 /OpenSim
parent* Reverted bugfx that really should go into separate commit (diff)
downloadopensim-SC-b12f56d1d095cce8e2a11608e4ca8226356257c4.zip
opensim-SC-b12f56d1d095cce8e2a11608e4ca8226356257c4.tar.gz
opensim-SC-b12f56d1d095cce8e2a11608e4ca8226356257c4.tar.bz2
opensim-SC-b12f56d1d095cce8e2a11608e4ca8226356257c4.tar.xz
* 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
Diffstat (limited to 'OpenSim')
-rw-r--r--OpenSim/Region/ClientStack/ClientView.cs37
1 files changed, 18 insertions, 19 deletions
diff --git a/OpenSim/Region/ClientStack/ClientView.cs b/OpenSim/Region/ClientStack/ClientView.cs
index e74aee7..d6c9d1d 100644
--- a/OpenSim/Region/ClientStack/ClientView.cs
+++ b/OpenSim/Region/ClientStack/ClientView.cs
@@ -416,7 +416,7 @@ namespace OpenSim.Region.ClientStack
416 { 416 {
417 // this will normally trigger at least one packet (ping response) 417 // this will normally trigger at least one packet (ping response)
418 SendStartPingCheck(0); 418 SendStartPingCheck(0);
419 419
420 } 420 }
421 } 421 }
422 else 422 else
@@ -424,7 +424,7 @@ namespace OpenSim.Region.ClientStack
424 // Something received in the meantime - we can reset the counters 424 // Something received in the meantime - we can reset the counters
425 m_probesWithNoIngressPackets = 0; 425 m_probesWithNoIngressPackets = 0;
426 m_lastPacketsReceived = m_packetsReceived; 426 m_lastPacketsReceived = m_packetsReceived;
427 427
428 } 428 }
429 } 429 }
430 430
@@ -2311,7 +2311,7 @@ namespace OpenSim.Region.ClientStack
2311 if (Pack.Header.Reliable) //DIRTY HACK 2311 if (Pack.Header.Reliable) //DIRTY HACK
2312 { 2312 {
2313 AddAck(Pack); // this adds the need to ack this packet later 2313 AddAck(Pack); // this adds the need to ack this packet later
2314 2314
2315 2315
2316 if (Pack.Type != PacketType.PacketAck && Pack.Type != PacketType.LogoutRequest) 2316 if (Pack.Type != PacketType.PacketAck && Pack.Type != PacketType.LogoutRequest)
2317 { 2317 {
@@ -2355,10 +2355,15 @@ namespace OpenSim.Region.ClientStack
2355 { 2355 {
2356 lock (m_needAck) 2356 lock (m_needAck)
2357 { 2357 {
2358 foreach (uint ack in NewPack.Header.AckList) 2358 foreach (uint ackedPacketId in NewPack.Header.AckList)
2359 { 2359 {
2360 m_unAckedBytes -= m_needAck[ack].ToBytes().Length; 2360 Packet ackedPacket;
2361 m_needAck.Remove(ack); 2361
2362 if (m_needAck.TryGetValue(ackedPacketId, out ackedPacket))
2363 {
2364 m_unAckedBytes -= ackedPacket.ToBytes().Length;
2365 m_needAck.Remove(ackedPacketId);
2366 }
2362 } 2367 }
2363 } 2368 }
2364 } 2369 }
@@ -2373,18 +2378,12 @@ namespace OpenSim.Region.ClientStack
2373 { 2378 {
2374 foreach (PacketAckPacket.PacketsBlock block in ackPacket.Packets) 2379 foreach (PacketAckPacket.PacketsBlock block in ackPacket.Packets)
2375 { 2380 {
2376 if (m_needAck.ContainsKey(block.ID)) 2381 uint ackedPackId = block.ID;
2382 Packet ackedPacket;
2383 if (m_needAck.TryGetValue(ackedPackId, out ackedPacket))
2377 { 2384 {
2378 try 2385 m_unAckedBytes -= ackedPacket.ToBytes().Length;
2379 { 2386 m_needAck.Remove(ackedPackId);
2380 m_unAckedBytes -= m_needAck[block.ID].ToBytes().Length;
2381 m_needAck.Remove(block.ID);
2382 }
2383 catch (System.Collections.Generic.KeyNotFoundException)
2384 {
2385 // Did another packet come in with the ack already?
2386 // apparently so!
2387 }
2388 } 2387 }
2389 } 2388 }
2390 } 2389 }
@@ -2500,11 +2499,11 @@ namespace OpenSim.Region.ClientStack
2500 2499
2501 protected void AckTimer_Elapsed(object sender, ElapsedEventArgs ea) 2500 protected void AckTimer_Elapsed(object sender, ElapsedEventArgs ea)
2502 { 2501 {
2503 2502
2504 SendAcks(); 2503 SendAcks();
2505 ResendUnacked(); 2504 ResendUnacked();
2506 SendPacketStats(); 2505 SendPacketStats();
2507 2506
2508 } 2507 }
2509 2508
2510 protected void SendPacketStats() 2509 protected void SendPacketStats()