From c5159ad8d00e5b2dc19eb100ec2e74a7a605e139 Mon Sep 17 00:00:00 2001 From: Mic Bowman Date: Thu, 21 Apr 2011 15:40:38 -0700 Subject: Add some locking on the child list for the token bucket hiearchy. A few other cosmetic changes. --- .../Region/ClientStack/LindenUDP/TokenBucket.cs | 37 +++++++++++++--------- 1 file changed, 22 insertions(+), 15 deletions(-) diff --git a/OpenSim/Region/ClientStack/LindenUDP/TokenBucket.cs b/OpenSim/Region/ClientStack/LindenUDP/TokenBucket.cs index 4ee6d3a..8ce64d5 100644 --- a/OpenSim/Region/ClientStack/LindenUDP/TokenBucket.cs +++ b/OpenSim/Region/ClientStack/LindenUDP/TokenBucket.cs @@ -29,6 +29,8 @@ using System; using System.Collections; using System.Collections.Generic; using System.Reflection; +using OpenSim.Framework; + using log4net; namespace OpenSim.Region.ClientStack.LindenUDP @@ -177,7 +179,7 @@ namespace OpenSim.Region.ClientStack.LindenUDP RequestedDripRate = dripRate; // TotalDripRequest = dripRate; // this will be overwritten when a child node registers // MaxBurst = (Int64)((double)dripRate * m_quantumsPerBurst); - m_lastDrip = Environment.TickCount & Int32.MaxValue; + m_lastDrip = Util.EnvironmentTickCount(); } #endregion Constructor @@ -211,12 +213,15 @@ namespace OpenSim.Region.ClientStack.LindenUDP /// public void RegisterRequest(TokenBucket child, Int64 request) { - m_children[child] = request; - // m_totalDripRequest = m_children.Values.Sum(); + lock (m_children) + { + m_children[child] = request; + // m_totalDripRequest = m_children.Values.Sum(); - m_totalDripRequest = 0; - foreach (KeyValuePair cref in m_children) - m_totalDripRequest += cref.Value; + m_totalDripRequest = 0; + foreach (KeyValuePair cref in m_children) + m_totalDripRequest += cref.Value; + } // Pass the new values up to the parent if (m_parent != null) @@ -229,12 +234,16 @@ namespace OpenSim.Region.ClientStack.LindenUDP /// public void UnregisterRequest(TokenBucket child) { - m_children.Remove(child); - // m_totalDripRequest = m_children.Values.Sum(); + lock (m_children) + { + m_children.Remove(child); + // m_totalDripRequest = m_children.Values.Sum(); - m_totalDripRequest = 0; - foreach (KeyValuePair cref in m_children) - m_totalDripRequest += cref.Value; + m_totalDripRequest = 0; + foreach (KeyValuePair cref in m_children) + m_totalDripRequest += cref.Value; + } + // Pass the new values up to the parent if (m_parent != null) @@ -297,10 +306,8 @@ namespace OpenSim.Region.ClientStack.LindenUDP // Determine the interval over which we are adding tokens, never add // more than a single quantum of tokens - Int32 now = Environment.TickCount & Int32.MaxValue; - Int32 deltaMS = Math.Min(now - m_lastDrip, m_ticksPerQuantum); - - m_lastDrip = now; + Int32 deltaMS = Math.Min(Util.EnvironmentTickCountSubtract(m_lastDrip), m_ticksPerQuantum); + m_lastDrip = Util.EnvironmentTickCount(); // This can be 0 in the very unusual case that the timer wrapped // It can be 0 if we try add tokens at a sub-tick rate -- cgit v1.1