Skip to content

Commit 36ca20d

Browse files
committed
Reworked WeakReferenceKey.Equals()
1 parent f1a5a9c commit 36ca20d

File tree

2 files changed

+28
-1
lines changed

2 files changed

+28
-1
lines changed

src/Agent/NewRelic/Agent/Extensions/NewRelic.Agent.Extensions/Caching/WeakReferenceKey.cs

Lines changed: 8 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -24,6 +24,13 @@ public override bool Equals(object obj)
2424
{
2525
if (obj is WeakReferenceKey<T> otherKey)
2626
{
27+
if (WeakReference.TryGetTarget(out var thisTarget) &&
28+
otherKey.WeakReference.TryGetTarget(out var otherTarget))
29+
{
30+
return ReferenceEquals(thisTarget, otherTarget);
31+
}
32+
33+
// if one of the targets has been garbage collected, we can still compare the hashcodes
2734
return otherKey.GetHashCode() == _hashCode;
2835
}
2936

@@ -32,7 +39,7 @@ public override bool Equals(object obj)
3239

3340
public override int GetHashCode()
3441
{
35-
return _hashCode;
42+
return WeakReference.TryGetTarget(out var target) ? target.GetHashCode() : _hashCode;
3643
}
3744

3845
/// <summary>

tests/Agent/UnitTests/NewRelic.Agent.Extensions.Tests/Cache/WeakReferenceKeyTests.cs

Lines changed: 20 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -150,6 +150,26 @@ public async Task Equals_ShouldReturnFalseIfTargetIsGarbageCollected()
150150
Assert.That(weakRefKey1.Equals(weakRefKey2), Is.False);
151151
}
152152

153+
[Test]
154+
public async Task GetHashCode_ShouldReturnOriginalHashcodeIfTargetIsGarbageCollected()
155+
{
156+
// Arrange
157+
var weakRefKey = GetWeakReferenceKey();
158+
var originalHashCode = weakRefKey.GetHashCode();
159+
160+
// Act
161+
Assert.That(weakRefKey.Value, Is.Not.Null);
162+
163+
// force garbage collection
164+
GC.Collect();
165+
GC.WaitForPendingFinalizers();
166+
await Task.Delay(500);
167+
GC.Collect(); // Force another collection
168+
169+
// Assert
170+
Assert.That(weakRefKey.Value, Is.Null); // ensure GC really happened
171+
Assert.That(weakRefKey.GetHashCode(), Is.EqualTo(originalHashCode));
172+
}
153173
private class Foo
154174
{
155175
public string Bar { get; set; }

0 commit comments

Comments
 (0)