From 4d915b6e31a69f8556b456759d55d80c459bb3ad Mon Sep 17 00:00:00 2001 From: Anton Firszov Date: Mon, 26 Feb 2018 21:17:18 +0100 Subject: [PATCH] added comments for the WeakReference stuff --- .../Memory/ArrayPoolMemoryManager.Buffer{T}.cs | 4 ++++ .../Memory/ArrayPoolMemoryManagerTests.cs | 13 ++++++++++--- tests/ImageSharp.Tests/Memory/BufferAreaTests.cs | 2 +- 3 files changed, 15 insertions(+), 4 deletions(-) diff --git a/src/ImageSharp/Memory/ArrayPoolMemoryManager.Buffer{T}.cs b/src/ImageSharp/Memory/ArrayPoolMemoryManager.Buffer{T}.cs index a00ee8c305..d4f58fb6fb 100644 --- a/src/ImageSharp/Memory/ArrayPoolMemoryManager.Buffer{T}.cs +++ b/src/ImageSharp/Memory/ArrayPoolMemoryManager.Buffer{T}.cs @@ -25,6 +25,10 @@ namespace SixLabors.ImageSharp.Memory /// /// A weak reference to the source pool. /// + /// + /// By using a weak reference here, we are making sure that array pools and their retained arrays are always GC-ed + /// after a call to , regardless of having buffer instances still being in use. + /// private WeakReference> sourcePoolReference; public Buffer(byte[] data, int length, ArrayPool sourcePool) diff --git a/tests/ImageSharp.Tests/Memory/ArrayPoolMemoryManagerTests.cs b/tests/ImageSharp.Tests/Memory/ArrayPoolMemoryManagerTests.cs index 805bc908cd..a199bb319d 100644 --- a/tests/ImageSharp.Tests/Memory/ArrayPoolMemoryManagerTests.cs +++ b/tests/ImageSharp.Tests/Memory/ArrayPoolMemoryManagerTests.cs @@ -127,14 +127,21 @@ namespace SixLabors.ImageSharp.Tests.Memory } } - [Fact] - public void ReleaseRetainedResources_ReplacesInnerArrayPool() + [Theory] + [InlineData(false)] + [InlineData(true)] + public void ReleaseRetainedResources_ReplacesInnerArrayPool(bool keepBufferAlive) { IBuffer buffer = this.MemoryManager.Allocate(32); ref int ptrToPrev0 = ref buffer.Span.DangerousGetPinnableReference(); - buffer.Dispose(); + + if (!keepBufferAlive) + { + buffer.Dispose(); + } this.MemoryManager.ReleaseRetainedResources(); + buffer = this.MemoryManager.Allocate(32); Assert.False(Unsafe.AreSame(ref ptrToPrev0, ref buffer.DangerousGetPinnableReference())); diff --git a/tests/ImageSharp.Tests/Memory/BufferAreaTests.cs b/tests/ImageSharp.Tests/Memory/BufferAreaTests.cs index e96aa2e375..db7367d972 100644 --- a/tests/ImageSharp.Tests/Memory/BufferAreaTests.cs +++ b/tests/ImageSharp.Tests/Memory/BufferAreaTests.cs @@ -104,7 +104,7 @@ namespace SixLabors.ImageSharp.Tests.Memory { BufferArea area0 = buffer.GetArea(6, 8, 10, 10); - ref int r = ref area0.GetReferenceToOrigo(); + ref int r = ref area0.GetReferenceToOrigin(); int expected = buffer[6, 8]; Assert.Equal(expected, r);