diff --git a/src/Adaptive.Agrona/Concurrent/Status/CountersManager.cs b/src/Adaptive.Agrona/Concurrent/Status/CountersManager.cs index f3c9c2a..73c40cd 100644 --- a/src/Adaptive.Agrona/Concurrent/Status/CountersManager.cs +++ b/src/Adaptive.Agrona/Concurrent/Status/CountersManager.cs @@ -314,9 +314,16 @@ public AtomicCounter NewCounter( /// the counter to freed public void Free(int counterId) { + ValidateCounterId(counterId); int recordOffset = MetaDataOffset(counterId); + if (RECORD_ALLOCATED != MetaDataBuffer.GetIntVolatile(recordOffset)) + { + throw new System.InvalidOperationException("counter not allocated: id=" + counterId); + } + MetaDataBuffer.PutLong(recordOffset + FREE_FOR_REUSE_DEADLINE_OFFSET, _epochClock.Time() + _freeToReuseTimeoutMs); + MetaDataBuffer.SetMemory(recordOffset + KEY_OFFSET, MAX_KEY_LENGTH, 0); MetaDataBuffer.PutIntOrdered(recordOffset, RECORD_RECLAIMED); _freeList.Add(counterId); } @@ -343,7 +350,7 @@ private int NextCounterId() if (nowMs >= deadlineMs) { - _freeList.Remove(i); + _freeList.RemoveAt(i); ValuesBuffer.PutLongOrdered(CounterOffset(counterId), 0L); return counterId; diff --git a/src/Adaptive.Agrona/Concurrent/Status/CountersReader.cs b/src/Adaptive.Agrona/Concurrent/Status/CountersReader.cs index 97c0a94..c3df6bd 100644 --- a/src/Adaptive.Agrona/Concurrent/Status/CountersReader.cs +++ b/src/Adaptive.Agrona/Concurrent/Status/CountersReader.cs @@ -445,7 +445,7 @@ public string GetCounterLabel(int counterId) return LabelValue(MetaDataOffset(counterId)); } - private void ValidateCounterId(int counterId) + protected void ValidateCounterId(int counterId) { if (counterId < 0 || counterId > MaxCounterId) {