private ThreadMinuteBin FlushCurrentBin(long currMinuteMillis) { if (currentMinuteBin.MinuteMillis == currMinuteMillis) { return(currentMinuteBin); } lock (this) { if (currentMinuteBin.MinuteMillis != currMinuteMillis) { globalHistogramBinsLock.EnterWriteLock(); try { if (globalHistogramBinsList.Count > MaxBins) { globalHistogramBinsList.RemoveAt(0); } globalHistogramBinsList.Add(new ThreadMinuteBin(currentMinuteBin)); } finally { globalHistogramBinsLock.ExitWriteLock(); } currentMinuteBin = new ThreadMinuteBin(currMinuteMillis); } return(currentMinuteBin); } }
/// <summary> /// Initializes a new instance of the <see cref="WavefrontHistogramImpl"/> class /// with a parameter for a custom clock. /// </summary> /// <param name="clockMillis">A delegate function for a clock in milliseconds.</param> public WavefrontHistogramImpl(Func <long> clockMillis) { this.clockMillis = clockMillis; currentMinuteBin = new ThreadMinuteBin(CurrentMinuteMillis()); }
/// <summary> /// Copy constructor for appending ThreadMinuteBin to globalHistogramBinsList. /// </summary> /// <param name="threadMinuteBin">The thread minute bin to copy.</param> public ThreadMinuteBin(ThreadMinuteBin threadMinuteBin) { PerThreadDist = new ConcurrentDictionary <int, TDigest>(threadMinuteBin.PerThreadDist); MinuteMillis = threadMinuteBin.MinuteMillis; }