From a2d2248f3bd2ea9257def07d6f6c745353d70107 Mon Sep 17 00:00:00 2001 From: Alex Peck Date: Tue, 24 Oct 2023 09:29:44 -0700 Subject: [PATCH 1/2] handle null --- BitFaster.Caching.UnitTests/Lru/ConcurrentLruTests.cs | 7 +++++++ BitFaster.Caching/Lru/ConcurrentLruCore.cs | 2 +- 2 files changed, 8 insertions(+), 1 deletion(-) diff --git a/BitFaster.Caching.UnitTests/Lru/ConcurrentLruTests.cs b/BitFaster.Caching.UnitTests/Lru/ConcurrentLruTests.cs index ab2bdbc1..5395700e 100644 --- a/BitFaster.Caching.UnitTests/Lru/ConcurrentLruTests.cs +++ b/BitFaster.Caching.UnitTests/Lru/ConcurrentLruTests.cs @@ -574,6 +574,13 @@ public void WhenValueExpiresItIsDisposed() disposableValueFactory.Items[6].IsDisposed.Should().BeFalse(); } + [Fact] + public void WhenAddingNullValueCanBeAddedAndRemoved() + { + lru.GetOrAdd(1, _ => null).Should().BeNull(); + lru.AddOrUpdate(1, null); + lru.TryRemove(1).Should().BeTrue(); + } [Fact] public void WhenValueEvictedItemRemovedEventIsFired() diff --git a/BitFaster.Caching/Lru/ConcurrentLruCore.cs b/BitFaster.Caching/Lru/ConcurrentLruCore.cs index acb3cd2e..25558fa1 100644 --- a/BitFaster.Caching/Lru/ConcurrentLruCore.cs +++ b/BitFaster.Caching/Lru/ConcurrentLruCore.cs @@ -359,7 +359,7 @@ private void OnRemove(K key, I item) this.telemetryPolicy.OnItemRemoved(key, item.Value, ItemRemovedReason.Removed); // serialize dispose (common case dispose not thread safe) - lock (item.Value) + lock (item) { Disposer.Dispose(item.Value); } From 5700be01dc1dd955848ced2e5bc0f37d0c5ef959 Mon Sep 17 00:00:00 2001 From: Alex Peck Date: Tue, 24 Oct 2023 11:25:41 -0700 Subject: [PATCH 2/2] lfu test --- BitFaster.Caching.UnitTests/Lfu/ConcurrentLfuTests.cs | 10 ++++++++++ 1 file changed, 10 insertions(+) diff --git a/BitFaster.Caching.UnitTests/Lfu/ConcurrentLfuTests.cs b/BitFaster.Caching.UnitTests/Lfu/ConcurrentLfuTests.cs index 796f6e74..b5d5f4a9 100644 --- a/BitFaster.Caching.UnitTests/Lfu/ConcurrentLfuTests.cs +++ b/BitFaster.Caching.UnitTests/Lfu/ConcurrentLfuTests.cs @@ -672,6 +672,16 @@ public void WhenRemovedInWriteBuffer() public void WhenItemDoesNotExistTryUpdateIsFalse() { cache.TryUpdate(1, 2).Should().BeFalse(); + } + + [Fact] + public void WhenAddingNullValueCanBeAddedAndRemoved() + { + // use foreground so that any null ref exceptions will surface + var lfu = new ConcurrentLfu(1, 20, new ForegroundScheduler(), EqualityComparer.Default); + lfu.GetOrAdd(1, _ => null).Should().BeNull(); + lfu.AddOrUpdate(1, null); + lfu.TryRemove(1).Should().BeTrue(); } [Fact]