diff options
-rw-r--r-- | OpenSim/Region/ClientStack/LindenUDP/LLUDPClient.cs | 51 |
1 files changed, 21 insertions, 30 deletions
diff --git a/OpenSim/Region/ClientStack/LindenUDP/LLUDPClient.cs b/OpenSim/Region/ClientStack/LindenUDP/LLUDPClient.cs index 0948e1c..a823f3b 100644 --- a/OpenSim/Region/ClientStack/LindenUDP/LLUDPClient.cs +++ b/OpenSim/Region/ClientStack/LindenUDP/LLUDPClient.cs | |||
@@ -144,9 +144,6 @@ namespace OpenSim.Region.ClientStack.LindenUDP | |||
144 | private readonly OutgoingPacket[] m_nextPackets = new OutgoingPacket[THROTTLE_CATEGORY_COUNT]; | 144 | private readonly OutgoingPacket[] m_nextPackets = new OutgoingPacket[THROTTLE_CATEGORY_COUNT]; |
145 | /// <summary>A reference to the LLUDPServer that is managing this client</summary> | 145 | /// <summary>A reference to the LLUDPServer that is managing this client</summary> |
146 | private readonly LLUDPServer m_udpServer; | 146 | private readonly LLUDPServer m_udpServer; |
147 | /// <summary>Locks access to the variables used while calculating round-trip | ||
148 | /// packet times and the retransmission timeout</summary> | ||
149 | private readonly object m_roundTripCalcLock = new object(); | ||
150 | 147 | ||
151 | /// <summary> | 148 | /// <summary> |
152 | /// Default constructor | 149 | /// Default constructor |
@@ -487,28 +484,25 @@ namespace OpenSim.Region.ClientStack.LindenUDP | |||
487 | const float BETA = 0.25f; | 484 | const float BETA = 0.25f; |
488 | const float K = 4.0f; | 485 | const float K = 4.0f; |
489 | 486 | ||
490 | lock (m_roundTripCalcLock) | 487 | if (RTTVAR == 0.0f) |
491 | { | 488 | { |
492 | if (RTTVAR == 0.0f) | 489 | // First RTT measurement |
493 | { | 490 | SRTT = r; |
494 | // First RTT measurement | 491 | RTTVAR = r * 0.5f; |
495 | SRTT = r; | 492 | } |
496 | RTTVAR = r * 0.5f; | 493 | else |
497 | } | 494 | { |
498 | else | 495 | // Subsequence RTT measurement |
499 | { | 496 | RTTVAR = (1.0f - BETA) * RTTVAR + BETA * Math.Abs(SRTT - r); |
500 | // Subsequence RTT measurement | 497 | SRTT = (1.0f - ALPHA) * SRTT + ALPHA * r; |
501 | RTTVAR = (1.0f - BETA) * RTTVAR + BETA * Math.Abs(SRTT - r); | 498 | } |
502 | SRTT = (1.0f - ALPHA) * SRTT + ALPHA * r; | ||
503 | } | ||
504 | 499 | ||
505 | int rto = (int)(SRTT + Math.Max(m_udpServer.TickCountResolution, K * RTTVAR)); | 500 | int rto = (int)(SRTT + Math.Max(m_udpServer.TickCountResolution, K * RTTVAR)); |
506 | 501 | ||
507 | // Clamp the retransmission timeout to manageable values | 502 | // Clamp the retransmission timeout to manageable values |
508 | rto = Utils.Clamp(RTO, 3000, 60000); | 503 | rto = Utils.Clamp(RTO, 3000, 60000); |
509 | 504 | ||
510 | RTO = rto; | 505 | RTO = rto; |
511 | } | ||
512 | 506 | ||
513 | //m_log.Debug("[LLUDPCLIENT]: Setting agent " + this.Agent.FullName + "'s RTO to " + RTO + "ms with an RTTVAR of " + | 507 | //m_log.Debug("[LLUDPCLIENT]: Setting agent " + this.Agent.FullName + "'s RTO to " + RTO + "ms with an RTTVAR of " + |
514 | // RTTVAR + " based on new RTT of " + r + "ms"); | 508 | // RTTVAR + " based on new RTT of " + r + "ms"); |
@@ -520,16 +514,13 @@ namespace OpenSim.Region.ClientStack.LindenUDP | |||
520 | /// </summary> | 514 | /// </summary> |
521 | public void BackoffRTO() | 515 | public void BackoffRTO() |
522 | { | 516 | { |
523 | lock (m_roundTripCalcLock) | 517 | // Reset SRTT and RTTVAR, we assume they are bogus since things |
524 | { | 518 | // didn't work out and we're backing off the timeout |
525 | // Reset SRTT and RTTVAR, we assume they are bogus since things | 519 | SRTT = 0.0f; |
526 | // didn't work out and we're backing off the timeout | 520 | RTTVAR = 0.0f; |
527 | SRTT = 0.0f; | ||
528 | RTTVAR = 0.0f; | ||
529 | 521 | ||
530 | // Double the retransmission timeout | 522 | // Double the retransmission timeout |
531 | RTO = Math.Min(RTO * 2, 60000); | 523 | RTO = Math.Min(RTO * 2, 60000); |
532 | } | ||
533 | } | 524 | } |
534 | 525 | ||
535 | /// <summary> | 526 | /// <summary> |