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;
 }