internal Bucket GetCurrentBucket()
{
int newCurrentIndex;
int initialCurrentIndex;
Bucket bucket;
Bucket newBucket;
long currentTime;
currentTime = clock.EllapsedTimeInMs;
do {
initialCurrentIndex = currentBucketIndex;
bucket = buckets[initialCurrentIndex];
if (bucket.bucketStartInMs + bucketSizeInMs > currentTime)
{
return bucket;
}
newCurrentIndex = (initialCurrentIndex + 1) % (numberOfBuckets+1);
newBucket = buckets[newCurrentIndex];
bool lockTacken=false;
try
{
Monitor.TryEnter(gate, 10, ref lockTacken);
if (!lockTacken)
{
return newBucket;
}
newBucket.Reset(bucket, currentTime);
}
finally
{
if (lockTacken)
Monitor.Exit(gate);
}
}
while ( Interlocked.CompareExchange(ref currentBucketIndex, newCurrentIndex, initialCurrentIndex) != initialCurrentIndex);
// Console.WriteLine("Change bucket to {0}, {1}", newCurrentIndex, currentTime);
cumulativeSum.AddBucket(bucket);
return newBucket;
}