diff --git a/BitFaster.Caching/Buffers/MpmcBoundedBuffer.cs b/BitFaster.Caching/Buffers/MpmcBoundedBuffer.cs index 9acaa834..f4be6694 100644 --- a/BitFaster.Caching/Buffers/MpmcBoundedBuffer.cs +++ b/BitFaster.Caching/Buffers/MpmcBoundedBuffer.cs @@ -12,7 +12,7 @@ namespace BitFaster.Caching.Buffers /// Based on the Segment internal class from the .NET ConcurrentQueue class. public sealed class MpmcBoundedBuffer { - private readonly Slot[] slots; + private Slot[] slots; private readonly int slotsMask; private PaddedHeadAndTail headAndTail; // mutable struct, don't mark readonly @@ -208,11 +208,13 @@ public BufferStatus TryAdd(T item) /// /// Removes all values from the buffer. /// + /// + /// Not thread safe. + /// public void Clear() { - while (TryTake(out _) != BufferStatus.Empty) - { - } + slots = new Slot[slots.Length]; + headAndTail = new PaddedHeadAndTail(); } [StructLayout(LayoutKind.Auto)] diff --git a/BitFaster.Caching/Buffers/MpscBoundedBuffer.cs b/BitFaster.Caching/Buffers/MpscBoundedBuffer.cs index a5e55880..f3f7c6a3 100644 --- a/BitFaster.Caching/Buffers/MpscBoundedBuffer.cs +++ b/BitFaster.Caching/Buffers/MpscBoundedBuffer.cs @@ -13,7 +13,7 @@ namespace BitFaster.Caching.Buffers [DebuggerDisplay("Count = {Count}/{Capacity}")] public sealed class MpscBoundedBuffer where T : class { - private readonly T[] buffer; + private T[] buffer; private readonly int mask; private PaddedHeadAndTail headAndTail; // mutable struct, don't mark readonly @@ -254,11 +254,13 @@ private static int Length(Span output) /// /// Removes all values from the buffer. /// + /// + /// Not thread safe. + /// public void Clear() { - while (TryTake(out _) != BufferStatus.Empty) - { - } + buffer = new T[buffer.Length]; + headAndTail = new PaddedHeadAndTail(); } } } diff --git a/BitFaster.Caching/Lfu/ConcurrentLfuCore.cs b/BitFaster.Caching/Lfu/ConcurrentLfuCore.cs index 4afd172e..e46333f6 100644 --- a/BitFaster.Caching/Lfu/ConcurrentLfuCore.cs +++ b/BitFaster.Caching/Lfu/ConcurrentLfuCore.cs @@ -137,12 +137,11 @@ public void Clear() { this.Trim(this.Count); - this.readBuffer.Clear(); - this.writeBuffer.Clear(); - lock (maintenanceLock) { this.cmSketch.Clear(); + this.readBuffer.Clear(); + this.writeBuffer.Clear(); } }