From 66b4309f342d92cf7aad4a367e417cf569e244cd Mon Sep 17 00:00:00 2001 From: Melanie Thielker Date: Fri, 28 May 2010 02:44:12 +0200 Subject: [PATCH] Apply Mike's TokenBucket fix --- .../ClientStack/LindenUDP/TokenBucket.cs | 72 ++++++++----------- 1 file changed, 30 insertions(+), 42 deletions(-) diff --git a/OpenSim/Region/ClientStack/LindenUDP/TokenBucket.cs b/OpenSim/Region/ClientStack/LindenUDP/TokenBucket.cs index bdbd2848c6..91e3d2058a 100644 --- a/OpenSim/Region/ClientStack/LindenUDP/TokenBucket.cs +++ b/OpenSim/Region/ClientStack/LindenUDP/TokenBucket.cs @@ -133,7 +133,7 @@ namespace OpenSim.Region.ClientStack.LindenUDP this.parent = parent; MaxBurst = maxBurst; DripRate = dripRate; - lastDrip = Environment.TickCount & Int32.MaxValue; + lastDrip = Environment.TickCount; } /// @@ -143,41 +143,31 @@ namespace OpenSim.Region.ClientStack.LindenUDP /// True if the requested number of tokens were removed from /// the bucket, otherwise false public bool RemoveTokens(int amount) - { - bool dummy; - return RemoveTokens(amount, out dummy); - } - - /// - /// Remove a given number of tokens from the bucket - /// - /// Number of tokens to remove from the bucket - /// True if tokens were added to the bucket - /// during this call, otherwise false - /// True if the requested number of tokens were removed from - /// the bucket, otherwise false - public bool RemoveTokens(int amount, out bool dripSucceeded) { if (maxBurst == 0) { - dripSucceeded = true; return true; } - dripSucceeded = Drip(); - - if (content - amount >= 0) + if (amount > maxBurst) { - if (parent != null && !parent.RemoveTokens(amount)) - return false; - - content -= amount; - return true; + throw new Exception("amount " + amount + " exceeds maxBurst " + maxBurst); } - else + + Drip(); + + if (content < amount) { return false; } + + if (parent != null && !parent.RemoveTokens(amount)) + { + return false; + } + + content -= amount; + return true; } /// @@ -193,25 +183,23 @@ namespace OpenSim.Region.ClientStack.LindenUDP content = maxBurst; return true; } - else + + int now = Environment.TickCount; + int deltaMS = now - lastDrip; + lastDrip = now; + + if (deltaMS <= 0) { - int now = Environment.TickCount & Int32.MaxValue; - int deltaMS = now - lastDrip; - - if (deltaMS <= 0) - { - if (deltaMS < 0) - lastDrip = now; - return false; - } - - int dripAmount = deltaMS * tokensPerMS; - - content = Math.Min(content + dripAmount, maxBurst); - lastDrip = now; - - return true; + return false; } + + long dripAmount = (long)deltaMS * (long)tokensPerMS + (long)content; + if (dripAmount > maxBurst) + { + dripAmount = maxBurst; + } + content = (int)dripAmount; + return true; } } }